SQL - 或者导致查询 运行 极慢

SQL - OR causes query to run extremely slow

当我在查询的 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)

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

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 似乎不是必需的——尽管在某些情况下它们可能很重要(例如,如果连接用于过滤,因为书键不在两个表中)。

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

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

提供一些提示