【问题标题】:Updating Data Warehouse via ADO.NET Connection通过 ADO.NET 连接更新数据仓库
【发布时间】:2018-07-17 03:23:24
【问题描述】:

我构建了一个 SSIS 包,它查看源表并将此数据推送到 Azure 中的数据仓库。到目前为止,它添加了不在仓库中但在源表中的条目。我对如何执行此包的更新部分感到困惑,其中数据仓库包含与源表相同的条目,但需要更新以反映对源表所做的更改。

对于 OLE DB 连接,目标高级编辑器的“自定义选项”部分中有一个“SQL”参数。 ado.net 目的地高级编辑器没有这种能力。更新这些条目的正确方法是什么?

这是到目前为止我的包裹的屏幕截图:

我进行了广泛的搜索,但找不到明确的答案。如果这是一个简单的解决方案,请原谅我的错误。

【问题讨论】:

  • 您会发现 ELT 方法的效率要高得多,例如效率提高 10 倍。 ELT = 从源中提取,直接加载到临时表,然后使用 T-SQL 进行转换。如果您只是将这两个源加载到临时表中,则可以用 T-SQL 替换其余的源。如果您开始处理大数据量,那么这种方法并没有减少它。排序和 OLEDB 命令只是不能针对大型数据集进行扩展......它们确实需要永远(不必要)
  • 我将重新调整我的计划并尝试一下,10 倍的效率听起来很棒。我的数据集还不是很大,但它们正在到达那里。

标签: sql sql-server azure ssis


【解决方案1】:

您有两种可能的方法 - 使用 OLEDB 命令更新和使用中间表更新。

OLEDB 命令转换对数据转换中的每一行数据块运行指定的命令。您只需将 OLEDB 命令添加到数据转换中,选择 OLEDB 连接管理器 并像这样输入参数化 SQL 命令 点击省略号打开 SQL 命令编辑器窗口
使用参数设置 SQL 命令后,您可以将数据流中的字段绑定到下一个选项卡上的参数
就是这样!更多信息 - MS Docs.
这种方法的优点 - 它很简单。缺点 - 对于每个更新行,都会触发一个单独的 SQL 命令,这对性能不利。

然后你有一个通过中间表更新的替代方案。主要思想 - 您将所有要更新的表行存储在一个特殊的表中。然后 - 使用 SQL 更新运行 SQL 命令,如

Update [tgt_tbl] Set [tgt_tbl].[field1] = [interm_tbl].[field1] 
    From [tgt_tbl] tgt  
    Inner Join [interm_tbl] itbl On tgt.key = itbl.key

这种方法更复杂,但性能肯定更好。

【讨论】:

  • 这将是一个好方法,但我不能使用 OLE DB,因为它不受 azure 数据仓库的完全支持。
  • 我实际上错了,您建议的第二种方法是我最终会使用它的样子。谢谢!
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多