【问题标题】:SSIS union all vs sql server Union AllSSIS联合全部与sql server联合全部
【发布时间】:2017-09-03 08:11:22
【问题描述】:

我使用 SQL Server 2012 和 SSIS。我在同一服务器和同一数据库中有两个表。我需要将两个表的所有记录都转移到第三个表中。

我需要在 UNION ALL 的结果中添加一些列(如执行 ID 和一些包参数),然后我必须将记录转移到第三个表中。

我有两种解决方案,但我不知道哪个更有效。

解决方案 1:在 SSIS 中使用两个 OLE DB DataSources 并使用 Union All Component

解决方案 2:在 SQL Server 端使用 Union All,在 SSIS 中只使用一个 OLE DB Source

哪个效率更高?

【问题讨论】:

  • 我赌的是后者,但你注意到时差了吗?对我来说,减少对数据源的调用更有意义。
  • 我应该说您的第二个选项更有效,因为您正在对 sql 数据库进行联合,并且您只对数据库进行一次调用。执行时有很大的时差吗?
  • 现在,我的表每张不到 10000 行。但未来他们将拥有超过百万行。因此,我想在这里选择最佳实践,并且在某些包中我需要 UNION 两个以上的表
  • IMO,当您需要合并来自两个不同来源的数据时,您应该只使用联合所有数据流组件,即使这样,我也可能更喜欢将数据拉入登陆表并在上执行 UNION ALL目标服务器。
  • 如果第三张表也在同一台服务器上,那为什么还要使用 SSIS?难道你不能只写一个简单的 SQL 语句来完成所有这些吗?

标签: sql-server tsql ssis sql-server-2012 union-all


【解决方案1】:

尽可能始终支持数据库操作。如果 2 个表在同一个数据库中,那么绝对没有理由支持 SSIS 操作而不是查询优化器。 Union All 是一个无阻塞操作,因此在这种情况下几乎没有区别,但如果这是一个连接或更复杂的操作,那么查询优化器就会发挥作用。

使用数据库解决方案作为经验法则。

【讨论】:

  • 您可能在 SSIS 中执行此操作的一个原因是您更喜欢 SSIS 的开发和调试风格。但是对于性能,当然,对于在同一个数据库中这样的事情,你会喜欢数据库查询。
  • 好答案。我只想指出,union all 是部分阻塞的转换,而不是非阻塞的转换。
【解决方案2】:

您也可以考虑在简单的执行 SQL 任务中进行。

Insert into T3
select * from T1
union all
select * from T2

【讨论】:

  • 如果第三张表在同一个数据库中,那当然是最佳方式。
【解决方案3】:

很抱歉不同意Cafe Con Leche,但是一旦您对SSIS 感到满意,您应该始终在TSQL 上使用SSIS 任务。除了排序操作,SSIS 通常更快,并且提供非常容易设置的错误处理(包括被重定向到稍后处理/修复的“坏”行)和日志记录。几乎可以在 SSIS 中完成的任何事情都可以在 TSQL 中完成(尤其是如果您习惯使用 sp_cmdshell),但是在 SSIS 中内置的 TSQL 中进行日志记录和错误处理要困难得多。

【讨论】:

  • 我同意你在这里所说的一切,除了“SSIS 通常更快”位。选择通常取决于最适合您的技能。 SSIS 绝对有错误处理和审计的优势,清晰的视觉风格也是如此。当然,我更喜欢 ETL 的 SSIS。但是说 SSIS 通常更快是不正确的 - 对于连接到同一数据库中的其他表和联合所有的事情来说,它确实不会更快。在许多情况下它可能会更快 - 像往常一样,这取决于。我真的没有让人们说你应该总是在 SSIS 上使用 T-SQL,或者在 T-SQL 上使用 SSIS。
  • 对非常大的表进行联接,然后对结果集进行转换操作,根据我的经验,在 SSIS 中通常更快。 tSQL 解决方案之所以获得如此多的选票,是因为对于唯一工具是锤子的木匠来说,一切看起来都像钉子。当用户只通过 gui 了解 SSIS 时,他们害怕使用它直接创建包。
  • SSIS 效率很高,而且做的很好。我同意你关于有些人喜欢 T-SQL 的原因:因为它是他们所知道的。但我不确定你对数据库中连接/转换比 SSIS 慢的看法是否正确。这将取决于用例。
  • 当你有一个大包并且你有许多 SQL 任务步骤时,优化它并记录这些步骤很有挑战性。如果有人实际尝试 TSQL 和 SSIS 中的各种任务来查看时间,那会很有趣。如果有人这样做,结果只有在表格非常大时才有意义。
  • 原始问题中的示例是微不足道的,使用其中一个确实没有区别。我建议的是“经验法则”。如果所有表都来自同一个数据库,则查询优化器在大多数情况下会更快。对于连接和其他转换,查询优化器将使用现有索引和统计信息来创建适当的执行计划。如果您的用例包括将行重定向到其他特定的 etl 操作,那么您当然需要 ETL 构造来解决您的场景。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多