当以下多个查询依赖于查询的数据表以防止多次查询远程数据表时,在Power BI中查询远程数据表的最佳方法/设计是什么?
细节假设我有一个远程数据库服务器my_db_server
和一个数据库my_db
,我查询一个特定的数据表my_source_data_table
。之后,我在PowerBI中使用另外两个查询,这取决于远程数据表的初始查询。我想只执行一次对远程表的查询,然后以一种有效的方式使用缓存的数据进行其他两次查询,以防止多次查询远程数据库服务器。
步骤1 -访问远程数据库
因此,我在PowerBI中添加了以下查询来访问远程表
let
Source = Sql.Databases("<my_db_server>"),
Database = Source{[Name="<my_db>"]}[Data],
MySourceDataTable = Database {[Schema="dbo",Item="<my_source_datatable>"]}[Data],
in
MySourceDataTable
步骤2 -根据查询
我现在有两个子查询,它们使用这个表作为输入并查询它们,例如
查询A -按Foo,Bar排序
let
Source = MySourceDataTable,
ReorderColumnsFooBar = Table.ReorderColumns(Source ,{"Foo", "Bar"})
in
ReorderColumnsFooBar
查询B -按Bar, Foo排序
let
Source = MySourceDataTable,
ReorderColumnsBarFoo = Table.ReorderColumns(Source ,{"Bar", "Foo"})
in
ReorderColumnsBarFoo
在这种情况下PowerBI如何进行?是不是这样:
查询远程数据库解析
MySourceDataTable
使用缓存的
MySourceDataTable
解析ReorderColumnsFooBar
使用缓存的
MySourceDataTable
解析ReorderColumnsBarFoo
是否使用1)的缓存版本,还是步骤2)和步骤3)每个都再次执行查询1)?我可以在1)的末尾使用Table.Buffer(MySourceDataTable)
来显式缓存表来改善这种情况吗?
测试这些不同的方法似乎并没有带来速度的提高。目前我的整个查询大约需要90秒,我想加快它,因为远程查询占用了80%的时间。
Power Query每次从源发送数据流。例如,如果您有两个查询,它们都从数据库中获取数据,并且在执行查询1和查询2之间的瞬间数据发生了变化,那么您将获得不同的数据提取。
表。缓冲只缓存在一个单一的查询,所以回答你的问题,步骤2 &;3 .再次执行查询1 .
您可以在这里阅读更多背景信息:https://bengribaudo.com/blog/2020/08/26/5417/how-power-query-thinks
如果您想提高查询时间(90秒并不长),您可以通过重新排序您的步骤来充分利用查询折叠。您还可以优化在每个查询中运行的M -转换选择和操作顺序会对性能产生很大影响。