【问题标题】:Erlang: how to profile whether qlc:q does full table scan, key prefix scan or key lookup?Erlang:如何分析 qlc:q 是否进行全表扫描、键前缀扫描或键查找?
【发布时间】:2011-05-10 15:51:01
【问题描述】:

如何分析 qlc:q 是否进行全表扫描、键前缀扫描或键查找?

例如,带有 {{KeyPrefix, KeySuffix}, Value} 等条目的类型集的 ets - 将

qlc:q([
    {{KeyPrefix, KeySuffix}, Value} ||
    {{KeyPrefix, KeySuffix}, Value} <- ets:table(Table),
    KeyPrefix =:= Something
])

做全表扫描还是键前缀扫描?

【问题讨论】:

    标签: erlang profiling


    【解决方案1】:

    您可以使用qlc:info/1 获取有关您的QLC 表达式的大量信息。这可能无法帮助您确定给定的子查询是否使用全表扫描或诸如此类的东西,但这确实会为您提供查询计划和与查询相关的表,然后您可以将其传递给ets:info/1 以检索它们的类型和密钥位置。

    【讨论】:

      【解决方案2】:

      ETS 不是在 Erlang 中实现的,它是在运行时系统中实现的(大概是在 C 中?)。因此,我认为今天不可能做到这一点。即使您找到了一种方法,当您升级到新版本的 Erlang 时,您的方法也可能会中断。一种可靠的方法需要运行时系统向 ETS 的内部公开某种自省 API,我认为只要它没有在 Erlang 中实现就不太可能发生。当然,您可以深入研究代码以更好地了解在给定场景中可能发生的情况,但我怀疑您最好将时间花在专注于应用程序代码上。

      【讨论】:

      • 这个问题不是 ETS 特有的,我不认为。他可以预见到在记忆表或 Erlang 元组列表上实现相同的 QLC,同样的问题仍然适用。
      【解决方案3】:

      根据我们的经验,有时qlc eval(通过列表理解)非常聪明,有时却非常愚蠢。也就是说,我认为你的问题是有效的。

      我知道没有办法精确地做你想做的事,但你也许可以通过其他方式获得这些信息。您当然可以查看qlc 模块的源代码,看看是否可以从中获得任何见解。此外,您可以在 qlc 函数中插入一些调试语句并重新编译您的 Erlang 运行时以获得更多反馈。

      祝你好运
      -tjw

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-16
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2010-10-12
        • 2021-08-29
        相关资源
        最近更新 更多