通过直接查询连接到 Azure 专用 SQL 池的 Power BI 报告性能缓慢

Slow performance of Power BI report connected to Azure Dedicated SQL pool via Direct Query

总结

我有一个简单的 Power BI 报告,其中包含 3 个 KPI,刷新时间为 0.3 秒。将数据移动到 Azure Dedicated SQL 池后,同一报告需要 6 秒才能刷新。目标是在不到 5 秒的时间内加载包含 10-15 个 KPI 和最多 10 个过滤器的报告,并连接到更大(几百万行)的数据集。

如何提高通过直接查询连接到 Azure 专用 SQL 池的 Power BI 的性能?

更多详情

设置:专用 SQL 池 > Power BI(直接查询)

数据:3 tables(行 x 列:4x136 用户 table、4x3000 日期 table、8x270.000 主要 table)

数据模型:主要 table 到日期 table 连接 - 基于“日期”类型字段的多对一。主要到用户连接 - 基于 user_id (varchar(10)) 的多对一连接。使用的其他数据类型:日期、整数、varchar(50 及以下)。

专用 SQL 池性能级别为 Gen2:DW200c。但是,使用的 DWU 数量从未超过 50 个,大多数情况下保持在 15 个以下。

报告: 该报告包括 3 个基于相同公式计算的 KPI(只是“5 个符号文本”不同):

KPI 1:=
CALCULATE(
    COUNTA('Table Main'[id]),
    CONTAINSSTRING('Table Main'[varchar 50 field 0], "5 symbols text"),
    ISBLANK('Table Main' [varchar 50 field 1]),
    ISBLANK('Table Main' [varchar 50 field 2])
    )

报告包括 6 个过滤器:5 个“基本过滤”,选择了 1 个或多个值,1 个“字符串包含”过滤器。

问题: 显示 3 个 KPI(仅 3 个数字)的视觉效果需要 6…8 秒才能加载,这很长,尤其是考虑到需要添加更多 KPI 和过滤器。 (相比之下,如果所有数据都加载到 .pbix 文件中,则为 0.3 秒)。这是一个问题,因为在页面 (10-15) 上添加更多 KPI 会按比例增加加载时间,甚至会增加计算更复杂且报告变得不可用的 KPI 的时间。

问题: 是否有可能显着提高 report/AAS/SQL 池的性能(快 2…10 倍)?如何? 如果不是,是否可以以某种方式将计算出的 KPI/视觉内容缓存在报表或 AAS 中,而无需每次都查询数据,并且无需将数据保留在 pbix 或 AAS 模型中?

已尝试但无法解决的解决方案: 聚集列存储、聚集行存储、非聚集行存储索引的单独使用和不同组合。自动统计 on/off。自动化索引和统计数据确实提供了 10…20% 的改进,但这绝对不够。

简单的值列表(任何 table 中的 1 列)需要 1.5 到 4 秒才能加载)

我试过的

  1. 将 SQL 池从西欧移动到法国并返回。无改善

  2. 应用索引:行和列存储、集群和非集群、手动和自动定义(包括统计信息)- 性能提高 10...20%,但无法解决问题。

  3. 正在更改资源类:smallrc、largerc、xlargerc。使用的 DWU 百分比仍然不会超过 50(满分 200)。无改善

  4. 缩小数据格式并删除过多的数据:最小的 nvarchar(n) 可能,最大的是 nvarchar (50),所有多余的列已被删除。无改进

  5. 隔离模型:我有一个更大的数据模型,为了测试 puproses,我将 3 tables 隔离到一个单独的模型中,以确保其他部分不会影响性能。没有改进。

  6. 减少 KPI 和过滤器的数量 只剩下 2 个报告过滤器(仅主要 table 字段)视觉效果需要 2 秒才能加载。在连接日期上使用 +2 过滤器 table 2.5 秒,在用户 table 上使用 +2 过滤器 6 秒。这意味着我只能使用 1-2 个过滤器报告,这不是 acceptable.

不幸的是,这是一个反复试验的过程。以下是您列表中没有的一些内容:

  • 多对一基于 user_id (varchar(10)) -> 添加一个 numeric 列,这是一个 hash user_id 列,并使用它来连接而不是 varchar 列。
  • 确保您的 statistics 是最新的。
  • 尝试Dual mode。在内存中加载较小的维度 tables 并在数据库中保留事实 tables。
  • 使用 aggregates 这样,除非用户试图向下钻取,否则实际上会在不查询数据库的情况下填充报告。
  • Partition your fact table 按适当的列。
  • 确保您使用 right distribution 作为事实 table 并且选择了正确的列。

小心分区和分发。 Synapse 的设计与传统 RDB(如 MySQL)略有不同,它在某种程度上更接近 NoSQL DB,但并非完全如此。因此,在使用它们之前了解这些概念在 Syanpse 中是如何工作的(否则你的性能可能会更差)!