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