0

我在 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 秒内运行。当我添加前 2 个参数时,它仍然运行良好。但是当我在 Status-field 上添加第三个参数时,它出错了。

这怎么可能是个问题?它是与第二个(备忘录字段)相同粒度的选择。

编辑:

Status varchar(10) -- 可以有 5 个不同的值

备忘录 varchar(150)

唯一索引:Pack_Division_ID bigint

XML 执行计划

4

1 回答 1

0

通常,如果您在其中添加一列,则意味着必须从表中读取它。因此,如果没有 where 条件,您的查询可能会更快,即使它有更多行要聚合,因为它只能使用索引,并且必须读取更少。

如果您检查执行计划,它说您应该在这两列上使用索引,这会给您带来提升。

有问题的步骤在这里:

<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 逻辑运算符一起工作(顺序是什么意思)

于 2012-09-03T13:05:43.203 回答