【问题标题】:How can I speed up multi-row inserts to SQL server?如何加快对 SQL 服务器的多行插入?
【发布时间】:2010-09-29 21:06:10
【问题描述】:

我一次向表中插入大约 400 行(SQL Server 2008)。我已经尝试过 UNION ALL,但这大大减慢了速度。我确定了以下查询:

INSERT INTO table VALUES (a, b,...),(c, d,...),...(x,y,...); 

当我通过 ODBC 进行此查询时,大约需要 400 毫秒(我使用 C++ 并且对 sqlExecDirect 的单次调用会转到 odbc32.dll)。但是,当我在由 Getdate() 包装的 MS SQL Server Management Studio 中运行查询时:

SELECT Getdate()
INSERT INTO ...
SELECT Getdate()

大约需要 10 毫秒。作为比较,在同一台机器上,MySQL 中的相同查询大约需要 20ms。

  1. SELECT Getdata() 是一种可靠的事务计时方法吗?
  2. 为什么 MS SQL Server Management Studio 这么快?
  3. 我可以做些什么来提高性能? ODBC的任何替代品?直接连接到 SQL 服务器?

【问题讨论】:

  • SSMS 查询看起来那么快的原因是因为我多次发送完全相同的查询。只需在原查询中更改一个字母,再次运行'SQL Server parse and compile',执行速度下降到非常接近ODBC的速度。

标签: sql-server performance


【解决方案1】:

第一次连接通常需要一段时间才能建立。这可以解释初始延迟:在 SSMS 中,当您开始查询时,连接已经到位。尝试在同一个 C++ 程序中执行两次插入操作,看看是否会有所不同。

另外:您使用的是什么 ODBC 驱动程序?对于 ODBC,请考虑本机驱动程序:

Driver={SQL Server Native Client 10.0};Server=myServerAddress;
    Database=myDataBase;Uid=myUsername;Pwd=myPassword;

除了 ODBC,您还可以通过 COM 使用 ADO。使用生成的包装器很容易做到这一点。然后您可以使用 OLE DB 进行连接:

Provider=SQLNCLI10;Server=myServerAddress;
    Database=myDataBase;Uid=myUsername; Pwd=myPassword;

【讨论】:

  • 将驱动程序更改为SQL Server Native Client 10.0 并没有影响性能。似乎所有时间都花在“SQL Server 解析和编译时间”上,我认为这是发生的操作在服务器上。我不确定 SQL 服务器在做什么,但是花费 400 毫秒来解析和编译 40kb 的文本似乎太长了。
【解决方案2】:

按照您进行基准测试的方式,您没有捕获编译时间。这样做:

SET STATISTICS TIME ON
GO
INSERT INTO ...

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多