[英]SQL performance issue in where clause
我正在SQLSERVER 2008上運行查詢。查詢需要4秒鍾來處理。 我不明白為什么要花這么長時間。
SELECT tbl_Operations.Workcenter
,SUM(tbl_Used_Components.Used_Quantity) as CNF_TODAY
FROM tbl_Used_Components
JOIN tbl_Pack_Division on tbl_Pack_Division.Pack_Division_ID =
tbl_Used_Components.Pack_Division_ID
JOIN tbl_Operations on tbl_Operations.Operation_ID = tbl_Pack_Division.Operation_ID
where CONVERT(date, tbl_Pack_Division.Stop_Time) = CONVERT(date, getdate())
AND tbl_Pack_Division.Memo = 'NORMAL'
and tbl_Pack_Division.Status = 'CNF_MACH'
GROUP BY tbl_Operations.Workcenter
問題出在where子句中。 當我運行不帶Where子句的查詢時,它將在0.1秒內運行。 當我添加前兩個參數時,它仍然可以正常運行。 但是,當我在Status-field上添加第三個參數時,它出錯了。
這怎么可能是個問題? 它是與第二個(備注字段)具有相同粒度的選擇。
編輯:
狀態varchar(10)-可以有5個不同的值
備注varchar(150)
唯一索引:Pack_Division_ID bigint
通常,如果在的位置再增加一列,則意味着必須首先從表中讀取該列。 因此,沒有條件的情況下,即使要聚合的行更多,您的查詢也可能會更快,因為它只能使用索引,並且讀取次數更少。
如果檢查執行計划,它說您應該在該兩列上使用一個索引,這將對您有所幫助。
有問題的步驟在這里:
<RelOp AvgRowSize="48" EstimateCPU="0.136774" EstimateIO="1.94831"
EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1"
LogicalOp="Clustered Index Scan" NodeId="6" Parallel="false"
PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="2.08508"
TableCardinality="124197">
<ScalarOperator ScalarString="[MII03].[dbo].[tbl_Pack_Division].[Memo]='NORMAL'
AND [MII03].[dbo].[tbl_Pack_Division].[Status]='CNF_MACH'
AND CONVERT(date,[MII03].[dbo].[tbl_Pack_Division].
[Stop_Time],0)=CONVERT(date,getdate(),0)">
我認為答案可能是“狀態”列中的低“選擇性”,因此,由於它嘗試同時使用所有三個值,因此這意味着現在需要更多測試,因為狀態比前兩個更適合擬合次數價值觀。 但是我不確定100%優化程序如何與AND邏輯運算符配合使用(這意味着順序)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.