データをチャンクで読み取ることをお勧めします:
テーブル全体をロードする代わりに、データをチャンクに分割してSQLServerにインポートしてみてください。しばらくして、SQLiteに関連する同様の回答に答えました。これを、Oracleの構文に合うように再現しようと思います。
ステップバイステップガイド
この例では、各チャンクに10000行が含まれています。
- タイプ
Int32
の2つの変数を宣言します (@[User::RowCount]
および@[User::IncrementValue]
) Execute SQL Task
を追加しますselect Count(*)
を実行します コマンドを実行し、結果セットを変数@[User::RowCount]
に保存します。
- 次の設定でForループを追加します:
- forループコンテナ内に
Data flow task
を追加します - データフロータスク内に
ODBC Source
を追加します およびOLEDB Destination
- ODBCソースで
SQL Command
を選択します オプションを選択し、SELECT * FROM TABLE
を記述します クエリ*(メタデータのみを取得するには ` - ソースと宛先の間の列をマッピングします
Control flow
に戻りますData flow task
をクリックします F4を押します プロパティウィンドウを表示するには-
プロパティウィンドウで式に移動し、次の式を
[ODBC Source].[SQLCommand]
に割り当てます。 プロパティ:(詳細については、ODBC SQLCommand式でSSIS変数を渡す方法を参照してください)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
MYTABLE
の場所 はソーステーブル名であり、IDCOLUMN
主キーまたはID列です。
制御フローのスクリーンショット
参照
- ODBCソース-SQLServer
- ODBC SQLCommand式でSSIS変数を渡す方法は?
- SSIS ODBCソースを使用する方法とOLEDBとODBCの違いは?
- 注文後にOracleクエリによって返される行数を制限するにはどうすればよいですか?
- db2から上位n行からn行を取得する
更新1-その他の考えられる回避策
同様の問題を検索しているときに、試すことができるいくつかの追加の回避策を見つけました:
(1)SQLServerの最大メモリを変更する
-
SSIS:バッファマネージャがメモリ割り当て呼び出しに失敗しました
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2)名前付きパイプを有効にする
-
[修正済み]バッファマネージャーは、システムの仮想メモリが不足していることを検出しましたが、バッファをスワップアウトできませんでした
- [コントロールパネル]–>[管理ツール]->[コンピューターの管理]に移動します
- SQLインスタンスのプロトコル->名前付きパイプの設定=
Enabled
- SQLインスタンスサービスを再起動します
- その後、データをインポートしようとすると、一度にすべてをフェッチするのではなく、データをチャンクでフェッチします。それがあなたたちのために働き、あなたの時間を節約することを願っています。
(3)SQLServer2008インストールホットフィックスを使用している場合
- メモリ不足の状態でSSIS2008パッケージを実行すると、SSIS2008ランタイムプロセスがクラッシュします
更新2-エラーを理解する
次のMSDNリンクでは、エラーの原因は次のように説明されています。
仮想メモリは、物理メモリのスーパーセットです。 Windowsのプロセスは通常、使用するプロセスを指定しません。これは、Windowsがマルチタスクを実行する方法を(大幅に)阻害するためです。 SSISは仮想メモリを割り当てます。 Windowsが可能な場合、これらの割り当てはすべて物理メモリに保持され、アクセスが高速になります。ただし、SSISが物理的に使用可能なメモリよりも多くのメモリを要求すると、その仮想メモリがディスクに流出し、パッケージの動作が桁違いに遅くなります。また、最悪の場合、システムに十分な仮想メモリがない場合、パッケージは失敗します。