我有一组表,它们的行集很大(想想数十亿行),我需要获取两个参数值之间的行数,并从结果中设置两个值;我目前有COUNT(*)
。
这将对具有不同值的同一个表执行数千次,以与较大查询的一部分进行比较,在较大查询中,输入参数发生了变化,整个表中的行数变化了数十万甚至一百万表的大小会增加行数。
可能同时有几个(4-5)相同查询针对此同一表运行,但参数值不同。比较值列已建立索引,在某些表中是单个主键,但在另一些表中,它可能是复合主键的一部分。在大多数情况下,返回的计数从500,000到1,000,000不等。
是否有更快的方法来获取和使用变化范围内的计数值?
!重要的是,这并不适用于整个表格,而是适用于表格中的某个范围,因此sp_spaceused
之类的东西是不可能的。
SELECT
@newOUT = COUNT(*) ,
@RightValueOUT = COUNT(*)
FROM mydatabase.myschema.myidcolumn
WHERE
myidcolumn >= @MinRowValue
AND myidcolumn <= @MaxRowValue
答案 0 :(得分:2)
对于这种情况,我可以想到两种选择。
首先,当要比较的id是组合主键的一部分时,请确保所使用的id是主键中的 first 键。如果必须对多个键进行比较,请为每个子键使用辅助索引。
第二,如果这些是仅具有增加的主键的insert
表,那么您可以在每一步插入一个累加计数。这需要插入上的触发器或其他逻辑。
然后,您可以通过查找极值来检索计数。那是两次查找,而不是索引扫描。
答案 1 :(得分:1)
计数查询可能很难优化,因为COUNT(*)
操作涉及触摸计数范围内的每个记录。但是,我们可以尝试为myidcolumn
子句中出现的WHERE
编制索引,希望它是限制性的:
CREATE INDEX idx ON yourTable (myidcolumn);
如果SQL Server使用索引,则它可能仅能执行一次索引扫描即可生成计数。