2011-12-22 68 views
2

我有一個C++程序,使用OLEDBConnection向MS Access DB插入大約一百萬條記錄。爲此,我運行INSERT INTO查詢了數百萬次,以便獲取插入的記錄需要相當長的時間。如何提高MS Access INSERT性能

數據是以數組的形式在程序中生成的,那是否可以通過其他方式將數據加載到數據庫中以提高性能?

謝謝!

環路我使用插入運行SQL查詢

void DBConnector::runSQLEdit(String^ query){ 
    SQLCMD = gcnew OleDbCommand(query, dbConnection); 
    SQLCMD->CommandTimeout = 30; 
    dbConnection->Open(); 
    SQLCMD->ExecuteNonQuery(); 
    dbConnection->Close(); 
    } 
+1

MS Access和一百萬條記錄似乎不是一對好人。你聽說過SQLite嗎? – 2011-12-22 08:13:36

+0

將數組寫入CSV並將其加載到Access中可能最快。確保您在加載數據的表上沒有索引。 – Fionnuala 2011-12-22 11:48:45

+0

偉大的呼喚Remou! – Raymond 2011-12-30 08:07:08

回答

3

看來非常低效打開/關閉每個INSERT語句中的連接記錄當前

for (int i = 0; i < populationSize; i++){ 
    insertSQL = "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";` 
    outputDBConn->runSQLEdit(insertSQL); 
} 

方法。

標準的方法去是這樣的:

  1. 打開連接。
  2. 如果支持,啓動事務。 (這通常是很重要,對於有交易的數據庫。)
  3. 插入。 根據需要重複此步驟。
  4. 提交事務(如果支持)。
  5. 關閉連接。

更新:以下內容不適用於MS Access。從文字訪問does not support inserting multiple rows。它只支持從現有數據源插入多行。 (雖然這裏是一個"workabout"可能的工作。在任何情況下,最重要的事情可能會限制交易的數量。)

可以做

一兩件事是建立一個插入命令,增加了多個記錄一次。這可以通過多個語句或多記錄插入(如果支持)來完成。它可能會或可能不會明顯快於上面的(取決於其他因素,如網絡延遲和數據庫引擎),並可能需要進行調整以適應數據庫的限制(例如,可能只適用於少數一次記錄數百條記錄)。這應該只有如上所述適當的連接/交易使用後才被考慮。

如果我們已經制作了「批量插入」庫/模塊,並且我不使用MS Access,我不會感到驚訝,所以我只能希望上面的建議有幫助:-)

快樂編碼。

+0

感謝pst,我把開放/關閉的東西移出循環之後訪問時間要短得多。不幸的是,MS Access一次只支持1個SQL命令.... – Raymond 2011-12-30 08:02:17

+0

@Raymond :(我發現這[如何插入多行](http://stackoverflow.com/questions/1212943/sql-code-to-insert -multiple-rows-in-ms-access-table),這是一致的。確保像這個其他文章一樣,你使用一個單獨的事務*(或多個批處理事務)來避免在每個INSERT之後自動提交的開銷(如果你只能達到每秒60行左右,我會懷疑事務限制了吞吐量。) – 2011-12-30 08:14:14

1

每個命令不要做一次插入。 你的代碼更改爲類似做法是:

string strSQLCommand; 
for (int i = 0; i < populationSize; i++){ 
strSQLCommand += "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";` 
} 
outputDBConn->runSQLEdit(strSQLCommand); 

我不知道什麼是命令的最大緩衝區大小,所以做一些檢查,然後拿去做一些「斷裂」的最佳值每一次X插入。

+0

謝謝,但在我看來,MS Access一次不支持多個SQL命令,因此每次只能執行一次插入..... – Raymond 2011-12-30 08:00:37