Sql server Mssql/Perl DBI性能问题

Sql server Mssql/Perl DBI性能问题,sql-server,perl,sql-server-2005,sql-server-2008,dbi,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

我正在编写一个应用程序,它使用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行,因为insert上有36个字段,并且很容易达到2100参数限制

有什么明显的东西我忽略了吗?有没有其他方法可以提高时间?忽略延迟或硬件等问题,我觉得我的Perl工作流程或查询本身必须有另一个改进。(我正在研究sql server bcp、批量插入等)


感谢您提供的任何建议

execute\u数组不会有太大的区别,因为它不是在DBD::ODBC中实现的(因为我从未接触过它)。因此,实际上DBI只是为您反复调用execute

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


除此之外,您还可以在最后或定期禁用“自动提交”和“提交”,但每次插入不到一次,速度应该会快得多。表中可能还有索引/触发器等,它们会降低插入速度,因此您可以在以后再禁用它们。

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


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

是的,应用程序本身在ubuntu服务器上运行。我考虑过BCP,还没有尝试过。这就像1)构造我的查询2)保存到文件(不确定格式之间的差异)3)将文件推送到sql server 4)执行指定数据文件路径的批量插入查询;是吗?@Andrew Parker是的,基本上就是这样。谢谢你的回复;看到积极的维护人员给出建议很酷。是的,2100/36列=每次插入最多58行(我讨厌这个,不敢相信这真的是一个硬限制)。我只准备了一次这样的查询,每次都使用绑定参数数组执行。我还没有考虑过自动提交-我也会尝试一下。正是因为这个原因,这些表的索引最少(我认为最大值是2个)!因此,如果禁用自动提交,是否必须用BEGIN事务启动每批查询?或者,在->提交()之前,所有内容都在事务中吗?通过将DBI->connect调用中的AutoCommit设置为0来禁用它。要启动txn,请使用DBI的begin_工作,然后执行一些插入,然后执行提交调用(或者如果希望回滚并完成txn,则在理论上是回滚)。因此,基本上,请阅读DBI pod中的提交、回滚和开始工作。顺便说一句,当每次执行仅插入36个参数时,我仍然不了解2100限制对您的影响。我使用多行插入查询,例如“插入x(a,b,c,…)值(?x 36),(?x 36),…”