【问题标题】:Optimizing SQL inserts for a third party ETL program为第三方 ETL 程序优化 SQL 插入
【发布时间】:2011-02-08 16:39:53
【问题描述】:

我们目前有一家供应商拥有一个定制的 ETL 包(它是更大程序的一部分),似乎需要很长时间才能完成。

我们当前的设置运行的是 SQL Server 2008 R2 标准版。涉及两台服务器,SQL Server 和另一台称为批处理服务器的服务器。基本上发生的事情是 Batch 服务器向 SQL Server 发出请求以获取表中的一组行,它将这些行存储在 Batch 服务器的内存中,并在此处进行多次转换。一旦数据被转换/清理,它就需要被加载回数据库服务器上的几个不同的表中。目前这是通过包装在 SP_PREPARE 中的一系列插入语句来完成的。然后,它对需要插入的每一行(数千万次)运行一次 sp_execute 语句。

我使用 IBM Datastage 已经有一段时间了,但我似乎记得它在默认情况下尝试类似地执行这些插入操作,结果速度非常慢。

我已经提到让他们导出一个包含修改后数据的数据文件,并允许我们批量导入这个文件,但是将数据导出到一个文件据说会对他们的代码进行重大更改,并且可能不是一个选项。

任何建议或想法将不胜感激!

安德鲁

【问题讨论】:

  • 如果您当前供应商的整个流程是围绕执行此操作的效率最低的方式设计的,那么可能是时候寻找其他供应商了...
  • 相信我,我不止一次建议过!谢谢你证实了我的恐惧! :-)
  • ha,significant change to their code,在他们的循环中调用每个 sp_execute 的每一行,只需写入一个文件
  • 我完全同意KM!做出这样的改变不应该是火箭科学。我主要是想看看是否还有其他关于如何有效地将数据返回数据库的想法,因为我已经没有想法了。在过去的两个月里,我刚刚结束了另一个项目,供应商一直在用数据库中的游标执行类似的任务,至少我能够自己修复他们的代码,这个他们工作的所有逻辑都在 java在另一台服务器上程序...

标签: sql-server sql-server-2008 insert etl


【解决方案1】:

回应上面 JNK 的评论。在不更改代码的情况下您可以做很多事情,但是您可以做的一件事是在插入之前删除目标上的索引并在之后重建它们。在每一行之后重建索引可能会大大减慢进程。

【讨论】:

  • 感谢 Chris,我们昨天与供应商进行了讨论,并将其作为潜在的改进提供(至少在插入期间它应该节省 IO)。然而,它变得更好,他们插入的表相当窄,可能总共有 10 列,其中有 4 个非聚集索引,一个是唯一索引,但没有聚集索引!我们仍在等待这个问题的答案,但我不想让我的帖子比我已经拥有的更混乱:-)
  • 这太残酷了。我唯一的其他建议(由于害怕最终被大量否决而没有提供)是向它扔硬件。
  • 好吧,他们决定接受性能而不是修改代码,谢谢大家的 cmets,如果没有别的,确认我的恐惧。
【解决方案2】:

如果他们使用 OLEDB Destination 控件,有几件事会影响插入速度:

  1. 将其设置为快速加载并推送任何 重复(通过错误输出)到 溢出表可以是 使用常规表重新插入 加载。正常速度负载至少为 慢 2 个数量级 快速加载。
  2. 设置 任务上的 DefaultBufferMaxRows 控制更高以批量插入更多 一批中的物品。然而,即使 1 批量复制强制 整个批次到错误输出。

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 2011-09-20
    • 2011-05-06
    • 2014-03-21
    • 2012-10-16
    • 1970-01-01
    • 2014-08-30
    • 2012-03-12
    相关资源
    最近更新 更多