Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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/search/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
Performance 在一个大表中循环时T-SQL的性能困境(详细信息见)_Performance_Tsql - Fatal编程技术网

Performance 在一个大表中循环时T-SQL的性能困境(详细信息见)

Performance 在一个大表中循环时T-SQL的性能困境(详细信息见),performance,tsql,Performance,Tsql,假设我有一个大的和一个大的表。 我需要循环浏览Big表,它是索引的,但不是顺序的(因为它是顺序索引的biger表的过滤器) 对于这个例子,假设我需要循环大约20000行 我应该做20000个吗 set @currentID = (select min(ID) from myData where ID > @currentID) 或 创建(大的)临时顺序索引表(大的表的副本)并执行以下操作 @Row = @Row + 1 ? 我想,仅仅为了获取下一个ID而对Bigger表进行20000次

假设我有一个
大的
和一个
大的
表。 我需要循环浏览
Big
表,它是索引的,但不是顺序的(因为它是顺序索引的
biger
表的过滤器)

对于这个例子,假设我需要循环大约20000行

我应该做20000个吗

set @currentID = (select min(ID) from myData where ID > @currentID)

创建(大的)临时顺序索引表(大的表的副本)并执行以下操作

@Row = @Row + 1
?

我想,仅仅为了获取下一个ID而对
Bigger
表进行20000次筛选是很繁重的,但为了添加一个虚拟标识列而填充一个大(
big
sized)临时表也是如此

解决方案在其他地方吗? 例如,如果我可以在不需要创建临时表的情况下循环select语句的结果(生成“table”(实际上是一个resultset)
Big
)的
Big
表的过滤器),这将是理想的,但我似乎无法向结果中添加标识(1,1)伪列之类的内容


谢谢

> P>您可能想考虑如何完成您的工作<强>基于SET/<强>而不是<强> RBAR< <强>。也就是说,对于非常大的表,如果怀疑proc可能在生产中运行一段时间,您可能不希望创建临时表,以确保您拥有实时数据。如果你的进程失败了,你将能够从你停止的地方重新开始。如果使用临时表,则如果进程崩溃,则可能会丢失尚未完成的数据。

您需要提供有关最终结果的更多信息,但很少需要逐行处理(从性能角度来看,几乎总是最糟糕的选择)。本文将让您开始了解如何以基于集合的方式完成许多任务:

如果您只需要一个具有标识的临时表,则有两种方法:

create table #temp ( test varchar (10) , id int identity)
insert #temp (test)
select  test from mytable

select  test, identity(int) as id into #temp from mytable

我想加入会更符合你的目的

SELECT BIG.*, BIGGER.*, -- Add additional calcs here involving BIG and BIGGER.
FROM TableBig BIG (NOLOCK)
JOIN TableBigger BIGGER (NOLOCK)
  ON BIG.ID = BIGGER.ID
这将限制您使用的集合。但这又一次归结到解决方案的细节上


还请记住,您也可以通过这种方式进行批量插入和批量更新。

myData表如何适应这种情况?我需要查看示例数据,因为我不知道您在问什么。您需要告诉我们更多关于您试图实现的目标以及SQL Server的版本(大概是哪个版本)。很可能您可以在一个查询中完成这项工作,而无需循环。只需处理20000个项目,您就会遇到性能问题?您的数字和主观结论表明,您可能需要让了解数据库的人参与进来。这超出了Stackoverflow中的一两段。“循环通过”是一个概念性的非初学者。