9

外部ユーティリティ (つまり bcp) を使用せずに、Excel テーブル (VBA 配列) から SQL 2008 のテーブルにデータを取得する最速の方法を知っている人はいますか? 私のデータセットは通常 6500 ~ 15000 行、約 150 ~ 250 列であることに注意してください。そして、自動化された VBA バッチ スクリプト中に約 20 ~ 150 個のファイルを転送することになります。

Excel テーブル (VBA) から SQL 2008 に大量のデータを取得する方法をいくつか試しました。以下にリストします。

方法 1. テーブルを VBA 配列に渡し、ストアド プロシージャ (ADO) に送信 -- SQL への送信が遅い

方法 2. 切断された RecordSet を作成し、ロードしてから同期します。-- SQL への送信が非常に遅い

方法 3. テーブルを VBA 配列に配置し、配列をループして連結し (区切り記号を使用)、ストアド プロシージャに送信します。-- SQL への送信は低速ですが、方法 1 または 2 よりも高速です。

方法 4. テーブルを VBA 配列に配置し、配列をループして連結し (区切り記号を使用)、ADO recordset .addnew コマンドで各行を配置します。-- SQL への送信は非常に高速 (方法 1 ~ 3 よりも約 20 倍高速) ですが、別の手順を使用してそのデータを分割する必要があり、かなりの待ち時間が追加されます。

方法 5. テーブルを VBA 配列に入れ、XML にシリアライズし、VARCHAR としてストアド プロシージャに送信し、ストアド プロシージャで XML を指定します。-- SQL への送信が非常に遅い (方法 1 または 2 よりも約 100 倍遅い)

不足しているものはありますか?

4

6 に答える 6

2

さまざまな要因に依存するため、最速の方法は 1 つではありません。SQL のインデックスが構成され、最適化されていることを確認してください。挿入ごとにインデックスを更新する必要があるため、多くのインデックスが挿入/更新のパフォーマンスを低下させます。データベースへの接続は 1 つだけにして、操作中に開いたり閉じたりしないでください。サーバーの負荷が最小のときに更新を実行します。まだ試していない他の唯一の方法は、ADO コマンド オブジェクトを使用して直接 INSERT ステートメントを発行することです。レコードセット オブジェクトの「AddNew」メソッドを使用する場合は、挿入の最後に「UpdateBatch」コマンドを 1 つだけ発行してください。それ以外では、VBA は、入力を受け入れる SQL サーバーと同じ速度でしか実行できません。

編集:すべてを試したようです。また、SQL Server には「Bulk-Logged」復旧モードとして知られるものもあり、トランザクション ログへの大量の書き込みのオーバーヘッドを削減します。調べる価値のあるものかもしれません。データベースの復旧モデルを少しいじる必要があるので面倒かもしれませんが、役に立つかもしれません。

于 2012-05-22T19:50:08.747 に答える
0

これを行う最も速い方法は、T-SQL のBULK INSERT.

いくつかの注意事項があります。

  • 最初にデータを csv にエクスポートする必要がある可能性があります ( Excel から直接インポートできる場合があります。私の経験では、Access .mdbs から SQL Server に移行するため、 csv への暫定的な手順が必要です)。
  • SQL Server マシンはその csv にアクセスできる必要があります (コマンドを実行しBULK INSERTてファイル名を指定する場合、SQL Server が実行されているマシンでファイル名が解決されることに注意してください)。
  • CSV と一致するように、デフォルトFIELDTERMINATORと値を微調整する必要がある場合があります。ROWTERMINATOR

最初にこの設定を行うには試行錯誤が必要でしたが、これまでに試した他のすべての手法と比較して、パフォーマンスの向上は驚異的でした。

于 2012-05-22T20:53:16.947 に答える