COUNT(*) 是不是已编入索引?
Posted
技术标签:
【中文标题】COUNT(*) 是不是已编入索引?【英文标题】:Is COUNT(*) indexed?COUNT(*) 是否已编入索引? 【发布时间】:2013-08-14 22:45:27 【问题描述】:出于好奇,我想知道Select Count(*) from SomeTableName
是否也像Select * from SomeTableName
一样遍历数据库的所有行?
或者数据库的元数据中是否有任何其他可用的计数字段在每次添加或删除行时自行更新?该字段由前一个查询访问。
另外我想知道这两个查询中哪个更快,多少?
【问题讨论】:
db 如何跟踪计数?如果你用过滤器在哪里请求计数怎么办?count(*)
可以,select *
不行
@ArsenMkrt 那么它只会统计满足条件的数据
not a dup @Bridge,这个问题询问 count * tarverse table 与否
@bew,但它是否应该为此遍历表?
【参考方案1】:
SELECT Count(*)
FROM SomeTableName
将始终计算所有行。虽然(与 SELECT *
不同)它不必读取所有列,并且可以使用可用的最窄(非过滤)索引。
与 mysql(MyISAM 引擎)不同,它不会从元数据中检索值。
元数据中提供了行计数值,可以从sys.partitions
检索到,但它从不用于COUNT
查询,并且并不总是准确的。
【讨论】:
以上是关于COUNT(*) 是不是已编入索引?的主要内容,如果未能解决你的问题,请参考以下文章
ORA-20000:Oracle 文本错误:DRG-10599:列未编入索引