sql - 为什么这个SQL语句很慢?

标签 sql sql-server

我有一个包含大约 100 万条记录的表(运行 SQL Server 2008 Web)。我有一个搜索例程,尝试匹配产品代码和产品描述。 但在某些情况下,速度非常慢。下面是(精简的)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;

请注意,如果我只是单独比较 [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

最佳答案

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;

关于sql - 为什么这个SQL语句很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291975/

相关文章:

sql - 将 SQL Server 版本号与名称相关联

sql - 从另一个表创建一个表

mysql - 奇怪的 SQL 语法

SQL Server - READPAST、UPDLOCK 更新方法?

c# - 24 小时后的 asp.net c# 网站表单操作

sql-server - SQL Server非聚集索引永远不会出现在执行计划中

sql-server - 使用基于连接的当前节点值从辅助表更新 xml 节点值

mysql - SQL - where子句只匹配一个条件

sql server批量插入带有逗号的数据的csv

sql - 列存储索引的正确使用