在SQL命令和Merge Join中使用Order by / sort优化数百万行的SSIS包

问题描述 投票:3回答:1

嗨,我正在尝试优化SSIS包,当我执行Upsert / delete时,它从远程MariaDB源中的表中获得了大约9300万行。该表还包含大约63列。

目前我在我的软件包中使用Sort和Merge Join,但是我已经阅读了一些指南,建议在服务器中进行排序部分而不是SSIS DT中的排序功能,因为它会对SSIS服务器内存造成负担。

由于我目前在Azure数据工厂中使用此解决方案,因此运行程序包失败(最常见的是Times out,尽管我已经在包侧和Azure数据工厂中增加了Time Out属性)。

建议的解决方法是什么?

如果我理解正确并且正如我之前提到的那样,我可以通过对DB-Server-Side进行排序来跳过SISS服务器上的负载。但由于我是整个SQL和SSIS的新手,我不太确定SQL命令中会出现这种情况。

我也是关于批处理的,但即使在这里我也不确定它在SSIS中是如何工作的。

这里推荐什么?

我的SSIS-Package现在看起来像这样:

我遵循这种类型的例子:Synchronize Table Data Using a Merge Join in SSIS

enter image description here

(仅供参考:红色错误图标在那里,因为我在截图期间丢失了连接,否则这是一个完全有效的解决方案。)

mysql sorting merge ssis azure-data-factory
1个回答
2
投票

我有两个建议:

服务器端排序

在OLE DB源中将访问模式更改为SQL命令。并使用ORDER BY子句:

Select * from table ORDER BY col1, col2

之后,您应该打开OLE DB Source高级编辑器(右键单击OLE DB源,显示高级编辑器)转到列选项卡并将outputIsSorted属性更改为True,并设置更改用于ORDER BY子句中的列的SortKeyPosition

以块的形式读取数据

我不太了解MariaDB SQL语法,但我将在SQLite和Oracle中提供一些示例:


Update 1 - Package problems

包中有一些问题:

  • 您正在从同一张桌子上阅读和书写
  • 您正在对大量数据执行更新和删除表
  • 您正在使用合并加入

一些建议:

  • 尝试使用登台表,而不是从同一个表读取和写入,因为您正在从同一目标表中读取,写入,删除和更新。
  • 在目标表中使用分区,允许从特定分区而不是整个表中删除和更新记录
© www.soinside.com 2019 - 2024. All rights reserved.