刪除海量資料時,如果想要提公升效能,需要考慮的乙個重要因素就是:如何減少日誌操作?
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_namewhere 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...