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

Increasing mass import speed to MS SQL 2008 database from client application

本文关键字:SQL MS 2008 数据库 速度 导入 大规模 客户端 应用程序      更新时间:2023-10-16

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

现在我需要使用MSSQLServer2008来实现这样的行为。如果我使用简单的串行插入,100000行大约需要76秒。不幸的是,它太慢了。我看了以下方式:

  1. 临时表(#和##)。以tempdb方案存储在磁盘上。因此没有速度增加
  2. 大容量插入。非常好的插入速度,但需要有客户端或服务器端共享文件夹
  3. 表变量。MSDN说:"不要使用表变量来存储大量数据(超过100行)。"

所以,请告诉我,提高客户端应用程序到MSSSQL2008的插入速度的正确方法是什么。

谢谢。

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

这篇MSDN文章似乎在整个过程中都握着你的手,对于ODBC:

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

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

  3. 连接到SQL Server。

  4. 调用bcp_init设置以下信息:

    • 要从或向中大容量复制的表或视图的名称。

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

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

    • 复制的方向:从应用程序到视图的DB_IN或表或DB_OUT。

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

  6. 用数据填充程序变量,并调用bcp_sendrow发送数据行。

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

  8. 发送完所有行后,调用bcp_done以完成活动

如果您需要批量复制函数的跨平台实现,请查看FreeTDS。