このクエリに注文を追加すると、それなしよりも速く戻りますが、なぜですか?

dba.stackexchange https://dba.stackexchange.com/questions/634

  •  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試合を見つける前に、サブクエリを頻繁に実行する必要があります。

(私はそれを想定しています csはそうあるべきです xSまたはその逆、それ以外の場合、クエリはエイリアスとして実行されません c どこにも定義されていません)

「実際のクエリプラン」ビューがオンになっているマネジメントスタジオでそのようなクエリを実行する価値があります。次に、どのパーツが異なるパフォーマンスを引き起こしているかを図から見ることができます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top