避免在SSIS中完全编写SQL查询

时间:2010-05-17 08:27:35

标签: data-warehouse ssis

在数据仓库项目上工作,给我们教程的人建议我们坚持使用SQL查询而不是定义大量的数据流转换,引用它会在ETL框上消耗大量内存,所以我们宁愿将处理留给数据库框。这真的可取吗?依赖GUI工具而不是在Integration包上执行一堆SQL脚本之间的平衡是什么?

老实说,我希望尽可能避免编写SQL查询。 (但那不是重点。我真的很想客观地看待这一点。)

6 个答案:

答案 0 :(得分:7)

答案是:这取决于你,但你想为任何一份工作选择一种或另一种,并避免在可能的情况下将两者混合。

通常,最好在工具中尽一切可能,或者在存储过程代码中尽一切可能。当您在层之间分配大量逻辑时,系统将变得更难以跟踪和调试。

  • 如果工具可以在没有数据流变得笨拙和复杂的情况下进行转换,那么您可以使用该工具并尝试在查询中使用很少或没有逻辑。这意味着一个单层具有业务逻辑,在哪里找到它应该相当明显。但是,ETL工具倾向于相对较差地处理高度复杂的转换。这种方法的最佳位置是在您拥有大量数据源但转换相对简单的系统上。

  • 如果您有相对复杂的转换,最好将所有业务逻辑和转换放入一个存储过程层。 SQL代码更好地以可维护的方式实现复杂的转换 - 我拥有相当好的权限,银行和保险部门中大约一半的数据仓库项目正是出于这个原因使用这种类型的架构。
    在这种情况下,ETL工具可用于实现相对愚蠢的数据副本。源数据可以基本上逐字地复制到临时区域,然后由执行ETL的存储过程代码的主体拾取。 ETL工具可用于数据副本,批量加载操作,日志记录,日程安排和其他框架任务。

在任何一种情况下,你最好选择一种方法。否则,您最终可以在提取层,数据库视图,数据流和存储过程代码中分布业务逻辑。跨越多层的逻辑更难以测试。

当所有逻辑(例如)包含在存储过程或聚焦ETL转换作业中时,您可以单独测试给定转换。设计的清晰度也有助于维护和审计。

答案 1 :(得分:4)

我发现使用SQl代码不仅运行速度更快,而且开发速度更快,维护起来也更容易。

答案 2 :(得分:3)

通常,当您想要单独处理每一行时,请使用数据流,否则最好使用Sql Command。

就个人而言,我会尽可能地编写SQL。以后更优化(通常)更快更容易。谷歌将提供更详细的答案。

要考虑的另一个因素是您用于连接的提供商。

您需要根据自己的需要做出决定。我们使用postgres DB,因此我们必须为某些进程创建一个临时表加载,从而加快整个过程。

你还应该考虑它运行的盒子,如果你有一个功能强大的数据库盒子和一个小ETL盒子,那么运行任何东西都没有意义。

如果您在ETL框上进行所有处理,您也将在网络上拖动大量数据。

查看以下链接以帮助您入门:

ssistalk.com/category/ssis/ssis-advanced-techniques /

msdn.microsoft.com/en-us/library/ms141031.aspx

weblogs.sqlteam.com/jamesn/Default.aspx

答案 3 :(得分:1)

我认为这是一个棘手的问题;还有一个有趣的。

使用SSIS的一个原因是提高可维护性,恕我直言。如果你在SQL语句中打包所有逻辑(你确定可以!),你倾向于破坏使用SSIS的原因。你不能真正“看到数据流”了。

另一方面,我觉得有时候一个位置很好的SQL语句有它的价值。例如,当您从表中读取数据时,无论出于何种原因,您只需要满足条件XI的行,就不会看到读取整个表的原因,并且在下一步中“大部分条件拆分”。
顺便说一句,我不知道这在性能方面意味着什么。 SSIS是否足够智能以查看正在发生的事情并将“读取整个表格和条件分割”更改为“从中选择Y X”(或者在构建时) /部署)?

最大的问题是在哪里画线。这在一定程度上取决于处理ETL过程的人员。如果每个支持该进程的人都从一开始就知道SQL,那么你可以更好地支持ETL中更多的SQL,而不是你有同事(或者你关心的客户或继承者)那些很难理解你所有SQL中发生的事情。 ,更不用说改变/改进/添加它。

所以我认为最重要的是,在SQL中不使用也不做任何事情都会更好。尝试制定一些符合您要求的简单规则,每个人都可以忍受,然后遵循它们。这使您获得使用SSIS的最大价值。

答案 4 :(得分:1)

SQL Server做得好,其他事情做得不好。我使用SSIS导入或从SQL Server导出数据。在移动过程中,我使用SSIS是有意义的。我可以轻松地按行进行工作,这在SQL Server(游标)中效率不高。要说你不应该在ETL盒子上使用转换和数据流,因为它在ETL盒子上太昂贵就像是说“不要太快开车,因为它会导致引擎工作”。 ETL和SSIS的目的是采取一些SQL Sever不能很好的处理并将其移动到一个引擎。

答案 5 :(得分:1)

为工作使用正确的工具。通常,您在SSIS中执行大多数操作,某些操作在“纯”SQL中完成。

例如,如果你做了很多UPDATE(维度模型中的维度表上的表差异,比如说),你真的不想为每一行执行UPDATE。在这种情况下,您可以定期插入临时表,然后在SQL中执行UPDATE,并加入相应的键。