Erlang:如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?

时间:2011-04-12 13:51:33

标签: erlang profiling

如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?

例如,使用{{KeyPrefix,KeySuffix},Value}等条目设置类型的ets

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

进行全表扫描或键前缀扫描?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

ETS没有在Erlang中实现,它是在运行时系统中实现的(大概是在C?中)。因此,我认为今天不可能这样做。即使您想出了一种方法,当您升级到Erlang的新版本时,您的方法可能会中断。一个可靠的方法需要运行时系统将某种内省API暴露给ETS的内容,我认为只要它没有在Erlang中实现,就不太可能发生。当然,你可以在代码中挖掘一下,以便更好地了解给定场景中可能发生的事情,但我怀疑你的时间会更好地专注于你的应用程序代码。

答案 2 :(得分:0)

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

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

祝你好运
-tjw