聚合函数如何在SQL Server中工作?

时间:2013-04-02 10:03:26

标签: sql-server tsql

有些东西激起了我的好奇心(虽然我的代码没问题,只是一个普遍的问题)。 SQL Server中的聚合函数如何工作?它背后的机制是什么?

假设我们有一个999,999,999行的表,我们只想获得此表中的行数。

SELECT Count(*)
FROM   <Table>

此聚合函数是否会逐行扫描整个表,以获取此表中的行数,或者是否有内部表跟踪其中添加/删除行时的行数table(通过系统存储过程访问)并且这些函数会使用更多的CPU还是会使用更多的I / O读/写时间?

P.S。我读了This MSDN site,但不幸的是它没有回答我的问题。

谢谢

2 个答案:

答案 0 :(得分:3)

快速说明:SQL Server中的count(*)执行询问元数据。 在考虑未提交的事务的隔离级别和行可见性时,查询count(*)的元数据是完全错误的。除了元数据行数在某些条件下可能会偏离实际行数(旧版本更多,新版本更少)。具体条件是相关的,但请考虑为什么 DBCC UPDATEUSAGE有一个COUNT_ROWS子句:

  

指定使用表或视图中行数的当前计数更新行计数列。

话虽如此,聚合如何实施?首先,我建议阅读有关Volcano执行模型的内容。是一篇冗长的论文,但对于理解大多数关系数据库的逐行执行模型至关重要。接下来,我建议您阅读此博文Stream Aggregate。流聚合的要点需要排序的输入,并且在排序的输入上很容易计算任何聚合(顺便说一下。variance是众所周知的一次通过算法一个没有明显的简单实现的。)

为了完整性,这里是流聚合丑陋姐妹记忆猪替代方案的链接:Hash Aggregates

答案 1 :(得分:2)

如果可能,它将运行并进行索引扫描,否则它将运行表扫描。

Set SHOWPLAN_TEXT on
go
SELECT Count(*)
FROM   <Table>