2012-03-21 13 views
2

私はQtアプリケーションを持っており、特殊なテキストファイルを読み込んで解析し、約100000行をFirebirdデータベースの一時テーブルに挿入します。次に、ストアド・プロシージャを起動してこの一時表を処理し、永続表にいくつかの変更を適用します。メモリ内のテンポラリ・テーブルに100000行を挿入するには、Firebirdで約8秒かかります。クライアントアプリケーションからのMS SQL 2008データベースへの大量インポート速度の向上

MS SQL Server 2008を使用してこのような動作を実装する必要があります。単純なシリアル挿入を使用すると、100000行で約76秒かかります。残念ながら、それは遅すぎます。私は以下の方法を検討した:

  1. 一時テーブル(#と##)。 tempdbスキームのディスクに格納されます。速度向上はありません。
  2. バルク挿入。非常に良い挿入速度が、クライアントまたはサーバー側の共有フォルダを持つ必要があります。
  3. テーブル変数。 MSDNでは、「大量のデータ(100行以上)を格納するためにテーブル変数を使用しないでください。

クライアントアプリケーションからMSSSQL2008への挿入速度を向上させる正しい方法は何ですか?

ありがとうございます。

+1

「ただし、クライアントまたはサーバー側の共有フォルダを持つ必要があります。いいえ、ありません。 –

答えて

2

OLE DBまたはODBCインターフェイスから利用可能な一括コピー操作を使用できます。

This MSDNの記事はODBCのために、プロセスを通して、あなたの手を保持するようだ:

  1. は、環境ハンドルと接続ハンドルを割り当てます。

  2. SQL_COPT_SS_BCPとSQL_BCP_ONを一括コピー操作を有効にするように設定します。

  3. SQL Serverに接続します。

  4. コールbcp_initは、以下の情報を設定します

    • から一括コピーするテーブルまたはビューの名前またはに。

    • データファイルの名前にNULLを指定します。

    • 一括コピーエラーメッセージ (メッセージファイルが必要ない場合はNULLを指定)を受け取るデータファイルの名前。

    • コピーの方向:アプリケーションからビューへのDB_IN、またはテーブルまたはビューからのアプリケーションへの テーブルまたはDB_OUT。 プログラム変数に列をバインドするために、一括コピーの各列の

  5. コールbcp_bind。

  6. プログラム変数にデータを入力し、bcp_sendrowを呼び出して 行のデータを送信します。

  7. 複数の行が送信された後、すでに送信された行 をチェックポイントするためにbcp_batchを呼び出します。少なくとも1000回の行につき1回、bcp_batchを と呼ぶことをお勧めします。

  8. すべての行が送信されたら、bcp_doneを呼び出して 操作を完了します。

あなたは一括コピー機能のクロスプラットフォームの実装が必要な場合は、FreeTDSを見てみましょう。

+0

あなたの答えをありがとう。言いたいことは、私のアプリケーションはクロスプラットフォームであることです。 WindowsやLinux、オプションのMacOSからODBCやOLEDBで作業するライブラリを私にアドバイスできますか? – typbl4

+0

@ typbl4 OLEDB/ODBCをスキップし、FreeTDSを直進します。私は私の答えを更新しました。 –

関連する問題