更快的 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 主键增加的表,那么您可以在每一步插入一个累积计数。这需要在插入时使用触发器或其他逻辑。
然后您可以通过查找极值来检索计数。那是两次查找而不是索引扫描。
我有一组 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 主键增加的表,那么您可以在每一步插入一个累积计数。这需要在插入时使用触发器或其他逻辑。
然后您可以通过查找极值来检索计数。那是两次查找而不是索引扫描。