私は最近、私にとって非常に新しいことを学んでいます - 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 は潜在的な重複を残します。
それ以上の提案は大歓迎です。