Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang:如何分析qlc:q是否进行全表扫描、键前缀扫描或键查找?_Erlang_Profiling - Fatal编程技术网

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

Erlang:如何分析qlc:q是否进行全表扫描、键前缀扫描或键查找?,erlang,profiling,Erlang,Profiling,如何分析qlc:q是否进行全表扫描、键前缀扫描或键查找 例如,带有{{KeyPrefix,KeySuffix},Value}等项的set类型的集合将 qlc:q([ {{KeyPrefix, KeySuffix}, Value} || {{KeyPrefix, KeySuffix}, Value} <- ets:table(Table), KeyPrefix =:= Something ]) qlc:q([ {{KeyPrefix,KeySuffix},Value

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

例如,带有{{KeyPrefix,KeySuffix},Value}等项的set类型的集合将

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

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

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

我不知道有什么方法可以精确地完成您想要的操作,但是您可以通过其他方式获得这些信息。您当然可以查看
qlc
模块的源代码,看看是否可以从中获得任何见解。此外,您可以在
qlc
函数中插入一些调试语句,并将您的Erlang运行时重新编译到请再给我一些反馈

祝你好运

-tjw

您可以使用获取有关QLC表达式的大量信息。这可能无助于您确定给定的子查询是否使用完整表扫描,但这确实会返回查询计划和与查询相关的表,然后您可以将其传递到以检索其类型和keypos。

这个问题并不具体对于ETS来说,我不认为。他可以预见在mnesia表或Erlang元组列表上实现相同的QLC,同样的问题仍然适用。