Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 快速计数(*),行数大_Sql_Sql Server_Sql Server 2008_Count - Fatal编程技术网

Sql 快速计数(*),行数大

Sql 快速计数(*),行数大,sql,sql-server,sql-server-2008,count,Sql,Sql Server,Sql Server 2008,Count,我有一组大行集的表(想想数十亿行),我需要得到两个参数值之间的行数,并从结果中设置两个值;我现在有COUNT(*) 这将对同一个表执行数千次,并传递不同的值进行比较,作为更大查询的一部分,其中输入参数更改,并且随着表大小的增加,整个表中的行数将更改几十万行甚至一百万行 可能有几个(4-5个)相同的查询同时针对同一个表运行,但参数值不同。比较值列被索引,在某些表中是单个主键,但在其他表中它可能是复合主键的一部分。在大多数情况下,返回的计数从500000到1000000不等 有没有更快的方法从不断变

我有一组大行集的表(想想数十亿行),我需要得到两个参数值之间的行数,并从结果中设置两个值;我现在有
COUNT(*)

这将对同一个表执行数千次,并传递不同的值进行比较,作为更大查询的一部分,其中输入参数更改,并且随着表大小的增加,整个表中的行数将更改几十万行甚至一百万行

可能有几个(4-5个)相同的查询同时针对同一个表运行,但参数值不同。比较值列被索引,在某些表中是单个主键,但在其他表中它可能是复合主键的一部分。在大多数情况下,返回的计数从500000到1000000不等

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

!重要的是,这不是针对整个表,而是针对表中的某个范围,因此不可能执行
sp_spaceused
之类的操作

SELECT 
    @newOUT = COUNT(*) , 
    @RightValueOUT = COUNT(*)
FROM mydatabase.myschema.myidcolumn
WHERE 
    myidcolumn >= @MinRowValue
    AND myidcolumn <= @MaxRowValue
选择
@newOUT=计数(*),
@RightValueOUT=计数(*)
来自mydatabase.myschema.myidcolumn
哪里
myidcolumn>=@MinRowValue

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

CREATE INDEX idx ON yourTable (myidcolumn);

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

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

首先,当比较的id是复合主键的一部分时,请确保使用的id是主键中的第一个键。如果必须对多个键进行比较,则为每个子键使用辅助索引

第二,如果这些表是仅包含递增主键的
insert
,则可以在每个步骤中插入累积计数。这需要插入上的触发器或其他逻辑


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

可能重复的计数是否需要100%准确,或者估计值是否足够好?
myid列
是标识列吗?插入是否会发生大量回滚(通常、罕见、极为罕见等)?也很有趣知道这些用例是什么,因为软件似乎正在做很多事情。你可以考虑做一个“计算”的(<代码>带有Studiabin的< /Cord>选项),当数据改变为这些服务查询时,自动更新视图中的总计。但是我很确定你需要额外的磁盘空间来处理这个问题。合并单独的查询是一个选项,这样它可以同时计算多个不同的计数吗?@Certver这不是这个问题的重复,因为这个问题是关于计算一个范围内的行数,而不是整个表的行数。谢谢,我无法真正更改索引,插入可能会无序进行,但给定的范围仍然存在。该范围内可能存在间隙。请注意,这些值已复制,并且在源表中至少存在一个值,但在目标表中可能不存在(尚未)@MarkSchultheiss。如果有累积计数,即使端点不在查询中,也可以优化查询。但是要使累积计数保持最新,需要花费大量的时间。这里很难使用累积方法,可能有一个时间运行多个查询,并且我的TEMPDB已经受到空间和内存的压力——大量的写入到多个表和从对等查询到同一个表上有很多事情。复合主键的好注意-我可以认为在某些情况下,一个catch是范围值是由密集ID(人口最多)在一个给定的范围内,如果其他列与给定的行不匹配,则尝试插入列的次数最少,从而减少阻塞,并在每个范围内创建一个可预测的相对行数。在许多使用情况下,列是一个标识列,但不是全部,因为有些列是复合键的一部分。请注意列在所有情况下都是PK(忽略另一种情况),但在某些情况下它是一个包含2-4列的复合键。我的意思是1。大多数是标识或唯一值,但有些是复合键/复合键的一部分。