1. 程式人生 > >細心很重要---猜猜這個SQL執行的什麼意思

細心很重要---猜猜這個SQL執行的什麼意思

  今天在幫客戶做語句優化的時候,突然遇到這樣一個語句,類似下面的例子(原語句是個update)

  例子中使用AdventureWorks資料中的兩個表。

  productID 是[Production].[Product] 表的主鍵,在[Purchasing].[PurchaseOrderDetail] 中也建立了非聚集索引

select name,(select count(*) from [Purchasing].[PurchaseOrderDetail] where ProductID = ProductID) 
from [Production].[Product]
where
ProductID = 341

-----------------------------------此處請在心中默唸 執行語句的意思,會選擇什麼樣的索引?-----------------------------------------

    首先來看一下 執行計劃

    

    [Purchasing].[PurchaseOrderDetail]  為什麼走索引掃描? 這明顯應該索引查詢啊!

    仔細看一下索引掃描的謂詞

    

    我靠自己和自己匹配去了  ? 和你想的一樣麼?

    修改下程式碼~看看問題的所在

select name,(select count(*) from [Purchasing].[PurchaseOrderDetail] 

where ProductID =[Production].[Product].ProductID)
from [Production].[Product] where ProductID = 341

    

    

    這是一個由於粗心而犯下的錯誤,例子中是一個查詢,實際中卻是一個update 影響可想而知,而這個影響在儲存過程中久久沒能發現,要不是優化查看了執行計劃關係開銷,我掃一眼程式碼也想當然的覺得完全沒問題!

    問題得到解決,即解決的語句執行速度慢的問題,又找出了程式的BUG。

    總結: 細心很重要!