Erlang:如何分析qlc:q是否进行全表扫描、键前缀扫描或键查找?
如何分析qlc:q是否进行全表扫描、键前缀扫描或键查找 例如,带有{{KeyPrefix,KeySuffix},Value}等项的set类型的集合将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} ||
{{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,同样的问题仍然适用。