成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

禁用 SQL 游標,告訴你外面聽不到的原因

運維 數據庫運維
索引是用到了,但是每次更新,更新的那行跑到 IDX_SALES_AMT_QUTA 索引后面去了,導致無限在更新 SalesAmountQuota 的值,直到大于 50萬”L 覺得平時太強調 seek 索引了,但沒有全面透徹的講解索引其實也有好心辦壞事兒的時候。

[[433798]]

文末本文轉載自微信公眾號「有關SQL」,作者Lenis。轉載本文請聯系有關SQL公眾號。

周六清晨,東方剛剛露白。

L 早早來到辦公室,捎帶上最愛的熱焦瑪。今天會是一場苦戰,計劃了兩個月的上線產品,今天發布。他需要極其敏捷的腦子。另外,只要 L 還在喝著咖啡,說明 DB 肯定是沒問題的,也能起到一點安慰軍心的作用吧。所以大事件面前,L 總是拿著星巴克晃悠。誰都猜不到他到底是愛喝,還是臭顯擺。

F 晃著小腦袋過來了,Release 已經開始了 1 小時,按理 DB 部分部署早該完成。這次稍微超過 L 的預期,但沒有告警,大家也就沒有太放心上。直到 F 過來找 L, 低頭問了下:

“L, 有段更新數字的腳本,跑了40多分鐘還沒結束。理論上只有100多萬數據會被更新,花這么長時間,不知道是否正常?”

F 是個五年陳了,該經歷的也都經歷了,如今冒出這么個疑問,L 也是慎重起來。“哪段腳本?”

  1. SET NOCOUNT ON ; 
  2.  
  3.  
  4. DECLARE @SalesQuotaKey Bigint 
  5.  
  6.  
  7. DECLARE MY_Cur Cursor For 
  8. SELECT TOP 1000000 SalesQuotaKey 
  9. FROM FactSalesQuotaAudit  
  10. WHERE SalesAmountQuota<500000 
  11. ORDER BY SalesAmountQuota ASC 
  12.  
  13.  
  14. OPEN MY_Cur   
  15. FETCH NEXT FROM MY_Cur INTO @SalesQuotaKey 
  16.  
  17.  
  18. WHILE(@@FETCH_STATUS = 0 ) 
  19. BEGIN 
  20. UPDATE FactSalesQuotaAudit  
  21. SET SalesAmountQuota = SalesAmountQuota + 100000 
  22.         WHERE SalesQuotaKey = @SalesQuotaKey  
  23.  
  24. FETCH NEXT FROM MY_Cur INTO @SalesQuotaKey  
  25. END 
  26.  
  27.  
  28. CLOSE MY_Cur  
  29. DEALLOCATE MY_Cur 

“嗯,這段貌似會有問題,就看索引是怎么建的”L 常說,trouble shooting 就像是做偵探,有時候,話其實是說給自己聽的,“如果在 SalesAmountQuota 上加索引的話,這就有危險”

“果不其然”,L打開 SSMS窗口,找到了索引定義:

  1. CREATE Unique CLUSTERED  index PK_SalesQuotaKey  
  2. ON FactSalesQuotaAudit(SalesQuotaKey) 
  3.  
  4. CREATE INDEX IDX_SALES_AMT_QUTA  
  5. ON FactSalesQuotaAudit(SalesAmountQuota) 

為保分析無誤,L 還是先看了下現狀:

  1. SELECT TOP 1000000 SalesQuotaKey 
  2. FROM FactSalesQuotaAudit  
  3. WHERE SalesAmountQuota<500000 
  4. ORDER BY SalesAmountQuota ASC 

“目前來看,這段腳本還在繼續跑著”

“但執行計劃顯示正確跑了 SalesAmountQuota 的索引呢?”F 不解

“其實這里真是這個索引惹的禍”

“索引是用到了,但是每次更新,更新的那行跑到 IDX_SALES_AMT_QUTA 索引后面去了,導致無限在更新 SalesAmountQuota 的值,直到大于 50萬”L 覺得平時太強調 seek 索引了,但沒有全面透徹的講解索引其實也有好心辦壞事兒的時候。所以索引要給 F 畫個腦圖:

“更新完的數據又排回索引了,而游標一直在往前讀滿足條件的數據,你可以細想下這個有趣的過程”看到 F 頻頻點頭,L 自以為已經講的很明晰了。

"終于跑完了," F 眼見監控 Dashboard 上的那個超長 session 消失了,臉色也開始和悅起來。

“大錯即將發生”L 一盆冷水澆過去,F 又不惑,90后小姑娘的臉色,真是跟天氣一樣,瞬間都能千變萬化。

  1. SELECT COUNT(*)  
  2. FROM FactSalesQuotaAudit WITH(NOLOCK) 
  3. WHERE SalesAmountQuota<500000 

“你看,結果是0,肯定不是你想要的結果吧。你原意肯定是在不滿50萬額度的那些銷售上,再加十萬,現在全部都加到了50萬。這是典型的 Halloween 問題”

“那,怎么辦?”F 面對這段讓她面紅耳赤的游標,簡直奔潰

“用臨時表,先把數據更新對了,再找最優解決方法”

"那什么是 Halloween 問題?"

故事發生在 50年前的一個晚上,1970年左右,IBM 的一群研究員決定給不滿25000美金年薪的雇員,增加10% 的薪水。

他們寫了一段 SQL,大意是這樣的:

  1. update Employee 
  2. Set Salary = Salary * (1 + 10%) 
  3. where Salary < 25000 

結果等他們運行完畢,發現所有的年薪不滿 25000 美金的雇員,他們的薪水統統加到了 25000.

 

例如,原本是 15000薪水的雇員和 8000 美金年薪的雇員,他們的薪水更新完了之后,都到了25000 美金。這一天正好是 10月31日,Halloween Day. 所以被稱為 Halloween Problem.

 

責任編輯:武曉燕 來源: 有關SQL
相關推薦

2013-12-09 13:22:58

2015-11-06 09:41:03

圖標可視化

2019-11-28 08:59:03

SQL注入網絡攻擊網絡安全

2014-11-03 09:21:21

戴爾

2020-12-04 15:07:44

比特幣區塊鏈技術

2020-02-24 12:34:21

JuliaPython編程語言

2020-11-18 19:25:01

2011-08-01 14:33:44

SQL

2022-06-29 08:32:04

游標MySQL服務器

2013-12-22 23:20:04

田溯寧亞信企業

2012-07-03 16:56:12

Hadoop

2019-08-28 08:08:47

數據科學家數據工程師數據科學

2017-09-28 10:02:19

數據庫ArangoDB多模型

2019-12-30 22:24:50

大數據機器學習文章

2021-10-09 20:41:32

人工智能AI安防監控

2011-07-07 09:47:33

2012-11-01 10:59:38

桌面虛擬化

2011-07-07 09:38:50

2011-06-30 09:37:08

JavaDB2SQL

2010-09-08 16:48:27

SQL循環游標
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人动漫一区二区 | 高清国产午夜精品久久久久久 | 久在草 | 日韩天堂av| 国产乱码精品一区二区三区五月婷 | 久久久久久久久久久高潮一区二区 | 九七午夜剧场福利写真 | 国产亚洲精品久久久久久豆腐 | 日韩久草 | 国产美女久久 | 国产精品无码久久久久 | 成人h动漫亚洲一区二区 | 亚洲一区中文字幕在线观看 | 日日淫| av在线播放免费 | 成人午夜免费在线视频 | 欧美色综合天天久久综合精品 | 91私密视频| 精品久久久久久久久久久久 | 久久久久九九九女人毛片 | 97视频在线观看免费 | 日韩欧美中文字幕在线观看 | 成人九色 | 国产高清久久久 | 日日干日日 | 国产成人精品亚洲日本在线观看 | 天天干视频 | 亚洲欧美在线观看 | 国产乱码精品1区2区3区 | 手机三级电影 | 欧美视频二区 | 九九九国产| 免费国产视频在线观看 | 天堂一区| 久草视频网站 | 国产原创在线观看 | 精品日韩在线 | 国产成人a亚洲精品 | av色站 | 国产91色在线 | 亚洲 | 在线免费观看黄色 |