i有一个复制到所有可用节点的MNESIA ram_copies
表。几乎所有使用此表的操作都以肮脏模式执行。在ets
上下文中使用mnesia:foldl
的后果是什么?
mnesia:activity(ets, fun() ->
mnesia:foldl(fun(V, Acc) ->
case V#my_table.field > 0 of
true -> Acc;
false -> Acc + 1
end
end, 0, my_table)
end).
给定您有
- 其他地方的肮脏交易,所以您不必担心同步
- ram_copies,所以您不在乎检查点
- 在所有节点上复制的所有表
- 您只在阅读,因此不需要通知远程节点
ets
和async_dirty
之间的影响没有差异。您可能会通过绕过async_dirty
的许多测试来看到一些较小的速度提高,但我不会期望这是一个明显的收益。
作为一般实践,我建议到处使用一种交易类型(定义为宏),并且只有在发现实际速度改进时就会有所不同。否则,您可能会出现错误,例如在ets
交易中添加写入或违反上面的其他假设之一,然后沉没。