簡體   English   中英

where子句中的SQL性能問題

[英]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

XML執行計划

通常,如果在的位置再增加一列,則意味着必須首先從表中讀取該列。 因此,沒有條件的情況下,即使要聚合的行更多,您的查詢也可能會更快,因為它只能使用索引,並且讀取次數更少。

如果檢查執行計划,它說您應該在該兩列上使用一個索引,這將對您有所幫助。

有問題的步驟在這里:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM