前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PowerBI优化:更快、更小、更高效

PowerBI优化:更快、更小、更高效

作者头像
陈学谦
发布2024-10-21 15:05:36
1050
发布2024-10-21 15:05:36
举报
文章被收录于专栏:学谦数据运营

多年来,Power BI 一直是市场上领先的数据可视化工具。它可以用作自助式数据分析工具,也可以用作企业管理的商业智能工具。根据官方网站:

“使用端到端 BI 平台创建单一事实来源,发现更强大的洞察,并将其转化为影响力,从而事半功倍。”

图 1:Power BI 示例报表

Power BI 旨在为用户提供友好型服务。只需单击几下,您就可以从各种来源导入数据,将它们组合到一个数据模型中,并使用强大的数据可视化功能开始分析数据。这有时会导致人们只是将数据导入工具而不考虑太多的情况。当您在小型数据集上处理单个项目时,可能不会有太多问题。但是,如果您的报告成功了,并且您想与同事和其他部门分享,该怎么办?或者将更多数据加载到模型中,但刷新花费的时间越来越长?甚至其他数据源也添加到您的模型中,但编写 DAX 公式变得困难,并且报表速度变慢。

在本文中,我们将介绍一些技巧,这些技巧将帮助您缩小 Power BI 模型、加快速度并更易于维护。用 Daft Punk 的不朽名言来说:“更难。更好。更快。更强”。

技巧 #1:使用星型模式对数据进行建模

在数据仓库和商业智能领域,星型架构已经存在了几十年。原则很简单;您有两种类型的表:事实和维度。事实表对其中一个业务流程(如销售、退货、温度测量等)进行建模,而维度包含有关特定业务对象(客户、员工、地理位置等)的描述性信息。事实数据表包含一个或多个度量(数值信息),而维度主要包含文本数据。建模技术称为星形架构,因为如果绘制一个图表,其中事实表位于中间,其周围的维度,则会得到一个星形:

图 2:星型架构示例

解释星形图式的整个理论——通常也称为维度建模——对于一篇文章来说,我们走得太远了。如果您想了解更多信息,可以查看 The Data Warehouse Toolkit:The Definitive Guide to Dimensional Modeling 一书。

但是,为什么星型架构更适合 Power BI?首先,星型模式使用起来非常直观。想象一下:您想要筛选、切片或想要放在图表轴上的所有内容都来自维度。您想要实际可视化的所有内容(表格中的数字、图表中的线条或条形)都来自事实表。让我们用矩阵视觉对象来说明:

图 3:矩阵视觉对象中的维度和度量

Power BI 经过优化,可与星型架构配合使用。当维度列上有筛选器或切片器时,它不必加载许多值,因为维度通常很小。如果你把所有东西都放在一个巨大的表中,你的过滤器需要扫描整个表,只是为了获得可能的值的列表。在 Power BI 中,从小表筛选到大表(事实数据表)非常有效。

不使用星型架构建模的另一个缺点是,用 DAX(Power BI 模型的建模语言)编写的公式会变得更加复杂。当所有数据都位于一个大表中时,可能会出现一些计算错误。例如,计算客户的平均年龄并不像看起来那么简单,因为同一个客户可能会在表中重复多次。或者,如果您从关系数据库导入了一些表,则它们可能已被“规范化”,这是一种用于使数据库快速写入(插入、更新和删除)的设计方法。但是规范化的表更难读取,因为您需要将其中许多表联接在一起才能获得所需的数据。同样,它们使 DAX 公式更难编写。Power BI Desktop 中良好数据模型的重要性一文提供了几个很好的示例,介绍了星型架构如何简化 DAX 公式。使用 Power BI 和 Power Pivot for Excel 分析数据一书也更深入地探讨了此主题,如果您想提高 Power BI 技能,则非常推荐阅读该书。如果时间紧迫,可能会喜欢 Guy in a Cube 的 Patrick 中的 YouTube 视频:为什么 Power BI 喜欢星型架构。

好吧,将 Power BI 模型设计为一个或多个星型架构并不完全是一个“快速技巧”,但如果您从一开始就采用它,从长远来看,它肯定会节省您的时间。

技巧 #2:禁用自动日期表

即使您努力创建具有完美构建的星型架构的 Power BI 模型,仍然有许多方法可以优化模型。更简单的技巧之一涉及自动日期/时间表。这是 Power BI Desktop 中的一项设置,用于指示模型为模型的每个日期/时间列自动创建数据表。

图 4:Power BI Desktop 中的自动日期时间设置

默认情况下,此设置处于启用状态。但是这个时间智能功能实际上是做什么的呢?让我们将单个表导入到 Power BI 模型中。我正在使用 SQL Server 的 Adventure Works 示例数据仓库。您可以免费下载和使用这些示例数据库。使用 Power Query,我从 AdventureWorksDW2019 数据库中提取了一个表,而无需应用任何转换。

图 5:使用 Power Query 导入表

当数据加载到模型中时,我们可以直接对其进行分析。让我们创建一个 y 轴和 x 轴上都有 t 的折线图。

图 6:带有订单日期的折线图

我们获取的不是 y 轴上的单个日期,而是年份级别的聚合数据。这怎么可能呢?这是自动日期/时间功能。对于每个 datetime 列,都会在后台创建一个日期表。此日期表包含额外的列,例如年、季度和月。展开 datetime 列时,您可以在字段列表中看到以下内容:

图 7:自动日期层次结构

为您创建了一个简洁的小层次结构(年 -> 季度 -> 个月 -> 天)。这使没有经验的用户能够立即开始在 Power BI 中分析/可视化数据,而无需任何认真的建模工作。在视觉对象中,当您向下钻取到较低级别(例如月份级别)时,可以看到层次结构的效果:

图 8:向下钻取到月份级别的同一图表

如果您有一个小型模型并且没有那么多日期时间列,那么这是一个很棒的功能,但对于包含许多表的大型模型,这可能会产生深远的影响。Power BI Desktop 扫描 datetime 列,查找最小值和最大值,并创建一个包含整个范围的日期表。如果您有很多日期时间列,则这是一个无声杀手。理想情况下,您有一个自己维护的日期维度。当有 20 个 datetime 列时,您突然有 20 个不可见的日期维度!

让我们打开 Power BI 模型的引擎盖,看看这些表是什么样子的。这可以通过一个名为 DAX Studio 的工具来完成,您可以免费下载该工具。在 Power BI Desktop 模型仍处于打开状态的情况下,启动 DAX Studio 并从下拉列表中选择模型:

图 9:连接到 Power BI Desktop 模型

DAX Studio 将连接到您的模型,并在左侧的对象浏览器中显示一些元数据。在那里我们可以找到隐藏的日期/时间表:

图 10:DAX Studio 中隐藏的日期表

我们的表中有三个日期时间列,因此我们有三个隐藏的本地日期表。甚至还有第 4 个表,这是此日期表的模板。让我们去掉这些表格,这可以通过从选项菜单中取消选择功能来完成(请记住,当前文件有一个选项,所有新文件都有一个通用选项)。

对于具有单个表、只有三个日期时间列且日期范围仅为四年的小模型,影响并不大(约占总文件大小的 4%)。但对于非常大的模型,这可能会产生深远的影响。我见过模型通过禁用此功能而损失了数十甚至数百 MB 的大小。来自 SQLBI 的 Alberto Ferrari 在 YouTube 视频 Power BI 中的自动日期时间中解释了为什么禁用此功能如此重要。

技巧 #3:基数、基数、基数

Power BI 模型的强大之处在于它可以很好地压缩数据,从而允许您将数百万甚至数十亿行加载到模型中。但是,并非所有数据都压缩得一样好。压缩列的数据时,Power BI 会为该列创建一个字典。当此列包含大量唯一值时,压缩将受到影响。这会导致模型更大,并且会消耗更多内存。通过优化最大列的压缩,可以使模型更小,这将使它消耗更少的内存,从而更快。

列中非重复值的数量称为基数。列的基数越高,该列占用的空间就越多。有几种最佳实践允许您减少列的基数:

当您的列包含小数时,请考虑减少小数点后的小数位数。例如,如果您有一列包含百分比值(介于 0 和 1 之间的所有内容),并且小数点后有 5 位数字,则您有 100.001 个唯一的可能值(从 0.00001 到 0.99999 的所有内容 + 数字 0 和 1)。当小数点后只有两位数时,只有 101 个唯一值。这似乎并不多,但是如果您有一个常规的十进制数,例如 1748.845687 与 1478.85 呢?那么压缩的差异将是巨大的,因为唯一值的数量要高得多。除非你需要非常精确的测量,否则两三位数通常就足够了。

datetime 列也是如此。如果您的日期还包括时间部分,则有许多唯一值。如果精度上升到秒级别,则一年中有 31,536,000 个唯一值。如果只保留日期本身,则一年中只有 365 个(或可能 366 个)唯一值。将日期截断为日期级别将再次产生高压缩优势。如果您确实需要 time 部分,最好将其放在单独的列中。单个日期值“2023-02-25 15:47:31”将变为“2023-02-25”和“15:47:31”。时间本身只有 86,400 个唯一值,因为这是一天中的秒数。

由于 Power BI 只允许您创建单列关系,因此将表中的多个列连接在一起以创建唯一键可能很诱人。但是,这将导致列具有非常高的基数(等于表中的行数),如果最终结果是文本字符串,则压缩将非常糟糕。更好的选择是在数据仓库或 Power Query 中创建代理键。代理键是无意义的整数,它们将比大字符串具有更好的压缩率。

说到文本字符串,如果基数很高,它们也不会真正压缩得那么好。与日期和数字不同,您不能只是剪掉片段以减少唯一值的数量。由于维度通常没有那么多行,因此文本列的存在并不是什么大问题。但在具有数百万行的事实表中,文本列可能会产生很大影响。您应该尝试将文本放在一个维度中,或者完全删除该列。

为了在您想要优化现有模型时提供良好的开端,您可以使用名为 Vertipaq Analyzer 的工具(Vertipaq 是驱动 Power BI 模型的列式数据库技术的名称)。您可以从 SQLBI 网站免费下载此工具。Vertipaq Analyzer 是一个 Excel 文件,其中包含一些查询。它可以加载 Power BI 模型的所有元数据,并将其存储在 PowerPivot 模型中。它将为您提供模型中的所有列(以及更多列)的概览以及它们消耗的存储空间。这使您可以专注于最重要的列。让我们看一下我们在上一节中创建的 Power BI 模型。

首先,我们需要使用 DAX Studio 导出模型的元数据。在 高级 功能区中,您可以使用 导出量度 功能。

图 11:在 DAX Studio 中导出指标

这将创建一个 .vpax 文件。将其存储在硬盘驱动器上的某个位置。在 Vertipaq Analyzer 中,转到 Vertipaq Analyzer 功能区,然后选择 Open VPAX。加载您刚刚保存的文件。

图 12:打开您刚刚保存的 VPAX 文件

数据将自动刷新。对于我们的用例,最重要的数据位于 Columns (列) 选项卡中。在那里,我们可以很好地了解每列究竟占用了多少空间。

图 13:Vertipaq Analyzer 中的色谱柱概述

有几个有趣的列,例如列中的行数、基数和字典大小。如前所述,可以通过降低 cardinality 来减小总大小。这对字典大小有影响。如上图 13 所示,模型几乎有一半是单列!具有最高的基数和迄今为止最大的字典大小。如果您的数据可视化并非真正需要此列,则可以从模型中省略它,从而将模型大小切成两半。SalesOrderNumber

另一个有趣的观察结果是,每个数据列在表中包含两次。一次作为实际日期,一次作为整数(列名以 结尾)。尽管数据大小本身相同(96kb,显示的所有数字均以字节为单位),但日期列的字典大小是整数列的两倍。Key

当您处理大型模型时,当您想要优化模型时,像 Vertipaq Analyzer 这样的工具至关重要。它清楚地向您展示了您可以专注于哪些色谱柱以获得最大的收益。

结论

在本文中,我们向您展示了 Power BI 开发人员可以使用的几个设计技巧,以充分利用您的模型。总结一下:

始终使用星型架构建模作为模型设计的起点。它可以为您以后省去很多麻烦。

禁用自动日期/时间功能,以避免为 Power BI Desktop 文件中的每个日期时间列创建隐藏表。

尽可能减少每列的基数,删除不需要的列。

本文译自Koen Verbeeck的博客文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档