【问题标题】:Counting the number of rows in sql server 2008计算sql server 2008中的行数
【发布时间】:2023-04-08 22:39:01
【问题描述】:

有没有更好的方法来代替SELECT COUNT(*) 语句来统计表中的记录数?

有时我们必须从使用 bcp 查询导入的临时表中计算数十亿条记录。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

使用count(*)count(some_column) 是检查表记录计数的最快方法。

【讨论】:

  • 我一直在做 count(primaryKey) 因为我认为“*”会增加一些开销。但是,我并不积极。
  • 如果列可为空,count(*)count(some_column) 不等效。
  • SELECT COUNT(*) 语句进行全表扫描以返回总表的行数,这对于大表可能需要很长时间,对主键进行计数很好,但我在这里触及数十亿的记录。 @L_7337
  • @Parshii - 您可以从元数据中获得可能非常准确的数字。请参阅 the answer 已由 R.S. 链接
  • @TimSchmelter - 我还是使用COUNT(*),因为使用列名(即使是PK 或其他NOT NULL 列)没有任何好处,而且它更短且(IMO)更清晰。出于这个原因,它也会更具防御性。是的,COUNT(1)COUNT(*)COUNT(PK) 都获得相同的计划(并在计划中显示为 COUNT(*)),SQL Server 将使用可用的最窄索引来执行 COUNT
【解决方案2】:

如果不需要过滤,下面的查询效果很好:

SELECT sum(rows) FROM SYS.PARTITIONS WHERE object_id=object_id('MY_TABLE') and index_id in(0,1) 

检查 sql server 为该对象存储的行数。它无法返回任何带有计数的数据,也无法包含 group by 或 where。

【讨论】:

  • 感谢 Vulcronos,它确实是一个快速的代码行。早些时候我使用 SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多