如何使用Daxstudio检查两个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]
)
)
问题与:
DAX lookup first non blank value in unrelated table
您可以下载带有示例数据的pbix文件:
答案 0 :(得分:1)
由于固定的开销成本,很难将性能从很小的数据集推断到很大的数据集,所以我建议在较大的数据表上进行测试。
通常,您希望尽可能避免使用MAXX
之类的迭代器,而推荐使用MAX
,因为后者具有引擎内部的引擎优化功能。优化查询时很少有通用的规则,因此考虑到您显示的数据,这是一个基于意见的问题。
答案 1 :(得分:1)
您无法从DAX Studio真正看出来,当数据集如此小时,但是在大多数情况下,使用最简单查询计划的查询将是最快的。查询#1就是这种情况,它的确是您情况下最快的查询(忽略所有〜20 ms以下的时间测量-由于数据量太小,因此不可靠,这是不可靠的)。
此外,我想补充一点,以下查询应该提供相同的结果,并且比两个查询都更简单,并且查询计划更简单:
ADDCOLUMNS(
ThisTable,
"FilterLookup",
LOOKUPVALUE(SearchTable[Category], SearchTable[Product], ThisTable[Product])
)
编辑:我没有注意到“ {apple}”在SearchTable[Product]
列中出现过两次。这将导致上述对LOOKUPVALUE(...)
的调用失败,因为它无法为SearchTable[Category]
找到一个明确的值。