好问题!现在,我想到了两种方法。一个我们使用qlc,另一个我们使用mnesia's own table iteration methods with accumulators。这是第一个选项:
%% 这里我使用 'qlc',带警卫
%% 确保时间戳
%% 在给定的“foo 记录”中
%% 在表 'bar' 中不存在
查询()->
Is_not_in_bar = fun(邮票)->
case mnesia:dirty_read({bar,Stamp}) of
[]->真;
_ -> 假的
结尾
结束,
Q = qlc:q([R || R Is_not_in_bar(R#foo.timestamp) == true])),
Fun = fun(QH)-> qlc:e(QH) 结束,
mnesia:activity(transaction,Fun,[Q],mnesia_frag)。
另一种选择是迭代表
foo,同时交叉引用表
bar 中的每个时间戳。如果在
bar 中找不到它,则将其添加到累计金额中。看看下面这个
%% 这里我迭代表'foo'
%% 对于我找到的每条记录,
%% 我尝试交叉引用
%% 它在表'bar'中的时间戳
%% 如果没有找到,那么我补充一下
%% 'foo 记录' 进入缓冲区
%% 我积累这个缓冲区直到
%% 整个表 'foo' 已经
%% 遍历
query_vsn2()->
迭代器 = fun(#foo{timestamp = T} = Rec,Buffer)->
NewBuffer = case mnesia:dirty_read({bar,T}) of
[] -> [记录|缓冲区];
_ -> 缓冲区
结尾,
新缓冲区
结尾,
Find = fun(Loop)-> mnesia:foldl(Loop,[],foo) end,
mnesia:activity(transaction,Find,[Iterator],mnesia_frag)。
我猜根据表大小、应用程序和用户偏好,这些功能中的每一个都会产生影响。但是,请尝试这两种方法,看看哪一种能很好地融入您的应用程序。好消息是这完全是一个读取工作,没有写入,所以我希望效率足够高。成功 !