2008-09-05 29 views
4

誰もこの動作やその回避方法を説明できますか?このクエリを実行すると内部結合と左結合のためSQLクエリが遅い?

select * 
from TblA 
left join freetexttable (TblB, *, 'query') on TblA.ID = [Key] 
inner join DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID 

それは非常に非常に非常に遅くなります。

左結合の代わりに2つの内部結合を使用するようにそのクエリを変更すると、非常に高速になります。内部結合の代わりに2つの左結合を使用するように変更すると、非常に高速になります。

freetextableの代わりにSQLテーブル変数を使用する場合も同様の現象が発生します。

パフォーマンスの問題は、テーブル変数(またはfreetextable)と、別のデータベースカタログにテーブルがある場合に発生し、一方がインナージョインにあり、もう一方がレフトジョインにあります。

なぜこれが遅いのか、それをスピードアップする方法を知っていますか?

答えて

0

索引結合を実行するために使用するフィールドを指定します。

一般的に参照されるforeignまたはcandidate keysにインデックスを割り当てるのがよいでしょう。

3

「実際の実行計画を表示する」オプションをオンにしてから、減速の原因を詳細に調べる必要があります。 (各結合の上にマウスを置くと詳細が表示されます)インデックス検索を取得し、テーブルスキャンではないことを確認します。

私は、SQLが1つのテーブルからすべてのものをメモリにプルすることによって強制的に1つの結合を実行すると想定しています。あなたがテーブルに加わる順序を逆にすることもまた役立ちます。

7

一般的な経験則は、内側が減少に結果セットの行数を引き起こすJOINをながらOUT​​ERは、増加に結果セット内の行の数を引き起こすJOINをことです。もちろん、その反対も真実であるシナリオはたくさんありますが、そうでない場合よりもこのように動作する可能性が高くなります。パフォーマンスのために実行したいのは、結果セット(作業セット)のサイズを可能な限り小さくすることです。

両方の結合が最初のテーブルで一致するため、順序を変更しても結果の精度には影響しません。あなたはおそらく、LEFT JOINを前に、INNER JOINをやりたいので、:

SELECT * 
FROM TblA 
INNER JOIN DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID 
LEFT JOIN freetexttable (TblB, *, 'query') on TblA.ID = [Key] 

を実際問題として、クエリオプティマイザかかわらず、指定されたご注文そのうち、より高速なオプションを使用するようにコンパイルするために十分にスマートでなければなりません結合のために。ただし、ダンプクエリオプティマイザを使用し、そのクエリ操作が順番に実行されていることを推測することをお勧めします。これは、将来のメンテナが潜在的なエラーやテーブルの性質に関する仮定を発見するのに役立ちます。

オプティマイザは物事を書き直す必要があるため、これは表示されている動作を完全に説明するには十分ではないため、は実行計画を調べるクエリ前述のようにインデックスを追加してください。しかし、これはまだ学ぶ良い原則です。

0

テンポラリテーブルにfreetexttable(TblB, *, 'query')を配置すると、実行計画で繰り返し呼び出される場合に役立ちます。

関連する問題