加载到 Azure SQL DW 中阶段 table 的最佳 SSIS 数据流设置
Optimal SSIS data flow settings to load to stage table in Azure SQL DW
我有一个 350MB table,它有两个 varchar(2000) 列,相当宽。通过 SSIS 数据流,通过 OLEDB "fast load" 目标加载到 Azure SQL DW 需要 60 分钟。我将该数据流的目标更改为 Azure Blob 目标(来自 SSIS Azure feature pack),并且相同的数据流在 1.5 分钟内完成(而来自该新平面文件的 Polybase 大约需要 2 分钟)。
对于另一个来源,我有一个现有的 1GB 平面文件。 SSIS 数据流入 Azure SQL DW 中的 OLEDB 目标需要 90 分钟。将文件复制到 blob 存储,Polybase 加载需要 5 分钟。
SSIS 是 SSIS 2014,它 运行 在与 Azure SQL DW 相同区域的 Azure VM 上。我知道批量加载比 Polybase 慢得多,因为批量加载通过控制节点漏斗,但 Polybase 在所有计算节点上并行化。但是那些批量加载数字非常慢。
为了通过批量加载尽可能快地加载到 Azure SQL DW 阶段 table,SSIS 数据流和目标的最佳设置是什么?除了我没有考虑的任何其他设置之外,我特别对以下设置的最佳值感兴趣:
- Stage table geometry = HEAP(我认为是最快的)
- 数据流设置:
- DefaultBufferMaxRows = ?
- 默认缓冲区大小 = ?
- OLEDB 目标设置
- 数据访问模式 = Table 或视图 - 快速加载
- 保持身份 = 未选中
- 保留空值 = ?
- Table锁=?
- 检查约束 = ?
- 每批行数 = ?
- 最大插入提交大小=?
Polybase 无疑是加载到 SQL DW 的最快方式。您建议的 HEAP 也是最快的目标类型。请查看 SQL CAT 团队在 best practices for loading to Clustered Columnstore using SSIS 上发表的这篇文章。此处工程团队的建议是尝试调整 DefaultBufferMaxRows(默认为 10K)、DefaultBufferSize(默认为 10 MB)、每批行数和最大插入提交大小。
很多年前,我对我们的 Azure SQL 数据仓库 PDW 也称为并行数据仓库或 APS,设备平台系统的本地版本进行了广泛的 SSIS 性能测试。在那次测试中,我经常发现本地 CPU 是瓶颈,特别是单核。如果您监控 CPU 核心利用率,使用 Perfmon 可以清楚地看到这一点。
我可以做几件事来提高吞吐量。如果您 CPU 绑定在单个内核上,运行 多个并发 SSIS 程序包将使您能够利用更多内核,并且 运行 速度更快。为此,您需要将源文件分成多个文件,目标文件应该是多个 tables。如果您对目标进行分区 table,并且每次加载都包含不同的分区,则可以在加载数据后使用分区切换,以便将其合并到单个 table。
您也可以尝试在您的包中创建多个数据流,这将实现与 运行并行使用多个 SSIS 加载程序相同的性能,但我相信您仍然需要将源文件分解为多个文件以及目标,多个 tables 以最大化吞吐量。
我尝试的另一种方法是在一个数据流中使用并行加载器。虽然这比一个加载器快,但比我上面提到的前两种方法慢。
我还发现,如果我让 SSIS 执行字符到二进制字符的转换,这会加快加载速度。此外,使用 SQL 的来源比使用文本文件作为来源更快。
您可以尝试的另一件事是 SSIS Balanced Data Distributor。 BDD 是另一种在源系统上利用多个内核而无需 运行 多个并发 SSIS 包的方法。
当您 运行 您的 SSIS 包时,请使用 perfmon 监控 CPU 以查看您是 运行 在单个内核上还是分布在多个内核上。如果您固定一个内核,那么这很可能是您的瓶颈。
另外,关于 VARCHAR(2000) 列。如果您真的不希望传入数据达到这个大小,请减小 VARCHAR 列的大小。虽然我们将来会改进此行为,但目前我们的数据移动服务会将您的 VARCHAR 数据填充到固定长度。这当然意味着如果最宽值远小于 2000 个字符,则移动的数据多于所需数据。
希望对您有所帮助。
我有一个 350MB table,它有两个 varchar(2000) 列,相当宽。通过 SSIS 数据流,通过 OLEDB "fast load" 目标加载到 Azure SQL DW 需要 60 分钟。我将该数据流的目标更改为 Azure Blob 目标(来自 SSIS Azure feature pack),并且相同的数据流在 1.5 分钟内完成(而来自该新平面文件的 Polybase 大约需要 2 分钟)。
对于另一个来源,我有一个现有的 1GB 平面文件。 SSIS 数据流入 Azure SQL DW 中的 OLEDB 目标需要 90 分钟。将文件复制到 blob 存储,Polybase 加载需要 5 分钟。
SSIS 是 SSIS 2014,它 运行 在与 Azure SQL DW 相同区域的 Azure VM 上。我知道批量加载比 Polybase 慢得多,因为批量加载通过控制节点漏斗,但 Polybase 在所有计算节点上并行化。但是那些批量加载数字非常慢。
为了通过批量加载尽可能快地加载到 Azure SQL DW 阶段 table,SSIS 数据流和目标的最佳设置是什么?除了我没有考虑的任何其他设置之外,我特别对以下设置的最佳值感兴趣:
- Stage table geometry = HEAP(我认为是最快的)
- 数据流设置:
- DefaultBufferMaxRows = ?
- 默认缓冲区大小 = ?
- OLEDB 目标设置
- 数据访问模式 = Table 或视图 - 快速加载
- 保持身份 = 未选中
- 保留空值 = ?
- Table锁=?
- 检查约束 = ?
- 每批行数 = ?
- 最大插入提交大小=?
Polybase 无疑是加载到 SQL DW 的最快方式。您建议的 HEAP 也是最快的目标类型。请查看 SQL CAT 团队在 best practices for loading to Clustered Columnstore using SSIS 上发表的这篇文章。此处工程团队的建议是尝试调整 DefaultBufferMaxRows(默认为 10K)、DefaultBufferSize(默认为 10 MB)、每批行数和最大插入提交大小。
很多年前,我对我们的 Azure SQL 数据仓库 PDW 也称为并行数据仓库或 APS,设备平台系统的本地版本进行了广泛的 SSIS 性能测试。在那次测试中,我经常发现本地 CPU 是瓶颈,特别是单核。如果您监控 CPU 核心利用率,使用 Perfmon 可以清楚地看到这一点。
我可以做几件事来提高吞吐量。如果您 CPU 绑定在单个内核上,运行 多个并发 SSIS 程序包将使您能够利用更多内核,并且 运行 速度更快。为此,您需要将源文件分成多个文件,目标文件应该是多个 tables。如果您对目标进行分区 table,并且每次加载都包含不同的分区,则可以在加载数据后使用分区切换,以便将其合并到单个 table。
您也可以尝试在您的包中创建多个数据流,这将实现与 运行并行使用多个 SSIS 加载程序相同的性能,但我相信您仍然需要将源文件分解为多个文件以及目标,多个 tables 以最大化吞吐量。
我尝试的另一种方法是在一个数据流中使用并行加载器。虽然这比一个加载器快,但比我上面提到的前两种方法慢。
我还发现,如果我让 SSIS 执行字符到二进制字符的转换,这会加快加载速度。此外,使用 SQL 的来源比使用文本文件作为来源更快。
您可以尝试的另一件事是 SSIS Balanced Data Distributor。 BDD 是另一种在源系统上利用多个内核而无需 运行 多个并发 SSIS 包的方法。
当您 运行 您的 SSIS 包时,请使用 perfmon 监控 CPU 以查看您是 运行 在单个内核上还是分布在多个内核上。如果您固定一个内核,那么这很可能是您的瓶颈。
另外,关于 VARCHAR(2000) 列。如果您真的不希望传入数据达到这个大小,请减小 VARCHAR 列的大小。虽然我们将来会改进此行为,但目前我们的数据移动服务会将您的 VARCHAR 数据填充到固定长度。这当然意味着如果最宽值远小于 2000 个字符,则移动的数据多于所需数据。
希望对您有所帮助。