分期 Table 性能设计

Staging Table Design for Performance

我的 Azure SQL 数据仓库中有一个典型的星形图案。数据首先通过数据工厂转储到暂存表中,然后它调用一个主过程,该过程调用其他过程将数据转换为适当的格式,然后清除该数据块的暂存表。

这些暂存表应该有索引吗?他们应该有统计数据吗?我最近升级到第 2 代,但没有打开自动创建统计信息。我担心统计数据会创建但不会更新,因此最终会减慢速度。

有关更多上下文,有一个重建索引和更新统计信息的过程,该过程每天 运行 过夜一次。数据加载过程 运行 每小时一次。

考虑到这些是 table 阶段,最大的影响将来自以下方面。

尽可能使用散列分布。当您在后续步骤中处理 table 时,这将提供最佳性能。虽然文档有时会建议使用 round_robin 分布,这对于摄取来说会稍微快一些,但 table 上的下一个查询会更慢。

总是使用统计数据。我建议根据预期用途手动创建它们,以提高 ELT 性能的可预测性。如果您不创建 和更新 统计信息,您将在未来的某个时候获得可怕的性能。如果您不想承担手动管理统计的工作,那么一定要打开自动统计。

考虑使用 HEAP 与 CLUSTERED COLUMNSTORE table 结构来暂存 tables。一般来说,staging tables 是整行处理的,你可能会发现如果使用 HEAP,你的性能在 staging 层会更好。这需要在您的数据上进行测试,因为提供更高性能的 Gen2 缓存不适用于堆 tables。

一定要将事实和维度 table 创建为聚集列存储索引。哈希分布您的 fact/s,并复制您的维度(除非您有十亿行维度,在这种情况下,哈希分布可能更合适)。

如果您使用的是 CTAS 算法,那么您对非聚集索引的需求应该非常低。通常,只有当我发现查询的性能问题无法通过任何其他技术解决时,我才会添加索引。

最后,确保您使用的是合理的 DWU 和资源 Class。一般的经验法则是,您的 ELT 不应 运行 低于 DWU500 和 LARGERC。如果你不这样做,你会发现你得到了错误的聚集列存储索引,这将导致未来的性能问题。

我这边的一些意见 - 你的事实 table 应该被分区。事实上,你应该有一份工作,实际上自动创建分区。 fact table 有多大?如果您的事实 table 变得太大,那么根据您的要求,如果实际上不需要 table ,您可以考虑引入旧 table 的归档。