dirty_select a limited number of records
Aleksander Nycz
Aleksander.Nycz@REDACTED
Wed Nov 27 10:29:04 CET 2019
Hello,
Please check:
https://github.com/nyczol/otp/tree/mnesia_new_index2
for dirty_index_read/4 with limit in mnesia module.
Branch was created in 2013 but unfortunately PR was rejected by OTP.
Branch contains 2 features:
- new index type for mnesia
- set of functions that operate on secondary indexes and return limited
number of records
Used on prod envs from 2013 untli now.
Maybe its good time to create PR again for 2nd part only?
Regards
Aleksander Nycz
W dniu 27.11.2019 o 10:03, Roberto Ostinelli pisze:
> Here's another try, this one too is very slow:
>
> QH = qlc:q([E || E <- mnesia:table(my_table), E#my_table.pid == Pid]),
> mnesia:async_dirty(fun() ->
> QC = qlc:cursor(QH),
> R = qlc:next_answers(QC, N),
> qlc:delete_cursor(QC),
> R
> end).
>
> Any ideas?
>
>
>
> On Tue, Nov 26, 2019 at 6:33 PM Roberto Ostinelli <ostinelli@REDACTED
> <mailto:ostinelli@REDACTED>> wrote:
>
> All,
> I've got a mnesia table that I create with:
>
> mnesia:create_table(my_table, [
> {type, set},
> {attributes, record_info(fields, my_table)},
> {index, [#my_table.pid]},
> {storage_properties, [{ets, [{read_concurrency, true},
> {write_concurrency, true}]}]}
> ]).
>
> If I want to get all records for the secondary index, I do:
>
> mnesia:dirty_index_read(my_table, Pid, #my_table.pid).
>
> This operation if very fast. Now, sometimes I just need the
> /first/ matching record and if there are many entries with the
> secondary index, the operation becomes a bottleneck. So I'm trying:
>
> S = fun() ->
> MatchHead = #my_table{pid = Pid, _ = '_'},
> Guards = [],
> Result = '$_',
> mnesia:select(my_table, [{MatchHead, Guards, [Result]}], 1, read)
> end,
> case mnesia:activity(sync_dirty, S) of
> {[Entry], _} -> Entry;
> _ -> undefined
> end.
>
> This works, however this operation does not seem to be using the
> secondary index as it becomes extremely slow. I also tried:
>
> S = fun() ->
> MatchHead = #my_table{pid = '$1', _ = '_'},
> Guard = {'=:=', '$1', Pid},
> Result = '$_',
> mnesia:select(my_table, [{MatchHead, [Guard], [Result]}], 1, read)
> end,
> case mnesia:activity(sync_dirty, S) of
> '$end_of_table' -> undefined;
> {[Entry], _} -> Entry
> end.
>
> And this is also slow. What can I do to dirty_select a limited
> number of records from a mnesia table?
>
> Thank you,
> r.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20191127/01cfedd7/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4941 bytes
Desc: Kryptograficzna sygnatura S/MIME
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20191127/01cfedd7/attachment.bin>
More information about the erlang-questions
mailing list