1

この特定の状況に取り組んでいることから、論理演算子が SQL で短絡していないことがわかりました。

私は通常、where 句で次の行に沿って何かを行います (通常は検索クエリを処理するとき)。

WHERE
   (@Description IS NULL OR @Description = myTable.Description)

この例では短絡していなくても、実際には問題ではありません。ただし、全文検索関数を扱う場合は問題になります。そのクエリの 2 番目の部分が の場合、CONTAINS(myTable.Description, @Description)これらの関数では変数を null または空にすることは許可されていないため、機能しません。

WHENのステートメントが順番に実行されることがわかったCASEので、次のようにクエリを変更して、必要な場合にのみフルテキスト ルックアップが呼び出されるようにし、変数を null から null の'""'場合に変更してクエリを実行できるようにします。

WHERE
   (CASE WHEN @Description = '""' THEN 1 WHEN CONTAINS(myTable.Description, @Description) THEN 1 ELSE 0 END = 1)

上記のコードは、実際に検索する値がない限り、フルテキスト クエリ ピースが実行されないようにする必要があります。

私の質問は、 @Description が'""'であるこのクエリを実行すると、そのテーブルと検索がまったく使用されなくても、クラスター化されたインデックスのシークと fulltextmatch の処理に費やされる実行計画にかなりの時間がまだあるということです。これを回避する方法はありますか?

これをハードコードされた動的クエリからストアド プロシージャに取り込もうとしていますが、プロシージャが遅くなった場合、それを正当化できるかどうかわかりません。

4

2 に答える 2

0

他の誰かがこのようなシナリオに遭遇した場合に備えて、これは私が最終的に行ったことであり、M_M が目指していたことにかなり近いものです。全文の断片を分割し、枝の後ろに配置しました。

DECLARE @TableBfullSearch TABLE (TableAId int)
IF(@TableBSearchInfo IS NOT NULL)
   INSERT INTO @TableBfullSearch
   SELECT
      TableAId
   FROM
      TableB
   WHERE
   ...(fulltext search)...

DECLARE @TableCfullSearch TABLE (TableAId int)
IF(@TableCSearchInfo IS NOT NULL)
   INSERT INTO @TableCfullSearch
   SELECT
      TableAId
   FROM
      TableC
   WHERE
   ...(fulltext search)...

--main query with this addition in the where clause
SELECT
  ...
FROM
   TableA
WHERE
   ...
   AND (@TableBSearchInfo IS NULL OR TableAId IN (SELECT TableAId FROM @TableBfullSearch))
   AND (@TableCSearchInfo IS NULL OR TableAId IN (SELECT TableAId FROM @TableCfullSearch))

おそらく、ある種の動的クエリなしで得られるのと同じくらい良いと思います

于 2011-11-04T20:13:10.087 に答える
0

理想的ではありませんが、おそらく次のようなものが機能します。

IF @Description = ''
BEGIN 
     SELECT ...
END
ELSE
BEGIN
     SELECT ...
     WHERE CONTAINS(mytable.description, @Description)
END

そうすれば、mysql を回避し、不要なときに FT スキャンを実行することもできます。

いくつかの一般的な注意事項として、私は通常CONTAINSTABLE、少し速いことがわかります。また、私のソリューションを使用しているか、あなたのソリューションを使用しているかによって、クエリ プランが大きく異なるため、パラメーター スニッフィングに注意してください。パラメーター スニッフィングは、渡された特定のパラメーター値に基づいてオプティマイザーがプランを作成するときに行われます。

于 2011-11-04T18:58:16.403 に答える