使用 SQL 快速刪除數(shù)百萬行數(shù)據(jù)的實踐記錄
描述
刪除表大批量數(shù)據(jù),這是一個比較少的事件。 但在實際的業(yè)務(wù)開發(fā)中或者數(shù)據(jù)測試也會遇到這種情況。比如定期從日志大表中刪除幾百萬的數(shù)據(jù)記錄;刪除表數(shù)據(jù)的方式有多種,操作起來也很簡單。但是這里存在一個問題, 刪除大量行可能會很慢。 并且有可能需要更長的時間,因為另一個會話已鎖定您要刪除的數(shù)據(jù)。
根據(jù)我們所熟知的使用SQL刪除數(shù)據(jù)有三個方式:
1:DELETE,可以添加where條件,速度較慢,鎖表
2:truncate ,會刪除表所有數(shù)據(jù),速度快
3:drop,刪除數(shù)據(jù)以及表結(jié)構(gòu),慎用
實踐
【1】對于truncate 和drop不在本次的討論范圍,雖然這倆種方式很快,但是破壞性太大。注意日常開發(fā)中所有刪除操作必須添加條件。
【2】對于幾十萬以上數(shù)據(jù)的刪除不建議使用DELETE FROM TABLE WHERE的方式,該操作非常耗時,效率很差。
【3】對于大批量數(shù)據(jù)的刪除需求實現(xiàn)可以通過Create-Table-as-Select方式處理,在表中插入行比刪除它們更快。 使用 create-table-as-select (CTAS) 將數(shù)據(jù)加載到新表中的速度更快。
create table table_name_temp select * from source_table where XX=?
通過CTAS將不予刪除的數(shù)據(jù)保留到一個臨時表中,然后再通過SWAP的方式將臨時表作為原表,通過這種方式完成大批量數(shù)據(jù)刪除
【4】個人不建議上述的方式建表,上面的建表方式新表是不會復(fù)制原表的索引結(jié)構(gòu)的,如果這個是一個大表那么后面單獨加索引也是一個問題。建議使用 CREATE TABLE XXX (LIKE XXX);方式建表,這個會復(fù)制相關(guān)的索引結(jié)構(gòu)數(shù)據(jù)
【5】具體操作步驟
-- 復(fù)制表結(jié)構(gòu) CREATE TABLE tableB (LIKE tableA); -- 插入篩選數(shù)據(jù) INSERT into tableB SELECT * from tableA where XXX = ?; -- 重命名,替換 rename table tableA to tableC; rename table tableB to tableA; -- 刪除舊表 DROP TABLE tableC;
注意:其中倆次rename可以先drop然后一次的rename,但是考慮到數(shù)據(jù)安全,畢竟是大數(shù)量數(shù)據(jù)刪除,還是多操作一步,替換后自己檢查下,然后再刪除舊表,穩(wěn)妥些
【6】通過delete刪除上百萬的數(shù)據(jù)耗時不清楚具體耗時,反正自己等待了十多鐘都沒有結(jié)果,通過select * from sys.session WHERE conn_id!=connection_id();
查詢看一直在執(zhí)行。通過上面的方式500萬的數(shù)據(jù)不到1分鐘,還是比較快的。
【7】小技巧,如果你的大表有遞增的ID,刪除的或者保留數(shù)據(jù)的能夠以ID作為劃分的那么select的條件可以通過這里進(jìn)行優(yōu)化,那么操作效率會更快。
【8】如果是oracle,那么還可以使用 alter table … move 來更改存儲行的表空間
alter table tableName move including rows where XXX=?
到此這篇關(guān)于如何使用 SQL 快速刪除數(shù)百萬行數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SQL 刪除數(shù)百萬行數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一步步教你利用Mysql存儲過程造百萬級數(shù)據(jù)
- MySQL數(shù)據(jù)庫10秒內(nèi)插入百萬條數(shù)據(jù)的實現(xiàn)
- MySQL 百萬級數(shù)據(jù)的4種查詢優(yōu)化方式
- MySQL百萬級數(shù)據(jù)量分頁查詢方法及其優(yōu)化建議
- MySQL百萬級數(shù)據(jù)分頁查詢優(yōu)化方案
- java中JDBC實現(xiàn)往MySQL插入百萬級數(shù)據(jù)的實例代碼
- MySQL單表百萬數(shù)據(jù)記錄分頁性能優(yōu)化技巧
- MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
- MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)的問題及解決
- MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)
相關(guān)文章
解決Navicat連接本地sqlserver數(shù)據(jù)庫成功后沒有庫表數(shù)據(jù)的問題
本文主要給大家介紹了如何解決Navicat連接本地sqlserver數(shù)據(jù)庫成功后沒有庫表數(shù)據(jù)的問題,文中有詳細(xì)的原因分析和解決方法,具有一定的參考價值,需要的朋友可以參考下2023-10-10SQL Server 數(shù)據(jù)庫自動執(zhí)行管理任務(wù)
如要讓數(shù)據(jù)庫進(jìn)行自動管理,則管理員需要預(yù)先定義一些可預(yù)測的管理任務(wù)以及這些任務(wù)發(fā)送的條件。2009-03-03mssql server .ldf和.mdf的文件附加數(shù)據(jù)庫的sql語句
mssql server .ldf和.mdf的文件附加數(shù)據(jù)庫的sql語句...2007-07-07SQL Server中的數(shù)據(jù)類型Text與varchar(max)有什么區(qū)別?
在SQL Server中,處理文本數(shù)據(jù)時,我們經(jīng)常會遇到兩種數(shù)據(jù)類型:Text和varchar(max),盡管它們都可以用來存儲大量的文本數(shù)據(jù),如果可能的話,考慮將Text數(shù)據(jù)類型遷移到varchar(max)或nvarchar(max)數(shù)據(jù)類型,以利用新功能和潛在的性能優(yōu)勢2025-03-03delete誤刪數(shù)據(jù)使用SCN號恢復(fù)(推薦)
這篇文章主要介紹了使用scn號恢復(fù)誤刪數(shù)據(jù)問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12SQL server 中 CROSS APPLY的使用及用途
CROSS APPLY是SQL Server中的操作符,用于將表表達(dá)式與外部表連接,它允許在查詢中多次引用外部表的行,并根據(jù)每行動態(tài)生成結(jié)果集,而OUTER APPLY則類似于LEFT JOIN,后者即使子查詢無結(jié)果也會顯示外部表的行,感興趣的朋友跟隨小編一起看看吧2024-11-11sql server 復(fù)制表從一個數(shù)據(jù)庫到另一個數(shù)據(jù)庫
本文將詳細(xì)介紹SQL server 數(shù)據(jù)庫如何把一張表復(fù)制到另一個數(shù)據(jù)庫表中,需要了解更多的朋友可以參考下2012-11-11