有些东西激起了我的好奇心(虽然我的代码没问题,只是一个普遍的问题)。 SQL Server中的聚合函数如何工作?它背后的机制是什么?
假设我们有一个999,999,999行的表,我们只想获得此表中的行数。
SELECT Count(*)
FROM <Table>
此聚合函数是否会逐行扫描整个表,以获取此表中的行数,或者是否有内部表跟踪其中添加/删除行时的行数table(通过系统存储过程访问)并且这些函数会使用更多的CPU还是会使用更多的I / O读/写时间?
P.S。我读了This MSDN site,但不幸的是它没有回答我的问题。
谢谢
答案 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>