C++ 提高从客户端应用程序到MS SQL 2008数据库的大规模导入速度

C++ 提高从客户端应用程序到MS SQL 2008数据库的大规模导入速度,c++,sql-server-2008,qt,C++,Sql Server 2008,Qt,我有一个Qt应用程序,它读取一个特殊的文本文件,对其进行解析,并将大约100000行插入firebird数据库中的一个临时表中。然后它启动一个存储过程来处理这个临时表,并对永久表应用一些更改。在firebird上将100000行插入内存中的临时表大约需要8秒 现在,我需要使用MS SQL Server 2008实现这种行为。如果我使用简单的串行插入,100000行大约需要76秒。不幸的是,它太慢了。我从以下几个方面看: 临时表(#和#)。以tempdb方案存储在磁盘上。因此没有速度增加 批量插入

我有一个Qt应用程序,它读取一个特殊的文本文件,对其进行解析,并将大约100000行插入firebird数据库中的一个临时表中。然后它启动一个存储过程来处理这个临时表,并对永久表应用一些更改。在firebird上将100000行插入内存中的临时表大约需要8秒

现在,我需要使用MS SQL Server 2008实现这种行为。如果我使用简单的串行插入,100000行大约需要76秒。不幸的是,它太慢了。我从以下几个方面看:

  • 临时表(#和#)。以tempdb方案存储在磁盘上。因此没有速度增加
  • 批量插入。插入速度非常快,但需要客户端或服务器端共享文件夹
  • 表变量。MSDN说:“不要使用表变量来存储大量数据(超过100行)。”
  • 那么,请告诉我,将客户端应用程序的插入速度提高到MSSSSQL2008的正确方法是什么


    谢谢。

    您可以通过或接口使用大容量复制操作

    MSDN文章似乎贯穿了整个过程,对于ODBC:

  • 分配环境句柄和连接句柄

  • 将SQL_COPT_SS_BCP和SQL_BCP_设置为启用大容量复制操作

  • 连接到SQL Server

  • 调用bcp_init设置以下信息:

    • 要进行大容量复制的表或视图的名称

    • 为数据文件的名称指定NULL

    • 用于接收任何大容量复制错误消息的数据文件的名称 (如果不需要消息文件,请指定NULL)

    • 从应用程序到视图的复制方向:DB_IN或 表或DB_从表或视图输出到应用程序

  • 为大容量副本中的每一列调用bcp_bind以将该列绑定到 程序变量

  • 用数据填充程序变量,并调用bcp_sendrow发送 一行数据

  • 在发送了几行之后,调用bcp_batch来检查 行已发送。最好至少调用一次bcp_批处理 每1000行

  • 发送完所有行后,调用bcp_done完成 手术


  • 如果您需要跨平台实现批量复制功能,请查看。

    “但是需要客户端或服务器端共享文件夹”不,没有。谢谢您的回答。我忘了提一下,我的申请表是crosplatform。您能建议我使用Windows和Linux中的ODBC或OLEDB以及可选的MacOS吗?@typbl4跳过OLEDB/ODBC,直接使用FreeTDS。我已经更新了我的答案。