【问题标题】:For the snowflake query history profile view, is there a reason why the profile graph doesn't show the current node execution time?对于雪花查询历史配置文件视图,配置文件图不显示当前节点执行时间是否有原因?
【发布时间】:2022-01-20 14:25:10
【问题描述】:

我还没有使用“Snowsight”,并试图通过查看每个节点花费的时间来确定查询性能故障排除。

在四处点击时,我可以看到配置文件视图在节点详细信息区域的右侧显示“节点执行时间”,但没有打印节点执行时间的时间(而是打印百分比):

这是疏忽吗?还是以后会加入?

我尝试在 snowsight 中查看相同的查询配置文件,但是,它说该节点只用了 616 毫秒(我认为这很奇怪,因为这是最长的节点(在时间上),整个查询用了 4 分 25 秒。怎么能4m+ 查询中性能最差的节点只需要 616ms?)。

snowsight 似乎开始显示节点执行时间(耶!)但感觉实际执行时间是错误的。

我什至浏览了 snowsight 查询配置文件视图中的 每个 节点,并查看了每个节点的执行时间。它们加起来不超过 4m 25s(我没想到它们会这样,因为雪花将并行运行一些节点)。但是,它们总计仅加起来为 945 毫秒(但查询耗时 4m 25s)。

我似乎遗漏了一些东西,或者 snowsight 中的查询配置文件视图没有向我显示所有正确的信息?

(我知道这里有几个问题。在尝试阅读 docs似乎执行时间应该包括 CPU 处理、磁盘 IO、网络传输、等等等等,所以我仍在尝试解决为什么在雪景视图中每个节点的总执行时间加起来不到 1 秒,而整个查询却花费了 4m+)

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    让我用一个爆炸式的连接查询来回答这个问题:

    select median(a.r / b.r)
    from (
        select random() r 
        from table(generator(rowcount => 10000))
    ) a, (
        select random() r
        from table(generator(rowcount => 10000))
    ) b
    

    看起来很简单,但它生成了 100,000,000 行,这些行必须保存在内存中才能获得中位数。

    查询profile视图显示最昂贵的节点只用了99ms,但整个查询用了36s:

    解释在右下角:

    溢出到本地存储的字节数:730.41MB

    当需要太多内存来处理结果时,字节会溢出到本地和远程存储 - 使查询速度变慢。

    请注意,在这种情况下,此查询在 S 或 XL 仓库中花费相同的时间:没有太多的并行化,大部分时间都花在将 100M 行写入临时 SSD 存储以找到中间值。

    请注意,如果我们请求 AVG() 而不是 MEDIAN(),则相同的查询在相同的 100M 行上只需要 6 秒:

    (如果您在新问题中分享您的查询,我们可以深入研究可能的优化)

    【讨论】:

      【解决方案2】:

      总结一下 Felipe 所说的,节点执行时间不包括阻塞 I/O 操作,例如等待数据传输或网络操作。

      【讨论】:

        【解决方案3】:

        此外,您可能会混淆您正在使用的工作表或 SQL 工具中显示的时间,这通常还包括返回行的时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2019-04-01
          相关资源
          最近更新 更多