我有一个带有执行 SQL 任务的大型 SSIS 包,它从 14 个不同的源读取数据,通过 Union All 运行它们,然后通过所有相同的转换。问题是,同时运行 14 个大型 SELECT 会阻塞服务器。我宁愿他们按顺序运行。但是由于它们都必须经过相同的转换集,我真的不想将它们分成单独的任务。
有没有办法将包配置为一次执行一个(甚至一次两个)而不是一次执行 OLE DB 源?
我有一个带有执行 SQL 任务的大型 SSIS 包,它从 14 个不同的源读取数据,通过 Union All 运行它们,然后通过所有相同的转换。问题是,同时运行 14 个大型 SELECT 会阻塞服务器。我宁愿他们按顺序运行。但是由于它们都必须经过相同的转换集,我真的不想将它们分成单独的任务。
有没有办法将包配置为一次执行一个(甚至一次两个)而不是一次执行 OLE DB 源?
理想情况下,您只需更改 ETL 管道以将所需数据导入暂存环境,然后使用 SQL 而不是 SSIS 活动对该数据进行转换,因为这会更有效并为您提供更大的灵活性。
也就是说,一个可能可行的选项(这有点麻烦)是将您的 Execute SQL 任务与另Success
一条路径进行菊花链式连接,因此每个任务都流向 Union All 和(除非链中的最后一个)下一个执行 SQL 任务,有点像这样:
Execute SQL Task 1 -------+
| |
v |
Execute SQL Task 2 -----+ |
| | |
v | |
Execute SQL Task 3 ---+ | |
| | | |
v | | |
Execute SQL Task 4 -+ | | |
| | | |
v v v v
Union All ---> Rest of package
如果您(可以理解)对 SSIS 开发的重复性感到有点沮丧,我建议您研究Biml以自动化实际的包创建。链接版本“BimlExpress”是一个免费的 Visual Studio 插件,一旦您熟悉它,它就可以节省大量时间。
如果您将转换定义为 SQL 语句,您可以提供提取元数据、转换存储过程和基于这些的目标模式,以一次性生成您的 SSIS 项目。至少您可以将提取任务的创建自动化到暂存环境中。