如何提高MS Access INSERT性能



我有一个c++程序,使用OLEDBConnection将大约一百万条记录插入MS Access DB。为了做到这一点,我运行INSERT INTO查询百万次,以获得插入的记录,这需要相当长的时间。

数据以数组的形式在程序中生成,是否有其他方法可以将数据加载到数据库中,从而在一个单一的步骤中提高性能?

谢谢!

用于插入当前记录的循环

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

方法运行SQL查询

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

似乎非常低效为每个插入语句打开/关闭连接。

标准的方法是这样的:

  1. 打开连接。
  2. 启动事务,如果支持。(对于具有事务的数据库,这通常非常重要。)
  3. 插入。根据需要重复此步骤
  4. 提交事务,如果支持。
  5. 紧密联系。

Update:以下内容不适用于MS Access。Access不支持从文字插入多行。它只支持从现有数据源插入多行。(尽管这里有一个可能有效的"变通方法"。在任何情况下,最重要的事情可能是限制事务的数量。

还可以做的一件事是构建一个单个插入命令,一次添加多个记录。这可以通过多个语句或多记录插入(如果支持)来完成。它可能比快,也可能不会比快(取决于其他因素,如网络延迟和数据库引擎),并且可能需要调整以适应数据库的限制(例如,一次可能只适用于几百条记录)。在如上所述的正确连接/事务使用之后,应该只考虑

如果我们已经制作了"批量插入"库/模块,我不会感到惊讶……我不使用MS Access,所以我只能希望上面的建议是有帮助的:-)

快乐编码。

每个命令不要只插入一个。把你的代码改成这样:

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

我不确定命令的最大缓冲区大小,所以做一些检查,然后得到最佳值,在每个X插入做一些"休息"

相关内容

  • 没有找到相关文章

最新更新