2011-04-05 17 views
0

假设我有一个Big和一个Bigger表。 我需要循环访问Big表,该表被索引但不是顺序的(因为它是按顺序索引的Bigger表的过滤器)。T-SQL在Big表中循环时的性能困境(详细内部)

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

我应该做的这些

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

创建(大)临时顺序进行分度表(Big表的副本),并做20000

@Row = @Row + 1 

20000?

我想为012取得下一个ID做表的20000个过滤器很重,但是为了添加一个虚拟身份列,必须填写一个大的(大小)的临时表。

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

谢谢!

+0

'myData'表如何适合这个?我需要查看示例数据,因为我不知道你在问什么。 – 2011-04-05 15:35:52

+0

您需要告诉我们更多关于您想要完成的内容以及(大概)SQL Server版本的信息。很可能您可以在单个查询中完成,而无需循环。 – Thomas 2011-04-05 16:00:47

+1

只有20K项目需要处理,而且你遇到性能问题? – JohnOpincar 2011-04-05 17:11:14

回答

0

你可能要考虑找出如何做你的工作设置为基于而不是RBAR。这就是说,对于非常大的表格,如果您怀疑proc可能会在生产环境中运行一段时间,您可能不想创建临时表格,以确保您拥有实时数据。如果你的proc失败了,你可以从你离开的地方继续。如果你使用临时表,那么如果你的proc崩溃,那么你可能会丢失尚未完成的数据。

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 
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 

这会限制您正在使用的设置。但是,这也归结为您的解决方案的细节。

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