如何在Daxstudio中检查哪个DAX查询具有更好的性能?

时间:2020-01-23 16:33:37

标签: performance dax daxstudio

如何使用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 |
+-------------------------+------------+---------+---------+
  • 第二个查询速度更快,但是计划比较冗长。 2次扫描。
  • 第一个查询的服务器时间较长,但查询计划更简洁,更短。 3次扫描。

因此,服务器计时有利于第二次查询,但是其复杂的查询计划引起了人们的关注。了解了统计信息和查询计划后,如果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 )
)

查询具有以下统计信息:

enter image description here

和查询计划: enter image description here

查询2号。

EVALUATE
ADDCOLUMNS (
    VALUES ( ThisTable[Product] ),
    "FilterLookup", MAXX (
        FILTER ( SearchTable, SearchTable[Product] = ThisTable[Product] ),
        SearchTable[Category]
    )
)

统计: enter image description here

查询计划: enter image description here

问题与:

DAX lookup first non blank value in unrelated table

您可以下载带有示例数据的pbix文件:

DAX lookup top 1 value.pbix

2 个答案:

答案 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]找到一个明确的值。