このクエリに注文を追加すると、それなしよりも速く戻りますが、なぜですか?
-
16-10-2019 - |
質問
このクエリにソートを追加する理由についてのアイデアは、注文なしよりもかなり速く返されるのですか?私は反対を期待するので、何がこれを実現できるでしょうか?
SELECT TOP (500) r.cID,r.aField,a.Description
FROM dbo.tblR r
inner join dbo.tblA a on r.aID = a.ID
left join dbo.tblX x on x.cID = r.cID
WHERE (ISNULL(x.anotherField,'') <> r.anotherField or x.field3 is null)
and (r.ID=(select max(ID) from tblR where cID = r.cID and
ISNULL(aField,'') <> ''))
and r.cID in (select ID from tblC)
ORDER BY r.cID ASC -- when I comment this line out it runs much slower
実行計画はあまり役に立ちません。
解決
最も明白な原因はそれです (select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
のサブクエリ WHERE
と組み合わせた句 TOP 500
注文することは違いを生み出しています。
どちらの場合でも、それはおそらくすべての行でそのサブクエリを個別に実行しているでしょう。 WHERE
(実際、それは最初に場所の他の部分をチェックするのに十分な明るくなります。なぜなら、それらははるかに安価であるためですが、それでも出会う行の一部でサブクエリを実行します)。推測では、現在C.Cidマッチでソートされているときに上部近くの行の近くにあるため、クエリプランナーがデフォルトで選択する順序で結果を実行するときよりも500試合を見つける前に、サブクエリを頻繁に実行する必要があります。
(私はそれを想定しています c
sはそうあるべきです x
Sまたはその逆、それ以外の場合、クエリはエイリアスとして実行されません c
どこにも定義されていません)
「実際のクエリプラン」ビューがオンになっているマネジメントスタジオでそのようなクエリを実行する価値があります。次に、どのパーツが異なるパフォーマンスを引き起こしているかを図から見ることができます。
所属していません dba.stackexchange