如何在 SQL SERVER 中快速有條件刪除海量數(shù)據(jù)
更新時(shí)間:2006年12月21日 00:00:00 作者:
最近有個(gè)朋友問我,他說他在SQLSERVER刪除幾百萬到幾千萬數(shù)據(jù)是顯的很慢,幫他分析了一下,提了一些以下意見,或許對很多人有用。
如果你的硬盤空間小,并且不想設(shè)置數(shù)據(jù)庫的日志為最小(因?yàn)橄M渌5娜罩鞠M匀挥涗?,而且對速度要求比較高,并清除所有的數(shù)據(jù)建議你用turncate table1,因?yàn)閠runcate 是DDL操作,不產(chǎn)生rollback,不寫日志速度快一些,然后如果有自增的話,恢復(fù)到1開始,而delete會產(chǎn)生rollback,如果刪除大數(shù)據(jù)量的表速度會很慢,同時(shí)會占用很多的rollback segments,同時(shí)還要記錄下G級別的日志 ;當(dāng)然如果有條件刪除比如where time〈'2006-3-10' 怎么辦,能不能不記錄日志用delete,回答是不行的,SQL Server 引擎在設(shè)計(jì)上就會對 Delete 操作進(jìn)行日志記錄。至今沒有辦法強(qiáng)制制定某一些語句不記錄到日志中,如果在執(zhí)行 Delete Table1 where Time 〈 '2006-3-10' 由于涉及的記錄比較多,所以日志記錄也相應(yīng)很大(3-4G),如果可行,我建議用以下方式:
選出您所需要保留的記錄到新的表。如果您使用 Full Recovery Mode
根據(jù)SELECT INTO的記錄數(shù),日志可能會比較大
Select * into Table2 From Table1 Where Time 〉 = '2006-03-10'
然后直接Truncate Table1。無論何種恢復(fù)模式都不會進(jìn)行日志記錄:Truncate table Table1
最后對Table2進(jìn)行改名為Table1:EC sp_rename 'Table2', 'Table1'
如果你的硬盤空間小,并且不想設(shè)置數(shù)據(jù)庫的日志為最小(因?yàn)橄M渌5娜罩鞠M匀挥涗?,而且對速度要求比較高,并清除所有的數(shù)據(jù)建議你用turncate table1,因?yàn)閠runcate 是DDL操作,不產(chǎn)生rollback,不寫日志速度快一些,然后如果有自增的話,恢復(fù)到1開始,而delete會產(chǎn)生rollback,如果刪除大數(shù)據(jù)量的表速度會很慢,同時(shí)會占用很多的rollback segments,同時(shí)還要記錄下G級別的日志 ;當(dāng)然如果有條件刪除比如where time〈'2006-3-10' 怎么辦,能不能不記錄日志用delete,回答是不行的,SQL Server 引擎在設(shè)計(jì)上就會對 Delete 操作進(jìn)行日志記錄。至今沒有辦法強(qiáng)制制定某一些語句不記錄到日志中,如果在執(zhí)行 Delete Table1 where Time 〈 '2006-3-10' 由于涉及的記錄比較多,所以日志記錄也相應(yīng)很大(3-4G),如果可行,我建議用以下方式:
選出您所需要保留的記錄到新的表。如果您使用 Full Recovery Mode
根據(jù)SELECT INTO的記錄數(shù),日志可能會比較大
Select * into Table2 From Table1 Where Time 〉 = '2006-03-10'
然后直接Truncate Table1。無論何種恢復(fù)模式都不會進(jìn)行日志記錄:Truncate table Table1
最后對Table2進(jìn)行改名為Table1:EC sp_rename 'Table2', 'Table1'
相關(guān)文章
大數(shù)據(jù)量分頁存儲過程效率測試附測試代碼與結(jié)果
在項(xiàng)目中,我們經(jīng)常遇到或用到分頁,那么在大數(shù)據(jù)量(百萬級以上)下,哪種分頁算法效率最優(yōu)呢?我們不妨用事實(shí)說話。2010-07-07SQL Server 2016的數(shù)據(jù)庫范圍內(nèi)的配置詳解
這篇文章主要介紹了SQL Server 2016的數(shù)據(jù)庫范圍內(nèi)的配置詳解的相關(guān)資料,需要的朋友可以參考下2016-03-03sqlserver游標(biāo)使用步驟示例(創(chuàng)建游標(biāo) 關(guān)閉游標(biāo))
這篇文章主要介紹了sqlserver游標(biāo)使用步驟,包括創(chuàng)建游標(biāo)、關(guān)閉游標(biāo),大家參考使用吧2014-01-01sqlserver中向表中插入多行數(shù)據(jù)的insert語句
關(guān)于sql 2000中如何使用insert語句插入多行記錄,可是郁悶壞了我。2010-08-08關(guān)于SQL的幾道小題詳解(sql進(jìn)階)
當(dāng)我們拿到題目的時(shí)候,并不是急于作答,那樣會得不償失的,而是分析思路,采用什么方法,達(dá)到什么目的,還要思考有沒有簡單的方法或者通用的方法等等,這樣才會達(dá)到以一當(dāng)十的效果2015-06-06通過SQL Server的位運(yùn)算功能巧妙解決多選查詢方法
項(xiàng)目中很多業(yè)務(wù)對象的數(shù)據(jù)表中都具有Status字段,有人使用int型保存Status,有人使用varchar型2012-01-01SQL Server誤區(qū)30日談 第12天 TempDB的文件數(shù)和需要和CPU數(shù)目保持一致
TempDB的文件沒有必要分布在多個(gè)存儲器之間。如果你看到PAGELATCH類型的等待,即使你進(jìn)行了分布也不會改善性能,而如果PAGEIOLATCH型的等待,或許你需要多個(gè)存儲器,但這也不是必然-有可能你需要講整個(gè)TempDB遷移到另一個(gè)存儲系統(tǒng),而不是僅僅為TempDB增加一個(gè)文件2013-01-01