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)
- Books.BookTitle 和 BookPublishCities.PublishRegionName 上有全文索引。
- 两个 table 都包含大约 50 万行。我没有在 Books table 中包含 PublishRegionName 的原因是因为每个 table.
只允许一个全文索引
- BookPublishCities.BookKey
上有一个索引
我只是不确定为什么单独的查询要快得多。想法?
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
提供一些提示
当我在查询的 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 上有全文索引。
- 两个 table 都包含大约 50 万行。我没有在 Books table 中包含 PublishRegionName 的原因是因为每个 table. 只允许一个全文索引
- BookPublishCities.BookKey 上有一个索引
我只是不确定为什么单独的查询要快得多。想法?
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