2017-04-04 15 views
1

私はSystem.OutOfMemoryExceptionで苦労しています。私はいくつかの解決策を見てきましたが、皆さんはもっと多くのRAMが必要だと言っています。それがコードの非効率性によるものなのかどうかは疑いがあります。
それぞれ約5kレコードの10個の異なるテーブルがあります。各テーブルから1つの列を選択して新しいテーブルを作成する必要があります.1.5kレコードを挿入できますが、実行停止は"System.OutOfMemoryException" 。 私のループはSystem.OutOfMemoryExceptionの原因となるストアドプロシージャでwhileループを使用していますか?

ALTER PROCEDURE Sp_sample 
As 
    Select col1 
    into 
    #ControlTable 
    from 
    tab1 

while exists(select * from #ControlTable) 
    begin 

      (select count(*) from #ControlTable); 
      select @var1 = (select top 1 col1 from #ControlTable);   
      select @var2 = (select top 1 col2 from table1 where [email protected]); 
      if exists (select a from tablenew where [email protected]) 
      begin    
       update tablenew set col2 = @var2 where col1 = @var1 
      end 
      else 
      begin   
       insert into tablenew values (@var1,@var2) 
      end 
      delete from #ControlTable where col1 = @var1; 
    end 
Begin 

のように見えながら、私は質問がより汎用的にするために、サンプルコードを掲載しています。 ご意見やご提案は高く評価されます。

+0

あなたは 'select @ var1 =(#ControlTableからトップ1のcol1を選択します); – artm

+1

[Merge Statement](https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx)で簡単に実行できるこの作業を圧倒しているような気がします。また、 (#ControlTableから数を選択してください); ' –

+1

Jorgeと合意 - (#ControlTableから数を選択してください);は別の*を生成する予定ですが、ループが繰り返されるたびに結果セット*が返されます。したがって、もしあなたが5000行について話しているなら、クライアントシステムが処理する5000個の結果セットを生成するでしょう。 –

答えて

3

ループしながら、以下試してみて、パフォーマンスをチェックしてください:

ALTER PROCEDURE Sp_sample 
As 
Select col1, ROW_NUMBER() OVER(Order By col1) AS RowNo 
into 
#ControlTable 
from 
tab1 

DECLARE @Index INT=1; 
DECLARE @TotalRow INT=0; 

SELECT @TotalRow=COUNT(col1) FROM #ControlTable 

while @Index<[email protected] 
begin    
     select @var1 = var1 from #ControlTable where [email protected];   
     select @var2 = var2 from table1 where [email protected]; 

     if exists (select a from tablenew where [email protected]) 
     begin    
      update tablenew set col2 = @var2 where col1 = @var1 
     end 
     else 
     begin   
      insert into tablenew values (@var1,@var2) 
     end 
     SET @Index = @Index+1; 
end 
Begin 
+0

ありがとう@Sandip。それは私のために働いた。 – Hitsa00

1

あなたは、テーブルを挿入または更新するMERGEを使用することができます。

Select col1, max(col2) AS col2 into #ControlTable from tab1 GROUP BY col1 

MERGE tablenew AS T 
USING #ControlTable AS S 
ON (T.col1 = S.col1) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(col1, col2) VALUES(S.col1, S.col2) 
WHEN MATCHED 
    THEN UPDATE SET T.col2 = S.col2 
関連する問題