在 Azure Synapse 中预先计算 OLAP 多维数据集

Precalculate OLAP cube inside Azure Synapse

我们有维度模型,每个模型有 table 个 100-300 GB 的镶木地板。我们在 Azure Synapse (DirectQuery) 之上构建 PBI 报告,并在 slicing/dicing 上遇到性能问题,尤其是在计算多个 KPI 时。同时,将数据量保存在 Azure Analysis Services 中非常昂贵。由于维数,事实 table 无法显着聚合,因此 PBI 导入模式或复合模型也不是一个选项。

A​​zure Synapse Analytics faciliates OLAP operations,如 GROUP BY ROLLUP/CUBE/GROUPING SETS。

  1. 我如何从 Synapse 的 OLAP 操作支持中获益?
  2. 是否可以在 Synapse 中预先计算 OLAP 多维数据集以提高 PBI 报告性能?怎么样?
  3. 如果是,是否建议提前计算KPI?意味着将 KPI 定义移动到 DWH OLAP 多维数据集级别 - 它是反模式吗?

P.S。对每个 PBI 可视化使用单独的聚合不是一个选项,它更像是一个例外。 Synapse 足够聪明,即使在查询基础时也能从实体化视图聚合中获益table,但这样你就无法实现 RLS 并且管理那么多的实体化视图看起来也很麻烦。

更新@NickW

请您回答以下子问题:

  1. 我没看错吗 - OLAP 操作支持主要针对下游多维数据集提供程序,而不是针对仓库性能?
  2. 为了提高性能而生成具有物化视图的仓库被认为是一种常见做法还是一种反模式?我发现(参见 the link)Power BI 可以根据查询模式自动创建实体化视图。还是怕不能提供stable testable的解决方案,又不能支持RLS了。
  3. 仓库端的KPI预计算是通用方式还是反模式?据我所知,这通常是在没有多维数据集提供者一方的情况下完成的,但是如果我没有呢?
  4. 您是否看到任何其他提升性能的选项?我只能考虑通过使用 PBI 复合模型并将所有维度导入 PBI 来减少查询并行度。不确定是否有帮助。

希望能回答您的一些问题...

  1. 您不能 pre-calculate Synapse 中的 OLAP 多维数据集;您可以获得的最接近的是创建聚合 tables 并且您已经声明这不是一个可行的解决方案
  2. OLAP 操作可以在查询中使用,但不要“pre-build”任何其他查询可以使用的操作(忽略 CTE、sub-queries 等)。因此,如果您现有的查询不使用这些函数,那么 re-writing 它们使用这些函数可能会提高性能 - 但仅针对每个特定查询

我知道您的问题是关于 OLAP,但根本问题显然是性能。鉴于 OLAP 不太可能解决您的性能问题,如果您愿意,我很乐意谈谈性能调优?

更新 1 - 附加编号问题的答案

  1. 我不完全确定我理解这个问题,所以这可能不是答案:OLAP 函数在那里,因此可以编写使用它们的查询。人们可能需要编写使用这些函数的查询的原因可能有无数种
  2. 性能是创建物化视图的主要(唯一?)原因。它们对于创建经常使用的数据集非常有效,即当基础数据处于日级别但大量报告聚合在 week/month 级别时。正如另一位用户在评论中所述,Synapse 可以自动管理此过程,但它是否真的可以创建对大部分查询有用的聚合显然完全取决于您的特定情况。
  3. KPI pre-calculation。在 DW 中,任何可以提前计算的度量都应该(通过您的 ETL/ELT 过程)。例如,如果您有使用净销售额(总销售额 - 税)的报告,而您的源系统仅提供总销售额和税金额,那么您应该在加载事实时计算净销售额作为衡量标准 table。显然,有些 KPI 无法提前计算(即可能涉及平均值),这些需要在您的 BI 工具中定义
  4. 提高性能:我将在下一节中介绍,因为它是一个较长的主题

提升性能

性能调优是一个庞大的主题 - 有些领域是通用的,有些则特定于您的基础架构;这不会是一个全面的审查,但会强调您可能需要考虑的几个方面。

记住几件事:

  1. 性能始终存在绝对限制 - 基于您的基础架构 - 因此即使在经过完美调整的系统中,也始终存在可能不是您希望达到的限制。但是,使用现代云基础架构,您达到此限制的可能性非常低
  2. 性能是要花钱的。如果你买得起的只是一辆 Mini,那么无论你如何调校它,它都不会像法拉利那样快

考虑到这些注意事项,您可以查看以下几点:

  1. 查询计划。查看您的查询是如何执行的,以及是否存在您可以关注的明显瓶颈。这 link 提供了一些进一步的信息 Monitor SQL Workloads
  2. 扩大你的 Synapse SQL 池。如果您在查询中投入更多资源,它们会 运行 更快。显然,这是一种“钝器”方法,但在尝试过其他调整活动后值得一试。如果这确实给你带来了 acceptable 性能,你需要决定是否值得额外的成本。 Scale Compute
  3. 确保您的统计数据是最新的
  4. 检查您为每个 table 使用的分配机制(循环、哈希)是否仍然合适,并且在相关主题上,检查每个 table[=48 的偏差=]
  5. 索引。添加适当的索引将加快您的查询速度,尽管它们也具有存储含义,并且会减慢数据加载速度。在查看索引时,这篇文章是一个合理的起点:Synapse Table Indexing
  6. 物化视图。之前涵盖但值得研究。我认为 MV 的自动管理可能还没有出来(或仅在 public 预览中),但可能是需要考虑的事情
  7. 数据模型。如果您有一些相当通用的事实和维度来支持大量查询,那么您可能需要考虑创建额外的 facts/dimensions 来支持特定的报告。我总是(如果可能的话)从现有的 facts/dimensions 派生它们,但是您可以通过从事实中删除未使用的 SK、减少数据量、sub-setting table 中的列来创建新的 tables ]s,结合 tables 等

希望这至少能为您提供一个调查性能问题的起点。

Synapse Result Set Caching and Materialized Views 都可以提供帮助。

未来物化视图的创建和维护将实现自动化。

Azure Synapse will automatically create and manage materialized views for larger Power BI Premium datasets in DirectQuery mode. The materialized views will be based on usage and query patterns. They will be automatically maintained as a self-learning, self-optimizing system. Power BI queries to Azure Synapse in DirectQuery mode will automatically use the materialized views. This feature will provide enhanced performance and user concurrency.

https://docs.microsoft.com/en-us/power-platform-release-plan/2020wave2/power-bi/synapse-integration

Power BI Aggregations 也可以提供帮助。如果有很多维度,select最常用于创建聚合。