文章背景: 最近在学习DAX权威指南第17章,介绍了运行DAX查询的引擎内部架构。DAX查询可以完全在存储于内存的模型上运行,也可以完全由原始数据源运行,还可以混合使用这两种方式。
在报表端可以使用DAX或MDX语言向表格模型发送查询。尽管使用的查询语言不同,但表格模型都会使用以下两个引擎来处理查询:
- 公式引擎(FE):负责处理请求,生成和执行查询计划。
- 存储引擎(SE): 从表格模型中检索数据,以响应公式引擎发出的请求。存储引擎有两种形式:
图1展示了执行DAX查询或MDX查询的架构体系。
VertiPaq
将数据副本托管到内存中,该副本定期在数据源中被刷新。DirectQuery
将每个请求的查询直接转发到原始数据源中。DirectQuery
不额外创建数据副本。
图1 发送到表格模型的查询使用公式引擎和存储引擎进行处理
1 公式引擎介绍
公式引擎是运行DAX的核心引擎。公式引擎将DAX或MDX查询转换为查询计划(Query Plan),其内容是将要执行的物理步骤的列表。查询计划中的每个步骤都对应于公式引擎执行的特定操作。
公式引擎可以处理DAX或MDX函数请求的所有操作,并解析复杂的DAX和MDX表达式。但是,当公式引擎必须从底层表中检索数据时,它会将部分请求转发到存储引擎中。
公式引擎向存储引擎发送请求,存储引擎通过返回数据缓存(datacache
)来响应。数据缓存是由存储引擎创建并由公式引擎读取的临时存储区域。
注意:数据缓存不会被压缩;无论来自哪个存储引擎,数据缓存都是以未压缩格式存储的普通内存表。
公式引擎不具备在不同查询之间复用结果的缓存系统,DAX完全依赖于存储引擎的缓存功能。
最后要注意的是,公式引擎是单线程的。公式引擎按顺序向存储引擎发送请求,每次执行一个查询。只有在存储引擎中执行的请求才有可能并行执行,存储引擎具有不同的结构,可以利用多个内核。
2 存储引擎介绍
存储引擎的任务是扫描表格模型数据库并生成公式引擎所需的数据缓存。存储引擎不依赖DAX。例如,当使用DirectQuery
方式连接SQL Server时,将使用SQL作为存储引擎的查询语言。VertiPaq
也是不依赖于DAX的,它的整体架构非常清晰和完善。
开发者可以使用以下3个选项之一来定义每个表使用的存储引擎。
- 导入(Import):也被称为内存模式(in-memory),或
VertiPaq
。数据由VertiPaq
引擎存储,引擎在刷新数据期间从数据源复制和重组数据。 - 直连(
DirectQuery
):在查询时从数据源读取表的内容,数据在刷新期间不被存储在内存中。 - 双(Dual):数据可以使用
VertiPaq
和DirectQuery
查询。在刷新数据期间,表被加载到内存中,但是在查询时,表也可以通过DirectQuery
模式读取包含最新信息的数据。
(1)导入模式是创建新 Power BI 报表的默认方式。数据刷新可按计划进行,也可按需进行。
(2)对于某些数据源,可以使用 DirectQuery
直接连接到数据源,而无需导入数据。
(3)在双
存储模式下,表既可充当缓存表,也可以充当未缓存表,具体视提交到 Power BI 数据集的查询的上下文而定。在一些情况下,查询是通过缓存数据完成。在另一些情况下,查询是通过对数据源执行按需查询完成。
(4)将表的存储模式更改为导入
是无法撤消的操作 。设置后,无法将此属性更改回DirectQuery
或双
存储模式。
选择合适的存储模式可以提高查询性能,并且减少数据延迟。
- 对于要求实时准确或者安全度较高的数据源,可以通过直接查询来满足要求,不进行缓存可以减少数据延迟;
- 对于不常更新的数据源,可以考虑直接导入缓存数据,减少数据刷新次数,提高查询的性能和交互性。
参考资料:
[1] Power BI性能提升的5大秘密武器(https://www.cnblogs.com/yeacer/p/12628173.html)
[2] Power BI - Tabular - 模型类型(https://www.jianshu.com/p/49a0e391d98c)
[3] DAX权威指南(https://www.powerbigeek.com/definitive-guide-to-dax-cn/)
[4] Power BI 存储模式介绍(导入、DirectQuery、双)(https://blog.csdn.net/WHYbeHERE/article/details/129027108)
[5] 在 Power BI Desktop 中使用 DirectQuery(https://learn.microsoft.com/zh-cn/power-bi/connect-data/desktop-use-directquery)
[6] 再看Power BI数据连接的三种方式(https://cloud.tencent.com/developer/article/1870565?from=15425)