10

2つのフルテキストインデックステーブルに依存する単純なクエリがありますが、CONTAINSを追加のOR検索と組み合わせると、実行速度が非常に遅くなります。実行プランに見られるように、2つの全文検索はパフォーマンスを押しつぶします。CONTAINSの1つだけでクエリを実行するか、どちらも使用しない場合、クエリは1秒未満ですが、ORをミックスに追加すると、クエリの運命が悪くなります。

2つのテーブルは特別なものではなく、幅が広すぎず(一方に42列、もう一方に21列、それぞれに10列がFTインデックス付けされている可能性があります)、非常に多くのレコードが含まれています(2つのうち最大のもので36kレコード)。

2つのCONTAINS検索を独自のSELECTクエリに分割し、次に3つをUNIONすることで、パフォーマンスを解決することができました。このUNIONの回避策は私の唯一の希望ですか?

SELECT     a.CollectionID
FROM       collections    a
INNER JOIN determinations b ON a.CollectionID = b.CollectionID 
WHERE      a.CollrTeam_Text LIKE '%fa%'
           OR CONTAINS(a.*, '"*fa*"')
           OR CONTAINS(b.*, '"*fa*"')

実行計画:

実行計画

4

4 に答える 4

6

同等の CONTAINSTABLE への LEFT JOIN のパフォーマンスが向上するかどうかを知りたいと思います。何かのようなもの:

SELECT     a.CollectionID
FROM       collections    a
INNER JOIN determinations b ON a.CollectionID = b.CollectionID 
LEFT JOIN CONTAINSTABLE(a, *, '"*fa*"') ct1 on a.CollectionID = ct1.[Key]
LEFT JOIN CONTAINSTABLE(b, *, '"*fa*"') ct2 on b.CollectionID = ct2.[Key]
WHERE      a.CollrTeam_Text LIKE '%fa%'
           OR ct1.[Key] IS NOT NULL
           OR ct2.[Key] IS NOT NULL
于 2010-05-25T18:19:31.597 に答える
3

UNION私はそれぞれに独自の質問として提案するつもりでしたが、あなたの質問を読んだときに、あなたがそれを見つけたことがわかりました。これ以上の方法は考えられないので、それが役に立ったら。このUNION方法は、パフォーマンスの低いクエリに対する一般的なアプローチであり、それぞれが単独でうまく機能するいくつかのOR条件があります。

于 2010-05-25T17:27:35.013 に答える
1

私はおそらくUNIONを使用するでしょう。あなたが本当にそれに反対しているなら、あなたは次のようなことを試すかもしれません:

SELECT a.CollectionID
FROM collections a
  LEFT OUTER JOIN (SELECT CollectionID FROM collections WHERE CONTAINS(*, '"*fa*"')) c
    ON c.CollectionID = a.CollectionID
  LEFT OUTER JOIN (SELECT CollectionID FROM determinations WHERE CONTAINS(*, '"*fa*"')) d
    ON d.CollectionID = a.CollectionID
WHERE a.CollrTeam_Text LIKE '%fa%'
   OR c.CollectionID IS NOT NULL
   OR d.CollectionID IS NOT NULL
于 2010-05-25T17:41:53.420 に答える
0

私たちはまったく同じ問題を経験しており、その時点で、クエリの形式が正しくないことになります。SQL2005で問題を解決できましたが、2008年では問題を解決できませんでした。

最後に、クエリをIFを使用して呼び出された2つのSELECTに分割します。他の誰かが同じ問題を抱えていて、それが既知の問題であることをうれしく思います。1秒未満(2005年)から30秒以上(2008年)までの150,000行+フルテキストのテーブルでクエリが発生していました。

于 2010-05-25T20:19:58.260 に答える