Mssql / Perl DBI性能问题

时间:2011-08-11 13:11:00

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

我正在编写一个应用程序,它使用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上的活动监视器平均每行70ms的多行插入。查询本身被限制为每行58行,因为插入上有36个字段,并且很容易达到2100参数限制。

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

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

execute_array不会有太大的区别,因为它没有在DBD :: ODBC中实现(因为我从来没有实现它)。因此,真的是DBI只是为你重复执行execute。

我不理解58行,36个参数并达到2100参数限制,虽然我可以看到58 * 36几乎是2100.如果你的插入需要36个参数,只需在select之前准备它并在while循环中执行它 - 这应该更快,因为每次插入都不需要传递/解析SQL。

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

答案 1 :(得分:1)

我认为Perl / DBI是一个要求(因为这可能不在Windows上运行)?

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