刪除海量資料之全表刪除與部分刪除

2021-09-07 05:38:46 字數 1677 閱讀 2229

刪除海量資料時,如果想要提公升效能,需要考慮的乙個重要因素就是:如何減少日誌操作?

1. 全表刪除

全表刪除的方式通常有3種:drop, truncate, delete

(1) drop/truncate

drop和truncate是ddl操作,日誌量都很少(只有**資料頁的記錄,不記錄頁內每條資料的明細),都釋放所有資料頁,以及重置iam、pfs、gam、sgam中的標誌位,釋放的資料頁可被其他表使用;

所不同的是,drop同時也刪除了系統目錄裡對於表的定義,相應的,表上所有定義的物件:index、constraint、trigger等等也都將被刪除,該錶相關的iam、pfs、gam、sgam頁也將被釋放(不只是重置標誌位);

(2) delete

不帶條件的delete可以用來刪除全表資料,所有被刪除的行都將被記錄日誌,做全表刪除時效率較差,不推薦;

2. 部分刪除

對於表中部分資料做刪除,如果是分割槽表的話,直接truncate分割槽是最好了,即使是用delete刪除分割槽中部分資料,效率也不會太差;

如果不是分割槽表的話:

(1) 刪除表裡少部分資料

直接用delete刪除; 

(2) 刪除表裡大部分資料

匯出所需要保留的少數記錄到臨時表,然後truncate原表,再把臨時表資料導回來;

舉例:

select *into tmp from tab_name 

where date_col > = getdate()-1

truncate table tab_name

insert into tab_name

select *from tmp

drop table tmp

如果不想再把臨時表資料導回來,也可直接刪除原表tab_name,把tmp重新命名為原表名,但不要忘了在tmp上建立原表的物件,如:索引/約束/觸發器等等。

exec sp_rename '

tab_name

', '

tab_name_old

'exec sp_rename

'tmp

', '

tab_name

'--create index/constraint/trigger...on new

tab_name

drop table tab_name_old

(3) 刪除表裡約一半資料

這時,如果表上沒有分割槽的話,就會慢的特別明顯,的確沒什麼好的辦法,只能用delete慢慢刪除。

另外,oracle中的nologging選項,類似於sql server中的bulk_logged恢復模式,在批量資料操作時才有效,比如:select…into(oracle中對應create table as select * from…),create/alter index 等等。並不是任何時候這個選項都有效的。

小結

(1) 海量資料的刪除,盡量選擇日誌量較小的方式進行;

(2) nologging選項/bulk_logged恢復模式,在刪除資料時,派不上用場,通常用在批量匯入或更新資料時。

Hive表刪除表部分資料

1 hive表刪除資料不能使用deletefrom table name 中sql語句 2 hive表刪除資料要分為不同的粒度 table partition partition內 alter table table name drop partition partiton name value i...

hive表如何刪除部分資料

hive 表刪除部分資料不支援使用 delete from table name where 語句 hive表刪除資料要分為不同的粒度 table partition partition內 有分割槽欄位的資料表,刪除資料時要注意分兩種情況 1 根據分割槽刪除資料,可以刪除滿足條件的分割槽,具體 格式...

hive刪除表中部分資料

insert overwrite table table name select from table name where 可以看出,刪除的本質就是覆蓋,選出符合條件的結果重新寫表。1 刪除某個分割槽 alter table table name drop partition dt 2020 09...