質問: 夜間には、ODBCソースからSQL Server 2005のテーブルを800万以上のレコードで埋める必要があります。現在、私はリンクされたサーバーから構文を選択して、次のようなinsert文を使用しています: ``` Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable') ``` これは実際には効率が悪く、実行に数時間かかる。私はこの質問にあるコードに似たSqlBulkInsertコードを使ってソリューションをコーディングしています。 その質問のコードは、最初にメモリ内にデータテーブルを作成し、そのデータテーブルをSqlBulkInserts WriteToServerメソッドに渡します。 実装されたデータテーブルに、実行しているマシンで使用できるメモリ(私の場合は16GBのメモリを搭載したサーバ)より多くのメモリを使用する場合、どうすればよいですか? 私はオーバーロードされたODBCDataAdapterのfill.aspx)メソッドを使用して、xからnまでのレコードのみを記入することを考えました(xは開始インデックス、nは記入するレコードの数です)。しかし、それは、ソース上でselect文を何度も再実行することを意味するので、私が現在持っているものよりもさらに遅い解決策になる可能性があります。 私は何をすべきか?一度にすべてのものを取り込み、OSにメモリを管理させるだけですか?私はそれを塊で埋めるべきですか?私が考えていない別の解決策がありますか?
回答: 最も簡単な方法は、odbcデータソースに対してExecuteReader()を使用し、 IDataReaderをWriteToServer(IDataReader)オーバーロードに渡すことです。 ほとんどのデータ・リーダの実装では、全体の結果のうちのごく一部しかメモリに保持されません。