从客户端应用程序增加到MS SQL 2008数据库的大量导入速度

时间:2012-03-21 08:32:18

标签: c++ sql-server-2008 qt

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

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

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

    谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用OLE DBODBC接口提供的批量复制操作。

This MSDN文章似乎抓住了整个过程,对于ODBC:

  
      
  1. 分配环境句柄和连接句柄。

  2.   
  3. 设置SQL_COPT_SS_BCP和SQL_BCP_ON以启用批量复制操作。

  4.   
  5. 连接到SQL Server。

  6.   
  7. 调用bcp_init设置以下信息:

         
        
    • 要从中批量复制的表或视图的名称。

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

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

    •   
    • 副本的方向:从应用程序到视图的DB_IN或   表或视图中的表或DB_OUT到应用程序。

    •   
  8.   
  9. 为批量复制中的每个列调用bcp_bind以将列绑定到a   程序变量。

  10.   
  11. 用数据填充程序变量,并调用bcp_sendrow发送一个   一行数据。

  12.   
  13. 在发送了几行之后,调用bcp_batch来检查点   已发送的行。最好至少调用一次bcp_batch   每1000行。

  14.   
  15. 发送完所有行后,调用bcp_done完成   操作

  16.   

如果您需要批量复制功能的跨平台实施,请查看FreeTDS