在專案中我們有個乙個表是秒資料表,這個表每天插入的資料量都有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...