假设我有一个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)虚拟列的内容。
谢谢!
答案 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
这将限制您正在使用的设置。但同样,它归结为您的解决方案的具体细节。
请记住,您也可以这种方式进行批量插入和批量更新。