我有一组具有大行集的表(假设有数十亿行),我需要得到两个参数值之间的行数,并从结果中设置两个值;我目前有COUNT(*)。
这将在相同的表上执行数千次,传入不同的值,作为更大查询的一部分,当表的大小增加时,输入参数会发生变化,整个表中的行数会增加几十万甚至100万行。
可能有几个(4-5)相同的查询同时运行在这个表上,但参数值不同。比较值列是索引的,在某些表中是单个主键,但在另一些表中,它可能是复合主键的一部分。在大多数情况下,返回的数量将从50万到100万不等。
是否有更快的方法从变化的范围获取和使用计数值?
!重要的是,这不是针对整个表,而是针对表中的一个范围,因此像sp_spaceused这样的事情是不可能的。
SELECT
@newOUT = COUNT(*) ,
@RightValueOUT = COUNT(*)
FROM mydatabase.myschema.myidcolumn
WHERE
myidcolumn >= @MinRowValue
AND myidcolumn <= @MaxRowValue发布于 2019-05-18 14:28:49
对于这种情况,我可以想到两种选择。
首先,当要比较的id是复合主键的一部分时,然后确保所使用的id是主键中的第一个键。如果必须对多个键进行比较,则对每个子键使用辅助索引。
其次,如果这些是具有递增主键的insert-only表,那么您可以在每个步骤中插入一个累积计数。这需要在插入时使用触发器或其他逻辑。
然后可以通过查找极值来检索计数。这是两个查找,而不是一个索引扫描。
发布于 2019-05-18 14:28:08
count查询很难优化,因为COUNT(*)操作涉及到计数范围内的每个记录。但是,我们可以尝试索引出现在myidcolumn子句中的WHERE,希望它具有限制性:
CREATE INDEX idx ON yourTable (myidcolumn);如果Server使用该索引,则它可能只需执行一次索引扫描即可生成计数。
https://stackoverflow.com/questions/56199847
复制相似问题