如何使用达克斯工作室检查两个DAX查询中哪个具有更好的性能。在本例中,查询返回的结果完全相同。然而,统计数据不同,显示出不明确的提示。从这两个查询的比较中,我们能掌握什么有用的信息呢?
比较查询统计数据摘要:
+-------------------------+------------+---------+---------+
| | | Query 1 | Query 2 |
+-------------------------+------------+---------+---------+
| Server timings | Total | 7 | 5 |
| | SE CPU | 0 | 0 |
| | FE | 6 | 4 |
| | SE | 1 | 1 |
| | SE Queries | 3 | 2 |
| | SE Cashe | 0 | 0 |
+-------------------------+------------+---------+---------+
| Query plan, no of lines | physical | 7 | 28 |
| | logical | 13 | 9 |
+-------------------------+------------+---------+---------+因此,服务器时间更倾向于第二个查询,但其复杂的查询计划引起了关注。知道统计数据和查询计划之后,如果SearchTable有百万行,我们会期待什么呢?我们不应该喜欢更简单的查询计划吗,因为DAX优化可能会在未来发生有利于他们的变化吗?
样本数据。我们有两个表SearchTable和ThisTable:
SearchTable =
DATATABLE (
"Category", STRING,
"Product", STRING,
"Amount", INTEGER,
{
{ BLANK () , "apple" , 1 },
{ "Fruits" , "apple" , 1 }, -- watch out for multiple apples!
{ "Yummy Fruits", "apple" , 2 },
{ "Fruits" , "banana" , 4 },
{ "Fruits" , "wolfberry" , 5 },
{ "Fruits" , "cherry" , 3 },
{ "Vegetables" , "carrot" , 3 },
{ "Vegetables" , "potato" , 1 },
{ "Vegetables" , "onion" , 7 },
{ "Fruits" , "cherry" , 3 }
}
)
---
ThisTable =
DATATABLE (
"Product", STRING,
{
{ "apple" },
{ "banana" },
{ "blackberry" },
{ "carrot" },
{ "cherry" },
{ "onion " },
{ "potato" },
{ "watermelon" },
{ "wolfberry" }
}
)查询1号.
EVALUATE
ADDCOLUMNS (
VALUES ( ThisTable[Product] ),
"FilterLookup",
VAR LookupKey = ThisTable[Product]
RETURN
CALCULATE ( MAX ( SearchTable[Category] ), SearchTable[Product] = LookupKey )
)查询具有以下状态:

和查询计划:

查询2号.
EVALUATE
ADDCOLUMNS (
VALUES ( ThisTable[Product] ),
"FilterLookup", MAXX (
FILTER ( SearchTable, SearchTable[Product] = ThisTable[Product] ),
SearchTable[Category]
)
)统计数据:

查询计划:

这个问题涉及:
您可以下载带有示例数据的pbix文件:
发布于 2020-01-23 16:54:00
由于固定的开销成本,很难将性能从一个微小的数据集推断为一个大的数据集,所以我建议在较大的数据表上进行测试。
通常,您希望避免像MAXX这样的迭代器,以便在可能的情况下支持MAX,因为后者具有底层引擎优化。在优化查询时,很少有规则是通用的,因此,考虑到您展示的数据,这是一个相当基于意见的问题。
发布于 2020-01-23 23:21:44
在数据集如此小的情况下,您无法从DAX中真正分辨出来,但在大多数情况下,使用最不复杂的查询计划的查询将是最快的。这就是查询#1的情况,在您的情况下,这确实是最快的查询(忽略所有时间测量值在20 ms以下--因为它不可靠,因为数据集太小了)。
此外,我还想补充一点,下面的查询应该提供相同的结果,而且速度更快,其查询计划甚至比两个查询都更简单:
ADDCOLUMNS(
ThisTable,
"FilterLookup",
LOOKUPVALUE(SearchTable[Category], SearchTable[Product], ThisTable[Product])
)编辑:,我没有注意到“苹果”在SearchTable[Product]专栏中出现了两次。这将导致上面对LOOKUPVALUE(...)的调用失败,因为它将无法为SearchTable[Category]找到一个明确的值。
https://stackoverflow.com/questions/59883211
复制相似问题