如果我在SQL Server 2008 R2中执行以下查询,那么对于OUTER SELECT查询,count(*)
聚合只会确定一次,还是会对OUTER SELECT中的每条记录重复一次?
我猜测SQL Server会很聪明地看到相同的计算正在重复,所以为了优化目的,它只进行一次计算。以下查询中TotalCount
的值对于外部查询中的所有行都是相同的。
SELECT
p.ProductId, p.ProductName,
(select count(*) from Products p1) as TotalCount
FROM Products p
答案 0 :(得分:1)
不,你对SQL Server的期望太高了。另外:查询处理器确实无法确定此值是否会随着时间的推移而发生变化 - 所以它无法真正为您“优化”这一点。
对于每一行,此子查询将执行一次。
因此,如果您的SELECT
语句将返回1000万行,则此计数将确定1000万次。
如果您不希望这样,您可以始终在查询之前运行select count(*)..
一次并将值存储到SQL变量中,并在查询中选择该变量:
DECLARE @TableCount INT
SELECT @TableCount = COUNT(*) FROM Products
SELECT
p.ProductId, p.ProductName, @TableCount
FROM
Products p