sql - MS SQLのCONTAINS条件の誤った計画

sql sql-server tsql sql-server-2008-r2 sql-execution-plan

SQL Server 2008 R2

2つのクエリがあります

DECLARE @title NVARCHAR(500) = '"Finite" AND "Elements"'

select * from papers p
where (@title = '""' OR CONTAINS(p.name, @title))

select * from papers p
where (CONTAINS(p.name, @title))


最初は約7秒、次に数ミリ秒で動作します。なぜ????
答え
@title = '""' OR ...ビットが問題です。

コンパイル時には、@titleに実際に値""が含まれるかどうかがわからないため、すべての行を返す必要があるかどうかはわかりません。

OPTION(RECOMPILE)をクエリに追加して、変数が割り当てられた後に再コンパイルされるか、または2つのケースに分割することもできます。

IF @title = '""'
  SELECT *
  FROM   papers
ELSE
  SELECT *
  FROM   papers p
  WHERE  ( CONTAINS(p.name, @title) )  
関連記事

sql - Doctrine 2 JOINエラー

mysql - 2つの列に一意のインデックスを持つテーブルにINSERT INTO

sql - SQL:テーブルのサブセットの物理サイズを取得する

mysql - MySQLはtable1への挿入時にtable2に行を自動挿入します

python - 可変長期間の最大出力を見つける

sql - データベースの行間の日時の違い

php - Oracleストアドプロシージャから配列結果を取得する方法

sql - 中間行を挿入する方法は?

sql - 変更された行を検索(nullを含む複合キー)

php - クエリ結果で関連する(結合された)テーブルのフィールドを並べ替える方法