【问题标题】:Mssql/Perl DBI performance woesMssql/Perl DBI 性能问题
【发布时间】:2011-10-24 23:35:39
【问题描述】:

我正在编写一个应用程序,该应用程序使用 Perl DBI 向远程 mssql 服务器执行大量大型插入操作。不确定它是 05 还是 08 sql server,但到目前为止我已经对它进行了计时并且性能相似。基本上,到目前为止,需要插入的大量行已经成为瓶颈。我在 08 中尝试了多行插入(以及 05 中的子选择 UNION ALL 技巧),更改插入是在前一次提取期间还是之后触发,在单行插入上使用 execut_array(),所有这些都带有/没有绑定参数。

Psuedocode:

select data query
while fetchrow {
  do lots of calculations
  construct insert
  1) do inserts here
}
2) or do inserts here

sql server 上的活动监视器平均每条 70 毫秒的多行插入。查询本身被限制为每条 58 行,因为插入中有 36 个字段,并且很容易达到 2100 个参数的限制。

有什么明显的我忽略了吗?我可以尝试其他任何方法来改善时代吗?忽略延迟或硬件等问题,我觉得必须对我的 Perl 工作流程或查询本身进行另一项改进。 (我正在研究 sql server bcp、批量插入等)。

感谢您的建议

【问题讨论】:

    标签: sql-server perl sql-server-2005 sql-server-2008 dbi


    【解决方案1】:

    execute_array 不会有太大区别,因为它没有在 DBD::ODBC 中实现(因为我从来没有接触过它)。因此,它实际上是 DBI,只是为您重复调用 execute。

    我不明白 58ish 行、36 个参数和达到 2100 个参数限制,尽管我可以看到 58 * 36 几乎是 2100。如果您的插入需要 36 个参数,只需在选择之前准备它并在 while 循环中执行它- 这应该更快,因为不需要在每次插入时传递/解析 SQL。

    除此之外,您可以禁用 AutoCommit 并在最后或定期提交,但每次插入少于一次,它应该会快很多。您还可能在表上有索引/触发器等,这可能会减慢插入速度,因此您可以考虑禁用它们直到之后。

    【讨论】:

    • 感谢您的回复;看到积极的维护者提出建议很酷。是的 2100/36 列 = 每个插入最多 58 行(我讨厌这个,不敢相信这真的是一个硬限制)。我确实准备了一次这样的查询,并且每次都使用绑定参数数组执行。我没有考虑过 AutoCommit - 我也会尝试。出于这个原因,这些表具有最小的(我认为最大为 2)索引!因此,如果我禁用 AutoCommit,我是否必须以 BEGIN TRANSACTION 开始每批查询?或者在您 ->commit() 之前,一切都在事务中?
    • 在 DBI->connect 调用中禁用 AutoCommit,方法是将其设置为 0。要启动 txn,请使用 DBI 的 begin_work,然后进行一些插入,然后进行提交调用(或者如果你想的话,理论上可以回滚将它们回滚并完成 txn)。所以基本上,请阅读 DBI pod 中的提交、回滚和 begin_work。
    • 顺便说一句,当您每次执行仅插入 36 个参数时,我仍然不明白 2100 限制对您有何影响。
    • 我正在使用多行插入查询,例如“INSERT INTO x (a,b,c,...) VALUES (? x 36),(? x 36), ..."跨度>
    【解决方案2】:

    我猜 Perl/DBI 是必需的(因为它可能不在 Windows 上运行)?

    是否有可能使用 BCP(您将编写一个中间文本文件)或 SSIS(您可以在 SSIS 中完成所有操作)甚至 ADO.NET SqlBulkCopy(在某种 .NET 环境中)?所有这些都是专门为大负载设计的。

    【讨论】:

    • 是的 应用程序本身在 ubuntu 服务器上运行。我考虑过BCP,还没有尝试过。这几乎可以像 1)构建我的查询 2)保存到文件(不确定格式之间的差异) 3)将文件推送到 sql server 4)执行 BULK INSERT 查询指定数据文件路径;对吗?
    • @Andrew Parker 是的,基本上就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-07-23
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多