激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - 數據庫技術 - 禁用 SQL 游標,告訴你外面聽不到的原因

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

2021-11-08 22:56有關SQLLenis 數據庫技術

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

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

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

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

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

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

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

  1. SETNOCOUNTON;
  2. DECLARE@SalesQuotaKeyBigint
  3. DECLAREMY_CurCursorFor
  4. SELECTTOP1000000SalesQuotaKey
  5. FROMFactSalesQuotaAudit
  6. WHERESalesAmountQuota<500000
  7. ORDERBYSalesAmountQuotaASC
  8. OPENMY_Cur
  9. FETCHNEXTFROMMY_CurINTO@SalesQuotaKey
  10. WHILE(@@FETCH_STATUS=0)
  11. BEGIN
  12. UPDATEFactSalesQuotaAudit
  13. SETSalesAmountQuota=SalesAmountQuota+100000
  14. WHERESalesQuotaKey=@SalesQuotaKey
  15. FETCHNEXTFROMMY_CurINTO@SalesQuotaKey
  16. END
  17. CLOSEMY_Cur
  18. DEALLOCATEMY_Cur

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

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

  1. CREATEUniqueCLUSTEREDindexPK_SalesQuotaKey
  2. ONFactSalesQuotaAudit(SalesQuotaKey)
  3. CREATEINDEXIDX_SALES_AMT_QUTA
  4. ONFactSalesQuotaAudit(SalesAmountQuota)

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

  1. SELECTTOP1000000SalesQuotaKey
  2. FROMFactSalesQuotaAudit
  3. WHERESalesAmountQuota<500000
  4. ORDERBYSalesAmountQuotaASC

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

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

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

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

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

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

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

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

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

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

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

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

  1. SELECTCOUNT(*)
  2. FROMFactSalesQuotaAuditWITH(NOLOCK)
  3. WHERESalesAmountQuota<500000

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

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

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

"那什么是 Halloween 問題?"

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

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

  1. updateEmployee
  2. SetSalary=Salary*(1+10%)
  3. whereSalary<25000

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

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

原文鏈接:https://mp.weixin.qq.com/s/vDVj0KotzhqRcwFOf5uQaA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产精 | 久久色播| 亚洲国产精品一区 | 国产成年人在线观看 | 国产毛片网 | 黄色一级片在线观看 | 一区二区三区欧洲 | 伊人成人免费视频 | 国产一区日韩一区 | 久久精品亚洲精品国产欧美kt∨ | 成人在线免费视频播放 | 鸳鸯谱在线观看高清 | 性爱视频在线免费 | 国产乱一区二区三区视频 | 日韩午夜片 | 精品99在线视频 | 久久综合综合 | 一区二区久久久久草草 | 亚洲成人网一区 | 国产九九热| 黄色网址在线免费 | 黄色av.com| 一区二区三区欧美精品 | 在线看91| 欧美精品免费一区二区三区 | av在线免费看片 | 日操操夜操操 | 一级免费黄色免费片 | 国产一区二区午夜 | 久久777国产线看观看精品 | 午夜精品小视频 | 综合网天天色 | 成人在线视频精品 | 日韩黄色影视 | 久久草在线视频国产 | 欧美一级片网站 | 中文在线观看免费视频 | 欧美乱论 | 91看片.| 免费一级在线 | 久久久www成人免费精品 |