Неправильный план для СОДЕРЖИТ условие в MS SQL - PullRequest
2 голосов
/ 20 января 2012

SQL Server 2008 R2

У меня два запроса

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 секунд, второй несколько миллисекунд. ПОЧЕМУ ????

Plans

1 Ответ

2 голосов
/ 20 января 2012

Бит @title = '""' OR ... - это проблема.

Во время компиляции он не знает, действительно ли @title будет содержать значение "" и, следовательно, должен возвращать все строки или нет.

Вы можете попробовать добавить OPTION(RECOMPILE) к запросу, чтобы он перекомпилировался после присвоения переменной, или просто разбить его на два случая.

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