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 に 3 番目の引数を追加すると、うまくいきません。

これがどのように問題になる可能性がありますか?2つ目(メモ欄)と同じ粒度での選択です。

編集:

Status varchar(10) -- 5 つの異なる値を持つことができます

メモ varchar(150)

インデックスのみ: Pack_Division_ID bigint

XML 実行計画

4

1 に答える 1

0

一般に、そこにもう 1 つの列を追加すると、テーブルから最初に読み取る必要があることを意味します。したがって、where 条件がないと、インデックスのみを使用でき、読み取る必要がある行が少なくなるため、集計する行が多くてもクエリが高速になる可能性があります。

EXECUTION PLAN を確認すると、その 2 つの列にインデックスを使用する必要があることが示されています。これにより、ブーストが得られます。

問題のあるステップは次のとおりです。

<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)">

答えは列ステータスの低い「選択性」である可能性があると思います。したがって、3つの値すべてを同時に使用しようとするため、ステータスが最初の2つよりも多くの時間をフィッティングするため、より多くのテストを意味します値。ただし、オプティマイザーが AND 論理演算子とどのように連携するか (順序とは何を意味するのか) は 100% わかりません。

于 2012-09-03T13:05:43.203 に答える