Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
而TSQL中的While循环具有总和_Sql - Fatal编程技术网

而TSQL中的While循环具有总和

而TSQL中的While循环具有总和,sql,Sql,我有下面的TSQL语句,我试图找出如何一次获得100行结果,将它们存储在一个变量中,因为我必须在每次选择后添加总计,并在while循环中继续选择,直到找不到更多记录,然后将变量总计返回给调用函数 SELECT [OrderUser].OrderUserId, ISNULL(SUM(total.FileSize), 0), ISNULL(SUM(total.CompressedFileSize), 0) FROM ( SELECT DISTINCT TOP(100) ProductSize.O

我有下面的TSQL语句,我试图找出如何一次获得100行结果,将它们存储在一个变量中,因为我必须在每次选择后添加总计,并在while循环中继续选择,直到找不到更多记录,然后将变量总计返回给调用函数

SELECT [OrderUser].OrderUserId, ISNULL(SUM(total.FileSize), 0), ISNULL(SUM(total.CompressedFileSize), 0)
FROM 
(
 SELECT DISTINCT TOP(100) ProductSize.OrderUserId, ProductSize.FileInfoId, 
 CAST(ProductSize.FileSize AS BIGINT) AS FileSize, 
 CAST(ProductSize.CompressedFileSize AS BIGINT) AS CompressedFileSize
 FROM ProductSize WITH (NOLOCK)
 INNER JOIN [Version] ON ProductSize.VersionId = [Version].VersionId
) AS total RIGHT OUTER JOIN [OrderUser] WITH (NOLOCK) ON total.OrderUserId = [OrderUser].OrderUserId
WHERE NOT ([OrderUser].isCustomer = 1 AND [OrderUser].isEndOrderUser = 0 OR [OrderUser].isLocation = 1) 
AND [OrderUser].OrderUserId = 1
GROUP BY [OrderUser].OrderUserId

根据聚集索引,如果其id按编号,则使用下面的代码。如果按日期,则以10-60分钟为增量。请注意其他方面的性能,但这段代码的可爱之处在于,如果您将结果推送到永久临时表real table,您可以随时启动和停止,只需临时

以下是一个示例:

declare @count int
Declare @batch int
declare @max int

create table #temp (id int identity(1,1) primary key, Batch int, value int)


select @max = max(OrderUserId), @count = 0, @batch = 1000 from table

while (@count < @max)
begin

insert into #temp (batch,value)
select @count, Sum(stuffs)
from table
where orderId >= @count
 and orderid < @count + @batch

Set @count = @count + @batch

waitfor delay ('00:00:01')
Raiserror('On Batch %d',0,1,@Count) with nowait /* Will print progess */
end

如果你只是把它们相加,为什么要把它们分成100个批次?或者你需要每批100行的总和吗?你测试过一个简单的集合吗?虽然10-3000万行可能会很多,但我不知道它是否会成为一台像样的服务器。这在很大程度上取决于你的索引等。通常情况下,最好不要编写性能问题代码,直到你确认你确实会遇到性能问题。Tom H,如果你把它作为一个答案,我会投赞成票。听起来好像必须扫描整个表才能产生所需的结果,我不得不认为,将此扫描分块将需要更多的资源,而不仅仅是在一次扫描中扫描整个表,不管是NOLOCK还是no。我必须对多个orderuserid执行此操作,你们会建议将上述语句更改为1查询并删除OrderUserId=1,以便在一条语句中为所有用户返回吗?@RPS我肯定认为你们应该避免按行号进行分区,因为至少在最后一批中,它可能只计算整个结果集,然后过滤整个结果集锻炼是徒劳的!根据您拥有的索引,按OrderUserId进行分区可能是合理的,但请查看估计的执行计划,以检查它最终是否会扫描整个大表。