【发布时间】: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