0

I am running dynamic queries that often return HUGE (300MB - 1GB) result sets initially. Later, it should not be this big (not sure about that though) because I will be using delta loading. These result sets are then loaded into a C# data table. A script loops over these rows and then generates a query (stored in SSIS variable) to load them to the appropriate destination columns (determined by other scripts).

For small result sets, my package runs properly. But, for big ones, it simply fails due to out of memory error. How do I resolve this problem ? Can you suggest some strategies ? I guess I could fetch smaller parts of the data at a time and then load into target. Not sure how to go about it though. Is there a recipe for this ?

A brief intro to how the process works -

Execute SQL: Get big ResultSet > Script:RowReader: Read each row 
and generate a String SQL like "Insert INTO TableABC VALUES" + {all 
columns of 1 row here}. Then, concatenate SQL to a String destinationInsert > 
Execute SQL: execute SQL inside String destinationInsert. 

ETL process complete. Does that help ?

4

1 に答える 1

4

T-SQL は適切なプログラミング言語であるため、T-SQL でできることはたくさんあります。あなたが言及した「スクリプト」が重い I/O やリモート通信を伴わない場合は、SQL で書き直すことができます。

通常、データは行単位で処理され、これは 1 つのステートメント (UPDATE...) で実行できます。いずれにせよ、サーバー内でやりたいことができるようになります。

ただし、スクリプトが複雑すぎて SQL でコーディングできないと仮定しましょう。それでは、C# でコーディングして、アセンブリを SQL-Server に追加します。C# コードは CLR 関数としてアクセスできるため、メモリを大量に消費することなくすべてを実行できます。編集: おっと、SQL-2005 を使用しています。.NET アセンブリを追加できるかどうかは 100% わかりません... Gary Walker が指摘したように、CLR は SQL 2005 でサポートされています。Thx、Gary。

スクリプトまたは少なくともその基本的な機能を私たちと共有していただければ、迅速で簡単な解決策を見つけることができると確信しています。

于 2013-10-29T20:05:53.067 に答える