2012-03-21 29 views
2

MS SQL 2008數據庫我有一個Qt應用程序,讀取一個特殊的文本文件,分析它,並插入一個Firebird數據庫約有10行到一個臨時表。然後它啓動一個存儲過程來處理這個臨時表並對永久表應用一些更改。在Firebird上插入100000行到內存中的臨時表需要大約8秒。提高大衆進口速度從客戶端應用程序

現在我需要使用MS SQL Server 2008中如果我用簡單的串行插入它需要大約76秒,10萬行來實現這樣的行爲。不幸的是,它太慢了。我看着以下幾種方式:

  1. 臨時表(#和##)。在tempdb方案中存儲在磁盤上。所以沒有提高速度。
  2. 批量插入。非常好的插入速度,但是需要有客戶端或服務器端共享文件夾。
  3. 表變量。 MSDN說:「不要使用表變量來存儲大量數據(超過100行)。」

那麼請告訴我,什麼是正確的方式來提高從客戶端應用程序到MSSSQL2008的插入速度。

謝謝。

+1

「但是需要有客戶端或服務器端共享文件夾」不,沒有。 – 2012-03-21 08:34:05

回答

2

您可以使用通過OLE DBODBC接口提供的批量複製操作。

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行調用bcp_batch至少一次 是一種好習慣。

  8. 所有行發送完畢後,調用bcp_done完成 操作。

如果你需要一個跨平臺實現批量複製功能,看看FreeTDS

+0

感謝您的回答。我忘了提及,我的應用程序是跨平臺的。你能告訴我任何庫可以從Windows和Linux和可選的MacOS使用ODBC或OLEDB嗎? – typbl4 2012-03-21 09:18:07

+0

@ typbl4跳過OLEDB/ODBC並直接進入FreeTDS。我已經更新了我的答案。 – 2012-03-21 09:45:01

相關問題