【问题标题】: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,但它是否应该为此遍历表?

标签: sql sql-server database select


【解决方案1】:
SELECT Count(*)
FROM   SomeTableName 

将始终计算所有行。虽然(与 SELECT * 不同)它不必读取所有列,并且可以使用可用的最窄(非过滤)索引。

与 MySQL(MyISAM 引擎)不同,它不会从元数据中检索值。

元数据中提供了行计数值,可以从sys.partitions 检索到,但它从不用于COUNT 查询,并且并不总是准确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多