为什么这个SQL语句很慢?

Mux*_*uxa 8 sql sql-server

我有一个包含大约100万条记录的表(运行SQL Server 2008 Web).我有一个搜索例程,试图匹配产品代码和产品描述.但是在某些情况下它很慢.下面是(cut-down)sql语句:

WITH AllProducts AS (
  SELECT       p.*, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
    (
      p.BaseSku = 'KPK-3020QWC-C' -- this on its own is fast
      OR
      CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"') -- and this on its own is fast, but not both
    )
) SELECT * FROM AllProducts        
  WHERE RowNumber BETWEEN 1 AND 20;
Run Code Online (Sandbox Code Playgroud)

请注意,如果我只是在[p.BaseSku ='KPK-3020QWC-C']或[CONTAINS(p.FreeTextStrings,'"KPK-3020QWC*"')上单独(但不是两者)比较它的瞬间.如果我将它们比较在一起需要很长时间(几分钟) - 并且只返回一行.

IsEnabled和BaseSku被索引,FreeTextStrings被FTS索引.

我记得这个工作很好.

任何人都可以对此有所了解并提出一些解决方案吗?

执行计划文件可在此处获取:http://wiki.webgear.co.nz/GetFile.aspx?File = Temp%5cSearch%20Test.sqlplan.zip

Eri*_*ric 11

or在SQL Server上出了名的慢.至少可以说,这是加重的.

尝试将其拆分为两个查询union:

WITH AllProducts AS (
  select *, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
  from (
  SELECT       p.*
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
      p.BaseSku = 'KPK-3020QWC-C' 
  UNION
  SELECT       p.*
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
      CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"')
  )
) SELECT * FROM AllProducts        
  WHERE RowNumber BETWEEN 1 AND 20;
Run Code Online (Sandbox Code Playgroud)