where子句中的SQL性能问题

时间:2012-09-03 12:18:59

标签: sql sql-server-2008 where-clause database-performance

我在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上添加第三个参数时就出错了。

这怎么会成为一个问题?它是与seond one(Memo-field)相同粒度的选择。

修改

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

备忘录varchar(150)

仅索引:Pack_Division_ID bigint

XML Execution plan

1 个答案:

答案 0 :(得分: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逻辑运算符(命令的含义是什么)