循环遍历Big表时的T-SQL性能困境(内部细节)

时间:2011-04-05 15:24:24

标签: performance tsql

假设我有一个Big和一个Bigger表。 我需要循环遍历Big表,该表是索引但不是顺序的(因为它是顺序索引的Bigger表的过滤器。)

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

我应该做20000个

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

创建(大)临时顺序索引表(Big表的副本)并执行20000

@Row = @Row + 1

我认为只是为了获取下一个ID而对Bigger表执行20000个过滤器很重,但必须填充一个大的(Big大小的)临时表才能添加一个虚拟标识列

解决方案是否在其他地方? 例如,如果我可以循环遍历select语句的结果(发起“table”(实际上是结果集)Bigger的{​​{1}}表的过滤器)而不需要创建临时表,它将是理想的,但我似乎无法在结果中添加类似IDENTITY(1,1)虚拟列的内容。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可能需要考虑了解如何将您的工作设置为而不是 RBAR 。话虽如此,对于非常大的表,您可能不想制作临时表,以便在怀疑proc可能会在生产中运行一段时间时确保您拥有实时数据。如果您的过程失败,您将能够从中断的地方继续。如果您使用临时表,那么如果您的proc崩溃,那么您可能会丢失尚未完成的数据。

答案 1 :(得分:0)

您需要提供有关最终结果的更多信息,很少需要逐行处理(从性能角度来看,几乎总是最糟糕的选择)。本文将帮助您开始学习如何以基于集合的方式执行许多任务: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

如果您只想要一个带有标识的临时表,可以使用以下两种方法:

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

答案 2 :(得分:0)

我认为加入会更好地满足您的目的。

SELECT BIG.*, BIGGER.*, -- Add additional calcs here involving BIG and BIGGER.
FROM TableBig BIG (NOLOCK)
JOIN TableBigger BIGGER (NOLOCK)
  ON BIG.ID = BIGGER.ID

这将限制您正在使用的设置。但同样,它归结为您的解决方案的具体细节。

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

相关问题