首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Daxstudio中检出哪个DAX查询具有更好的性能?

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

Stack Overflow用户
提问于 2020-01-23 16:33:37
回答 2查看 233关注 0票数 0

如何使用达克斯工作室检查两个DAX查询中哪个具有更好的性能。在本例中,查询返回的结果完全相同。然而,统计数据不同,显示出不明确的提示。从这两个查询的比较中,我们能掌握什么有用的信息呢?

比较查询统计数据摘要:

代码语言:javascript
复制
+-------------------------+------------+---------+---------+
|                         |            | 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:

代码语言:javascript
复制
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号.

代码语言:javascript
复制
EVALUATE
ADDCOLUMNS (
    VALUES ( ThisTable[Product] ),
    "FilterLookup",
    VAR LookupKey = ThisTable[Product]
    RETURN
        CALCULATE ( MAX ( SearchTable[Category] ), SearchTable[Product] = LookupKey )
)

查询具有以下状态:

和查询计划:

查询2号.

代码语言:javascript
复制
EVALUATE
ADDCOLUMNS (
    VALUES ( ThisTable[Product] ),
    "FilterLookup", MAXX (
        FILTER ( SearchTable, SearchTable[Product] = ThisTable[Product] ),
        SearchTable[Category]
    )
)

统计数据:

查询计划:

这个问题涉及:

DAX查找无关表中的第一个非空白值

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

DAX查找前1 value.pbix

EN

回答 2

Stack Overflow用户

发布于 2020-01-23 16:54:00

由于固定的开销成本,很难将性能从一个微小的数据集推断为一个大的数据集,所以我建议在较大的数据表上进行测试。

通常,您希望避免像MAXX这样的迭代器,以便在可能的情况下支持MAX,因为后者具有底层引擎优化。在优化查询时,很少有规则是通用的,因此,考虑到您展示的数据,这是一个相当基于意见的问题。

票数 1
EN

Stack Overflow用户

发布于 2020-01-23 23:21:44

在数据集如此小的情况下,您无法从DAX中真正分辨出来,但在大多数情况下,使用最不复杂的查询计划的查询将是最快的。这就是查询#1的情况,在您的情况下,这确实是最快的查询(忽略所有时间测量值在20 ms以下--因为它不可靠,因为数据集太小了)。

此外,我还想补充一点,下面的查询应该提供相同的结果,而且速度更快,其查询计划甚至比两个查询都更简单:

代码语言:javascript
复制
ADDCOLUMNS(
    ThisTable,
    "FilterLookup",
        LOOKUPVALUE(SearchTable[Category], SearchTable[Product], ThisTable[Product])
)

编辑:,我没有注意到“苹果”在SearchTable[Product]专栏中出现了两次。这将导致上面对LOOKUPVALUE(...)的调用失败,因为它将无法为SearchTable[Category]找到一个明确的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59883211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档