oracle定期生成和刪除表分割槽

2021-07-07 02:14:20 字數 2742 閱讀 1062

在專案中我們有個乙個表是秒資料表,這個表每天插入的資料量都有800多萬條,所以我們只儲存一段時間的資料,半個月之前的資料就會刪除掉,這樣當我們查詢當前即時的資料來繪製圖表的時候就會出現問題:oralce的高水位線的問題。

在oracle裡,使用delete刪除資料以後,資料庫的儲存容量不會減少,而且使用delete刪除某個表的資料以後,查詢這張表的速度和刪除之前一樣,不會發生變化。 

因為oralce有乙個hwm高水位,它是oracle的乙個表使用空間最高水位線。當插入了資料以後,高水位線就會**,但是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。除非使用truncate刪除資料。那麼,這條高水位線在日常的增刪操作中只會**,不會**,所以資料庫容量也只會上公升,不會下降。而使用select語句查詢資料時,資料庫會掃瞄高水位線以下的資料塊,因為高水位線沒有變化,所以掃瞄的時間不會減少,所以才會出現使用delete刪除資料以後,查詢的速度還是和delete以前一樣。

在網上查了下,決定用表分割槽來解決這個問題,方案就是每天定期新建表分割槽,同時刪除舊的表分割槽。

首先,新建表和分割槽

create table "dataserver"."svrsensordata" 

("id" number(*,0) default 0 not null enable, 

"ssid" number(*,0) default 0 not null enable, 

"type" number(*,0) default 0 not null enable, 

"value" binary_double default 0, 

"time" timestamp (3) not null enable, 

)partition by range (time)  --以time欄位做分割槽條件

(partition sdp_20140302 values less than (to_date('2014/03/02','yyyy/mm/dd')),

partition sdp_20140303 values less than (to_date('2014/03/03','yyyy/mm/dd')),

partition sdp_20500101 values less than (maxvalue)

);這裡新建了表和表分割槽,然後要做的就是每天都新建乙個新的表分割槽。  

建立新增新錶分割槽的儲存過程

create or replace

procedure svrsensordata_addpart(

daysamount number  --要新增多少天之後的分割槽)as

v_sqlexec varchar2(2000); --ddl語句變數

v_partname varchar2(20);--建立分割槽的日期(yyyymmdd)

v_partdatestr varchar2(20);--分割槽時間的字串形式

begin

v_partname:= 'sdp_' +to_char(sysdate +  daysamount,'yyyymmdd');

v_partdatestr:= to_char(sysdate +  daysamount, 'yyyy-mm-dd');

v_sqlexec:='alter table svrsensordata split partition sdp_20500101 at (to_date('||v_partdatestr||',''yyyy-mm-dd'')) into  (partition '||v_partname||', partition sdp_20500101)';

dbms_utility.exec_ddl_statement(v_sqlexec);

end svrsensordata_addpart;

建立刪除分割槽的儲存過程

create or replace

procedure svrsensordata_droppart(

daysamount number --刪除間隔日期

) as

v_sqlexec varchar2(2000); --ddl語句變數

--先查詢daysamount之前的表分割槽

cursor cursor_part is

select partition_name from user_tab_partitions

where table_name= 'svrsensordata' and to_date(substr(partition_name,5,8),'yyyymmdd')< sysdate- daysamount order by partition_name;

cursor_oldpart cursor_part%rowtype;

begin

open cursor_part;

loop

fetch cursor_part into cursor_oldpart;

exit when cursor_part%notfound;

v_sqlexec:='alter table svrsensordata drop partition '||cursor_oldpart.partition_name;

dbms_utility.exec_ddl_statement(v_sqlexec);

end loop;

close cursor_part;

end svrsensordata_droppart;

然後使用oracle job 每天定期執行一次這兩個過程。

aix 設定定期刪除oracle日誌歸檔

size medium b 系統環境 b size b 作業系統 b aix 5.3.0.0 b 資料庫 b 10.2.0 size medium b 設定過程 b size b 設定定時器 b 1.切換到超級使用者 root 並建立oracle使用者定時器,命令如下 執行su命令後請輸入root使...

mysql 定期刪除表中無用資料

mysql5.1.x版本中引入了一項新特性event,定期執行某些事物,這可以幫助我們實現定期執行某個小功能,不在依賴 去實現。我現在有一張表,這張表中的資料有個特點,每天都會有大量資料插入,但是昨天的資料已經不存在一點價值。現在需要在mysql中建立 乙個定時器,每天刪除昨天之前的資料。首選檢視m...

oracle刪除使用者和表空間

oracle 使用時間長會有許多user 和tablespace,導致磁碟被佔滿 如果要刪除user和tablespace 來釋放硬碟空間,可以使用如下命令 step1 刪除user drop user 使用者名稱 cascade 說明 僅刪除了user,還沒有刪除對應的tablespace ste...