Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高MS Access插入性能 我有一个C++程序,使用OLeDB连接将大约一百万的记录插入到MS Access数据库中。为此,我在查询中运行了数百万次INSERT,以便插入需要相当长时间的记录_C++_Ms Access_Oledbconnection - Fatal编程技术网

如何提高MS Access插入性能 我有一个C++程序,使用OLeDB连接将大约一百万的记录插入到MS Access数据库中。为此,我在查询中运行了数百万次INSERT,以便插入需要相当长时间的记录

如何提高MS Access插入性能 我有一个C++程序,使用OLeDB连接将大约一百万的记录插入到MS Access数据库中。为此,我在查询中运行了数百万次INSERT,以便插入需要相当长时间的记录,c++,ms-access,oledbconnection,C++,Ms Access,Oledbconnection,数据是以数组的形式在程序中生成的,这是否是我可以在一个步骤中将数据加载到数据库中以提高性能的其他方法 谢谢 当前用于插入记录的循环 for (int i = 0; i < populationSize; i++){ insertSQL = "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";` outputDBConn->runSQLEdi

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

谢谢

当前用于插入记录的循环

for (int i = 0; i < populationSize; i++){
    insertSQL = "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";`
    outputDBConn->runSQLEdit(insertSQL);
}
为每个insert语句打开/关闭连接似乎效率很低

标准方法类似于:

  • 打开连接
  • 启动事务(如果支持)。(这对于具有事务的数据库通常非常重要。)
  • 插入。根据需要重复此步骤
  • 提交事务(如果支持)
  • 密切联系
  • 更新:以下内容不适用于MS Access。从文本进行访问。它仅支持从现有数据源插入多行。(尽管这是一个可行的方法。无论如何,最重要的是限制交易数量。)

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

    如果我们已经让“大容量插入”库/模块四处浮动,我也不会感到惊讶。。。我不使用MS Access,所以我只希望上述建议会有所帮助:-)


    愉快的编码。

    不要在每个命令中插入一个。 将代码更改为如下内容:

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

    我不确定命令的最大缓冲区大小是多少,所以请执行一些检查,然后获得最佳值,以便在每次X插入时执行一些“中断”。

    MS Access和一百万条记录似乎不是一对好组合。您听说过SQLite吗?将数组写入CSV并一步将其加载到Access中可能是最快的方法。请确保在加载数据的表上没有索引。谢谢,但在我看来,MS Access一次不支持多个SQL命令,因此每次只能执行一次插入操作……谢谢pst,在我将打开/关闭操作移出循环后,访问时间要短得多。不幸的是,MS Access一次只支持一个SQL命令……@Raymond:(我发现了这一点,这是同意的。请确保,像另一篇文章一样,您使用单个事务(或多个批处理事务),以避免每次插入后自动提交的开销。(如果您仅达到大约60行/秒,我会怀疑事务限制了吞吐量。)
    string strSQLCommand;
    for (int i = 0; i < populationSize; i++){
    strSQLCommand += "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";`
    }
    outputDBConn->runSQLEdit(strSQLCommand );