SQL - OR导致查询运行速度极慢

时间:2015-01-24 01:00:45

标签: sql asp.net .net sql-server database

当我在查询的WHERE子句中组合两个条件时,运行需要一分多钟。如果我分成两个不同的查询,它们都会在大约1秒内运行。

有什么想法?见下文:

这需要超过一分钟

SELECT 
    COUNT(b.BookKey)
from
    Books b (nolock)
    inner join BookPublishCities bp (nolock)
        on b.BookKey = bp.BookKey
where
    contains(bp.PublishRegionName, @SearchTerm) OR contains(b.BookTitle, @SearchTerm)

这些约为1秒

SELECT 
    COUNT(b.BookKey)
from
    Books b (nolock)
    inner join BookPublishCities bp (nolock)
        on b.BookKey = bp.BookKey
where
    contains(bp.PublishRegionName, @SearchTerm)

-- and...

SELECT 
    COUNT(b.BookKey)
from
    Books b (nolock)
    inner join BookPublishCities bp (nolock)
        on b.BookKey = bp.BookKey
where
    contains(b.BookTitle, @SearchTerm)
  • Books.BookTitle和BookPublishCities.PublishRegionName上有一个全文索引。
  • 两个表都包含大约500k行。我在Books表中没有包含PublishRegionName的原因是因为每个表只允许一个全文索引。
  • BookPublishCities.BookKey
  • 上有一个索引

我只是不确定为什么单独的查询要快得多。想法?

2 个答案:

答案 0 :(得分:1)

or可能会给SQL优化器带来问题。通常,这个问题出现在join条件下,但也可能在这里发生。尝试使用union,看看这是否更快:

SELECT COUNT(*)
FROM ((SELECT bookkey
       FROM BookPublishCities bp (nolock)
       WHERE contains(bp.PublishRegionName, @SearchTerm)
      ) UNION ALL
      (SELECT BookKey
       FROM Books b (nolock)
       WHERE contains(b.BookTitle, @SearchTerm)
      )
     ) b;

请注意,我简化了子查询。考虑到逻辑,join似乎没有必要 - 尽管在某些情况下它们可能很重要(例如,如果连接用于过滤,因为书键不在两个表中)。

这也可能不会返回完全相同的结果,因为可能是标题和区域都可以匹配。这也可能会在您的查询中生成重复项,因此您可能需要在外部查询中使用count(distinct)

答案 1 :(得分:-2)

Set SHOWPLAN_ALL on。检查组合计划并将其与个人进行比较。您可能需要向QEP提供一些提示