細心很重要---猜猜這個SQL執行的什麼意思
阿新 • • 發佈:2018-12-30
今天在幫客戶做語句優化的時候,突然遇到這樣一個語句,類似下面的例子(原語句是個update)
例子中使用AdventureWorks資料中的兩個表。
productID 是[Production].[Product] 表的主鍵,在[Purchasing].[PurchaseOrderDetail] 中也建立了非聚集索引
select name,(select count(*) from [Purchasing].[PurchaseOrderDetail] where ProductID = ProductID) from [Production].[Product] whereProductID = 341
-----------------------------------此處請在心中默唸 執行語句的意思,會選擇什麼樣的索引?-----------------------------------------
首先來看一下 執行計劃
[Purchasing].[PurchaseOrderDetail] 為什麼走索引掃描? 這明顯應該索引查詢啊!
仔細看一下索引掃描的謂詞
我靠自己和自己匹配去了 ? 和你想的一樣麼?
修改下程式碼~看看問題的所在
select name,(select count(*) from [Purchasing].[PurchaseOrderDetail]
where ProductID =[Production].[Product].ProductID)
from [Production].[Product] where ProductID = 341
這是一個由於粗心而犯下的錯誤,例子中是一個查詢,實際中卻是一個update 影響可想而知,而這個影響在儲存過程中久久沒能發現,要不是優化查看了執行計劃關係開銷,我掃一眼程式碼也想當然的覺得完全沒問題!
問題得到解決,即解決的語句執行速度慢的問題,又找出了程式的BUG。
總結: 細心很重要!