更快的 COUNT(*) 和大行数

Faster COUNT(*) with large row count

我有一组 table 具有大量行集(想想数十亿行),我需要获取两个参数值之间的行数并从结果中设置两个值;我目前有COUNT(*)

这将针对相同的 table 执行数千次,并传递不同的值以与作为输入参数更改和总行数 [=27= 的较大查询的一部分进行比较] 随着 table 大小的增加,改变了几十万甚至一百万行。

可能有几个 (4-5) 相同的查询 运行 同时针对同一个 table 但参数值不同。比较值列已编入索引,并且在某些 table 中是单个主键,但在其他情况下它可能是复合主键的一部分。在大多数情况下,返回的计数会在 500,000 到 1,000,000 之间变化。

有没有更快的方法从不断变化的范围中获取和使用计数值?

!重要的是,这不是针对整个 table,而是针对 table 范围内的范围,因此 sp_spaceused 之类的内容不是可能。

SELECT 
    @newOUT = COUNT(*) , 
    @RightValueOUT = COUNT(*)
FROM mydatabase.myschema.myidcolumn
WHERE 
    myidcolumn >= @MinRowValue
    AND myidcolumn <= @MaxRowValue

计数查询可能很难优化,因为 COUNT(*) 操作涉及触及计数范围内的每条记录。但是,我们可以尝试索引出现在 WHERE 子句中的 myidcolumn,希望它是限制性的:

CREATE INDEX idx ON yourTable (myidcolumn);

如果 SQL 服务器使用索引,它可能只需执行一次索引扫描即可生成计数。

对于这种情况,我可以想到两种选择。

首先,当被比较的id是复合主键的一部分时,那么确保被使用的id是主键中的first键。如果必须对多个键进行比较,则为每个子键使用二级索引。

其次,如果这些是 insert-only 主键增加的表,那么您可以在每一步插入一个累积计数。这需要在插入时使用触发器或其他逻辑。

然后您可以通过查找极值来检索计数。那是两次查找而不是索引扫描。