两种计数方法的总运行时间

Posted

技术标签:

【中文标题】两种计数方法的总运行时间【英文标题】:Total runtime of two counting methods 【发布时间】:2013-07-12 12:41:29 【问题描述】:

不知道为什么count(*)的总运行时间小于同一张表的count(primary_key)?

查询计划(使用解释分析)显示每次 Postgresql 都在进行 Seq Scan 而不是使用索引?为什么会这样?以及为什么在这种情况下不使用索引?

已编辑:count(1) 没有任何区别。

【问题讨论】:

【参考方案1】:

当您使用SELECT COUNT(*)SELECT COUNT() 时,您只是在计算表中的行数,而忽略列数据。

当您使用 SELECT COUNT(primary_key) 时,还必须从行中获取列 primary_key,并且 - 我认为,取决于 SQL 引擎 - 只有非空值才会被计算在内。

【讨论】:

是的,我知道这两者之间的区别,但我的问题是关于索引的使用。如果可以在这里使用索引,为什么要进行 seq 扫描? 索引在定位特定行时很有用。你在数,所有这些都很重要。索引加快了查找速度。 我不能同意你的观点,看这里wiki.postgresql.org/wiki/… 好的,刚刚找到我的问题的答案wiki.postgresql.org/wiki/Slow_Countingmvcc 就是原因。

以上是关于两种计数方法的总运行时间的主要内容,如果未能解决你的问题,请参考以下文章

C# StopWatch的使用

使用Linq to Entities在一个请求中选择计数和计数

获取 C 中的进程性能计数器

s-s-rS 2008 矩阵中文本框表达式的总列

vtune 函数调用次数

在有效时间内将正整数写为 2 的幂和的总方法数