【问题标题】:T-SQL fastest way to count rows by criteriaT-SQL 按条件计算行数的最快方法
【发布时间】:2013-11-27 09:14:20
【问题描述】:

按某些标准获取行数的最快方法是什么?
我有一张桌子:transactions(id int (PK), userId int, typeId int, dateCreated date, (and about 5-6 additional columns))
该表有数百万行。

现在我需要检索此表中记录的计数...计数的条件可以是一到三列 (userId, typeId, dateCreated) 的任意组合,并且 dateTime 可以是“从”和“到”。

为了以最快的方式获得计数,查询和索引应该是什么?是否可以仅使用索引/统计信息来获取行数,而不读取实际的表数据?
count(*)count(id) 在这种情况下是否会影响性能?

谢谢。

【问题讨论】:

  • 执行一个简单的 COUNT(*) FROM 表可以更有效地扫描聚集索引,因为它不必关心任何过滤、连接、分组等
  • @VijaykumarHadalgi 但是聚集索引的简单计数不是问题......查询可能看起来像的问题: select count(*) from table where userid = 'someuser' and dateCreated => 'somedate ' 和 dateCreated
  • 你可以先尝试覆盖索引:userId, typeId, dateCreated, userId, dateCreated, typeId, dateCreated, dateCreated;如果它被证明太慢,请尝试聚合 indexed views 使用相同的列来分组 on 和 count_big(*) 预计数记录(尽管使用 * 或 id 并不重要,在这种情况下 id 会要求另一列,因为 count_big(*) 在聚合索引视图中是必需的)。不要忘记在测试查询中的视图名称后添加noexpand 提示。
  • 你也可以使用 select count(1) from table (你可以使用其他数字或值,没关系)。我尝试了 3 种形式,都得到了相同的执行计划(对于 TSQL、MSSQL) 从 sys.sysobjects 中选择 COUNT(*) 从 sys.sysobjects 中选择 COUNT(id) 从 sys.sysobjects 中选择 COUNT(1)

标签: sql database performance tsql


【解决方案1】:

您可以从索引中获取它,我不确定它是否 100% 准确,但您不会错过超过几行的计数。

select ob.name,  ix.rowcnt 
from sys.sysindexes ix
join sys.sysobjects ob ON ix.id = ob.id 
where ob.xtype = N'U' and ob.name = N'MyTable'

请注意,这样您可以一次获得所有桌子的计数。 obs:注意它会为表中的每个索引返回一个值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多