2

毎晩、ODBC ソースから SQL Server 2005 テーブルに 800 万を超えるレコードを入力する必要があります。現在、次のような構文 select を使用して、リンク サーバーから挿入ステートメントを使用しています。

Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable')

これは非常に非効率的で、実行に数時間かかります。この質問にあるコードと同様の SqlBulkInsert コードを使用してソリューションをコーディングしている最中です。

その質問のコードは、最初にメモリにデータ テーブルを設定し、次にそのデータ テーブルを SqlBulkInserts WriteToServer メソッドに渡します。

移入されたデータテーブルが、実行中のマシン (私の場合は 16GB のメモリを搭載したサーバー) で使用できるよりも多くのメモリを使用している場合はどうすればよいですか?

x から n までのレコードのみを埋めることができるオーバーロードされた ODBCDataAdapter fillメソッドを使用することを考えました (x は開始インデックス、n は埋めるレコードの数です)。ただし、ソースでselectステートメントを何度も再実行することを意味するため、現在持っているソリューションよりもさらに遅いソリューションになる可能性があります。

私は何をすべきか?すべてを一度に実装して、OS にメモリを管理させますか? チャンクで入力する必要がありますか?私が考えていない別の解決策はありますか?

4

3 に答える 3

4

最も簡単な方法は、odbc データ ソースに対して ExecuteReader() を使用し、IDataReaderWriteToServer(IDataReader)オーバーロードに渡すことです。

ほとんどのデータ リーダーの実装では、合計結果のごく一部しかメモリに保持されません。

于 2008-10-13T00:54:12.820 に答える
1

SSIS は適切に機能し、非常に微調整可能です。私の経験では、800 万行は大したことではありません。私の大規模な ETL の 1 つは、1 日に 2,400 万行を取り込み、主要な変換と次元データ ウェアハウスの操作を行います。

于 2008-10-13T02:20:38.043 に答える
0

宛先テーブルにインデックスがある場合、レコードが挿入されるまでそれらを無効にすることを検討できますか?

于 2008-10-13T02:42:00.200 に答える