亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

曲演雜壇--一條DELETE引發的思考

2024-07-21 02:48:44
字體:
來源:轉載
供稿:網友
曲演雜壇--一條DELETE引發的思考

場景介紹:

我們有一張表,專門用來生成自增ID供業務使用,表結構如下:

CREATE TABLE TB001(    ID INT IDENTITY(1,1) PRIMARY KEY,    DT DATETIME)

每次業務想要獲取一個新ID,就執行以下SQL:

INSERT INTO TB001(DT)SELECT GETDATE();SELECT @@IDENTITY

由于這些數據只需保留最近一天的數據,因此建立一個SQL作業來定期刪除數據,刪除腳本很簡單:

DELETE TOP(10000) FROM TB001WHERE DT<GETDATE()-1

作業每10秒運行一次,每天運行2個小時,最大能刪除數據720W數據。

問題:

由于前臺頁面沒有防刷機制,有惡意用戶使用程序攻擊,造成每天數據量暴增近1億(是不是我也可以出去吹下NB!!!),當前作業無法刪除這么龐大的數據,得進行調整.

解決思路:

在保證程序不修改的前提下,我們首先想到的辦法是:

1:提高單次刪除的數量,會造成鎖阻塞,阻塞嚴重就會影響到業務,這無法接受;

2:延長整個作業運行周期,研發人員擔心影響白天正常業務,要求作業只能夜里低峰區進行

3:提高刪除頻率,可以考慮,但具體頻率需要測試

由于方法2只能少量的增加,因此我們集中在方法3的測試上,由于SQL Agent Job的最小周期是10秒,因此在作業調用的腳本上修改,每次作業調用多條刪除語句,刪除語句中間使用WAITFOR來間歇執行:

DELETE FROM TB001WHERE DT<GETDATE()-1WAITFOR DELAY '0:0:05'DELETE FROM TB001WHERE DT<GETDATE()-1

測試運行時,發現對業務影響不大,因此就上線修改。

結果半夜作業運行后,研發立即收到報警,程序訪問延時嚴重,到服務器上一查,鎖等待超過500000多毫秒,sys.dm_exec_requests中顯示有300多回話等待同一個鎖資源,停掉作業后程序立馬回復正常。

讓我們來測試下這是為啥呢?

首先準備測試數據

CREATE TABLE TB001(    ID INT IDENTITY(1,1) PRIMARY KEY,    DT DATETIME)GOINSERT INTO TB001(DT)SELECT GETDATE()-1 FROM SYS.all_columnsGOINSERT INTO TB001SELECT GETDATE()-1 FROM TB001GO 13

然后嘗試刪除數據

BEGIN TRANDELETE TOP(10000)  FROM TB001WHERE DT<GETDATE()-1

查看鎖情況:

--上面事務的回話ID為55sp_lock 55

單次刪除數據太大,造成表鎖,阻塞程序插入數據,解決辦法:調整單次刪除數量

PS: SQL SERVER會在行集上獲得5000個鎖時嘗試鎖升級,同時也會在內存壓力下嘗試鎖升級。

于是我們只能嘗試更高的刪除頻率和更小的刪除批量,于是將刪除代碼修改如下:

DECLARE @ID INTSET @ID=0WHILE(@ID<100)BEGINDELETE TOP(100)  FROM TB001WHERE DT<GETDATE()-1WAITFOR DELAY '0:0:00:400'SET @ID=@ID+1END

PS: 刪除100行只是一個嘗試值,應該沒有一個最優的刪除行數,牛逼的解釋是設置該值需考慮:刪除需要掃描多少頁面/執行多次時間/表上索引數量/寫入多少日志/鎖與阻塞等等,不裝逼的解釋就是多測試直到達到滿足需求的值就好。假設平均刪除90行數據會寫60k的日志,你刪除100行導致需要兩次物理寫,這是何必呢?

使用修改后的版本測試了下,速度飛快,人生如此美好,哪還等啥,更新到生產服務器上,讓暴風雨來得更猛烈些吧?。?!

果然,這不是人生的終點,悲劇出現了,執行不穩定,本來40秒能執行完的SQL,有時候需要4分鐘才能完成,這不科學啊,我都測試好幾遍的呢?。?!

細細看看語句,不怪別人,自己寫的SQL垃圾,沒辦法,在看一遍代碼:

DELETE TOP(100)  FROM TB001WHERE DT<GETDATE()-1

這是按照業務邏輯寫的,沒有問題,但是的但是,DT上沒有索引,由于表中DT和ID都是順序增長的,按照主鍵ID的升序掃描,排在最前面的ID最小,其插入時間也最早,也是我們刪除的目標,因此只需要幾次邏輯讀便可以輕松找到滿足條件的100行數據,因此消耗也最小,但是理想很豐滿,現實很骨感,

在頻繁地運行DELETE語句后,使用SET STATISTICS IO ON來查看,同樣的執行計劃:

但是造成的邏輯IO完全不一樣,從4次到幾千次,此現象在高頻率刪除下尤其明顯(測試時可以連續運行10000次刪除查看)

嘗試其他寫法,強制走ID索引掃描:

DECLARE @ID INTSET @ID=0WHILE(@ID<10000)BEGIN;WITH T1 AS(SELECT TOP(100)* FROM TB001WHERE DT<GETDATE()-1ORDER BY ID)DELETE FROM T1SET @ID=@ID+1END

測試發現依然是同樣問題,難道無解么?

再次研究業務發現,我們可以查出一個要要刪除的最大ID,然后刪除小于這個ID的數據,而且可以避免一個潛在風險,由于DT沒有索引,當一天前的數據被清除后,如果作業繼續運行,要查找滿足條件的100行數據來進行刪除,便會對表進行一次全表掃描,消耗更龐大數量的邏輯IO。

DECLARE @MaxID INTSELECT @MaxID=MAX(ID) FROM TB001 WITH(NOLOCK)WHERE DT<GETDATE()DECLARE @ID INTSET @ID=0WHILE(@ID<10000)BEGIN;WITH T1 AS(SELECT TOP(100)* FROM TB001WHERE ID<@MaxIDORDER BY ID)DELETE FROM T1SET @ID=@ID+1END

從邏輯IO上看,性能沒有明顯提升,但是從CPU的角度來看,CPU的使用明顯降低,猜測有兩方面原因:1:日期比較消耗要大于INT(日期類似浮點數的存儲,處理需要消耗額外的CPU資源)

2:由于ID索引排序的原因,可能不需要對頁的所有數據逐行比較來判斷這些數據是否滿足條件(個人猜測,請勿當真)

由于ID是自增連續的,雖然可能有因為事務回滾或DBA干預導致不連續的情況,但這不是重點,重點是我們不一定要每次都刪除100行數據,因此我們可以按ID來進行區間刪除,拋棄TOP的方式:

DECLARE @MaxID INTDECLARE @MinID INTSELECT @MaxID=MAX(ID),@MinID=MIN(ID)FROM TB001 WITH(NOLOCK)WHERE DT<GETDATE()-1DECLARE @ID INTSET @ID=0WHILE(@ID<10000)BEGINDELETE  FROM TB001WHERE ID>=@MinID+@ID*100AND ID<@MinID+(@ID+1)*100AND ID<@MaxIDSET @ID=@ID+1END

測試發現,每次刪除的邏輯IO都很穩定且消耗很低,這才是最完美的東東?。?!

--=======================================================

總結:

本來看似一個很簡單的SQL,需要考慮很多方面,各種折騰,各種困惑,多看點基礎原理的資料,沒有壞處;大膽猜測,謹慎論證,多測試是驗證推斷的唯一辦法;

提點額外話:

1. 關于業務:在很多時候,DBA不了解業務就進行優化,是很糟糕的事情,而且很多優化的最佳地方是程序而不是數據庫,敢于否定開發人員所謂的“業務需求”也是DBA的一項必備技能。有一次優化發現,開發對上千萬數據排序分頁,問詢開發得到答復“用戶沒有輸入過濾條件”,難道用戶不輸入就不能設置點默認條件么?如果用戶查詢最新記錄,我們可以默認值查詢最近三天的數據。

2. 關于場景:有一些初學者,很期望獲得一些絕對性的推論,而不考慮場景的影響,且缺乏測試,武斷地下結論,這同樣是很可怕的事情,適合你場景的解決方案,才是最佳的解決方案。

遺留問題:

1. 針對本文提到的業務場景,還有一些其他解決方案,比如分區方式,定期進行分區切換再刪除數據,又比如使用SQL SERVER 2012中新增的“序列”;

2. 猜測上面所提到的問題根源是SQL Server刪除行的實現方式,在刪除時僅標示數據行被刪除而不是真正的從頁面刪除,在高頻率不間斷地刪除過程中,這些數據頁沒有被及時回收刪除掉,

SQL Server掃描了“本該”刪除的數據頁,造成邏輯讀較高;而使用ID的區間范圍查找,可以避免掃描到這些數據頁,直接移動到真正需要訪問的數據頁;當刪除頻率較低時(比如3秒刪除一次),這種問題就不會出現。

--=============================

依舊是妹子:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久国色av免费观看性色| 精品夜色国产国偷在线| 按摩亚洲人久久| 欧美美女18p| 91色视频在线观看| 91精品久久久久久久久久另类| 欧美亚洲午夜视频在线观看| 91精品综合视频| 欧美大胆在线视频| 日韩中文字幕不卡视频| 国产精品视频网址| 欧美激情亚洲国产| 亚洲成人aaa| 欧美xxxwww| 国产亚洲精品91在线| 欧美日本啪啪无遮挡网站| 久久综合免费视频影院| 亚洲天堂久久av| 久久99精品久久久久久噜噜| 欧美成人精品在线视频| 久久综合网hezyo| 久久久免费电影| 91福利视频在线观看| 国产婷婷色综合av蜜臀av| 911国产网站尤物在线观看| 日韩欧美亚洲范冰冰与中字| 国产精品吴梦梦| 国产精品女人网站| 91精品在线观看视频| 丁香五六月婷婷久久激情| 久久国产精品久久久| 国产精品海角社区在线观看| 亚洲精品国产欧美| 欧美国产亚洲精品久久久8v| 国产欧美精品久久久| 亚洲成人激情图| 亚洲人成在线观看| 色综合久久天天综线观看| 日本老师69xxx| 1769国内精品视频在线播放| 欧美电影免费观看高清完整| 欧美日韩成人网| 亚洲美女视频网站| 国产日韩欧美在线| 国产精品久久久久不卡| 亚洲欧美日韩一区二区在线| 国产精品99久久久久久久久久久久| 欧美激情性做爰免费视频| 久久免费国产视频| 欧美成人激情视频免费观看| xvideos亚洲| 亚洲日韩第一页| 国模精品视频一区二区| 午夜欧美大片免费观看| 国产免费一区二区三区在线能观看| 欧美黄网免费在线观看| www.亚洲天堂| 亚洲精品美女在线观看| 黑人巨大精品欧美一区二区| 久久久国产精品一区| 热草久综合在线| 日韩精品www| 国产97在线|日韩| 国产亚洲精品一区二区| 久久久久久久久久国产精品| 亚洲r级在线观看| 亚洲一区二区久久久久久久| 97色在线视频观看| 国产亚洲欧美另类中文| 理论片在线不卡免费观看| 欧美精品videosex性欧美| 97高清免费视频| 国产精品一区久久久| 欧美伊久线香蕉线新在线| 久久免费精品日本久久中文字幕| 欧美日韩成人在线观看| 欧美午夜女人视频在线| 国产精品午夜国产小视频| 九九视频直播综合网| 日韩a**站在线观看| 亚洲免费视频在线观看| 欧美日韩国产精品一区二区三区四区| 欧美日韩国产影院| 欧美一区视频在线| 成人写真视频福利网| 亚洲www在线| 久久久亚洲精品视频| 亚洲丝袜av一区| 国产欧美一区二区三区在线| 精品香蕉一区二区三区| 最近2019中文免费高清视频观看www99| 98精品国产高清在线xxxx天堂| 国外成人免费在线播放| 国产精品成人观看视频国产奇米| 日韩欧美成人精品| 成人av资源在线播放| 国产精品 欧美在线| 精品亚洲一区二区三区在线播放| 国产精品美女www爽爽爽视频| 国产成人综合一区二区三区| 欧美日韩成人网| 亚洲欧美日韩成人| 国产精品免费久久久久久| 国产成人免费av电影| 97在线精品视频| 国产偷国产偷亚洲清高网站| 日韩av黄色在线观看| 中文欧美日本在线资源| 8x拔播拔播x8国产精品| 国产精品自在线| 亚洲免费影视第一页| 欧美成aaa人片免费看| 久久99国产精品自在自在app| 欧美激情视频网站| 欧美做爰性生交视频| 欧美视频一区二区三区…| 亚洲日本aⅴ片在线观看香蕉| 亚洲第一男人av| 欧美一级大胆视频| 精品国产美女在线| 中文字幕免费精品一区| 日韩日本欧美亚洲| 亚洲福利视频网| 久久手机精品视频| 久久全球大尺度高清视频| 国产精自产拍久久久久久| 欧美专区福利在线| 国产精品视频yy9099| 日本久久久久亚洲中字幕| 色妞在线综合亚洲欧美| 欧美日韩中文字幕日韩欧美| 热99在线视频| 欧美日韩在线另类| 亚洲国产精品久久久久秋霞蜜臀| 热re99久久精品国产66热| 国产在线高清精品| 亚洲美女激情视频| 美女视频黄免费的亚洲男人天堂| xxxxx91麻豆| 精品香蕉一区二区三区| 久久免费精品日本久久中文字幕| 亚洲日韩欧美视频| 国产一区二区三区在线观看视频| 国产欧美久久一区二区| 日韩精品福利在线| 欧美在线日韩在线| 97超级碰在线看视频免费在线看| 中文字幕亚洲天堂| 国产啪精品视频网站| 夜色77av精品影院| 亚洲天堂久久av| 日韩精品在线电影| 亚洲一区二区在线播放| 成人av.网址在线网站| 麻豆乱码国产一区二区三区| 日韩在线观看免费高清| 成人免费在线视频网站| 中文字幕av一区二区三区谷原希美| 日韩精品在线私人| 色综合色综合久久综合频道88| 亚洲精品自拍视频| 91精品国产沙发| 精品中文字幕在线2019| 亚洲视屏在线播放|