3

私は最近、私にとって非常に新しいことを学んでいます - FULLTEXT インデックスです。

2 つの別々のテーブルに対して同じパラメータで 2 つの別々のクエリ (CONTAINSTABLE を使用) を実行できるようですが、2 つを組み合わせると、クエリに 1.3 秒または 130 回以上かかります。もっとゆっくり!!

以下はクエリです(この質問のために簡略化されています)。

クエリ 1:

SELECT
    *
FROM
    dbo.FooBar FB
    INNER JOIN dbo.FooBalls FBS on FB.ID = FBS.ID
    LEFT JOIN CONTAINSTABLE(dbo.FooBar, (Col1, Col2, Col3), @query) FBCONT ON FB.ID = FBCONT.[KEY]
WHERE
    FBCONT.[KEY] IS NOT NULL

クエリ 2:

SELECT
    *
FROM
    dbo.FooBar FB
    INNER JOIN dbo.FooBalls FBS on FB.ID = FBS.ID
    LEFT JOIN CONTAINSTABLE(dbo.FooBalls, (Col1), @query) FBSCONT ON FBS.ID = FBSCONT.[KEY]
WHERE
    FBSCONT.[KEY] IS NOT NULL

クエリの組み合わせ:

SELECT
    *
FROM
    dbo.FooBar FB
    INNER JOIN dbo.FooBalls FBS on FB.ID = FBS.ID
    LEFT JOIN CONTAINSTABLE(dbo.FooBar, (Col1, Col2, Col3), @query) FBCONT ON FB.ID = FBCONT.[KEY]
    LEFT JOIN CONTAINSTABLE(dbo.FooBalls, (Col1), @query) FBSCONT ON FBS.ID = FBSCONT.[KEY]
WHERE
    (FBCONT.[KEY] IS NOT NULL OR FBSCONT.[KEY] IS NOT NULL)

おそらく私の研究は何かを見逃していますが、両方の節を一緒にするとパフォーマンスが 130 倍以上低下する理由について、誰かが私に指標を与えることができますか?

ノート:

  • 参加に関連するインデックスが存在することを確認しました-個々のクエリの速度によって検証されました。
  • プロセスには実際にはさらに多くの結合がありますが、それらはクエリであるテーブルに完全にリンクされておらず、100,000 以上のレコードで結果を検索する場合の応答は 10 ミリ秒未満です。
  • CONTAINSTABLE を個々の CONTAINS ステートメントに置き換えてみました。パフォーマンスは大幅に低下しました。私の調査では予想通りでした。
  • クエリ対象の 2 つのテーブルから 4 つの列のみを参照するカタログが設定されている
  • 現在、@query パラメータは NVARCHAR (50) に設定されています。暗黙的な変換が必要ないため、 NVACHAR を使用する方が高速であると読みました。
  • 両方のクエリに対してダーティな UNION ALL を個別に実行できることはわかっていますが、可能であれば、一緒にハッキングするよりも、より優れたクエリを作成することをお勧めします。さらに、@query 値が 1 つのレコードにリンクされた別々のテーブルの 2 つの列にある場合、UNION ALL は潜在的な重複を残します。

それ以上の提案は大歓迎です。

4

1 に答える 1