我在SQL Server 2008中编写的存储过程中有以下代码:
select sum(Sum1)
from
(
select count(1) as Sum1 from Table1
UNION ALL
select count(1) as Sum1 from Table2
UNION ALL
select count(1) as Sum1 from Table3
UNION ALL
select count(1) as Sum1 from Table4
) as SumCount
UNION ALL加入了更多的SELECT语句。我如何重写查询以优化性能?是否有其他操作员而不是UNION ALL有助于提高性能?
答案 0 :(得分:1)
这个速度和它一样快。您想要计算所有表中的所有行,这就是您正在做的事情。 (使用COUNT(*)
会更清楚,因为你想计算行数。使用COUNT(1)
意味着计算生成的1不为空的所有行,但当然dbms将其优化为{ {1}}内部。)
您也可以尝试:
COUNT(*)
我认为这更具可读性。我想dbms将使用相同的执行计划。好吧,你仍然可以尝试。
答案 1 :(得分:0)
您的查询是我如何做的,因为它允许优化器使用目录中的数据来产生答案,而不是表/索引I / O.
还有另一种方法可以做到这一点,我从未尝试过,但它可能值得一试:
select count(*) from
(
select 1 a from Table1
UNION ALL
select 1 from Table2
UNION ALL
select 1 from Table3
UNION ALL
select 1 from Table4
) as SumCount
让我知道它与您的查询相比如何。