当我在查询的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)
我只是不确定为什么单独的查询要快得多。想法?
答案 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提供一些提示