Re: QLC Performances

Jean Parpaillon <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <[email protected]>
Sorry, the missing links:
Merge request with benchmarks:
https://gitlab.com/patatoid/ecto3_mnesia/-/merge_requests/56

Ecto Query to Qlc compiler:
https://gitlab.com/patatoid/ecto3_mnesia/-/blob/master/lib/ecto/adapters/mnesia/query/qlc.ex

Cheers,
Jean


Le mercredi 06 octobre 2021 à 14:37 +0200, Jean Parpaillon a écrit :
> Dear all,
> With Pascal in CC, I'm working on an elixir Ecto to mnesia adapter.
> 
> Ecto queries are represented as an AST, which is compiled into database
> specific calls:
> * `mnesia:read/2` for basic queries
> * Qlc for others
> 
> We are facing huge performance issues and have tried to optimize the
> library in many ways, but it looks like the performance bottleneck is
> now in Qlc itself.
> 
> The library now includes a benchmark. In this merge request, you will
> find a benchmark that fetches 1000 records randomly from a table, by a
> non-key column.
> 
> There a 3 implementations:
> * mnesia.get.int.idx -> `mnesia:index_read/3`
> * qlc.get.int.idx -> use hand written qlc query ([Rec || {'_', '_',
> IndexedIntField, '_', '_', '_', '_', '_'} = Rec <-
> mnesia:table('test_table'), IndexedIntField == B0].')
> * ecto.get.int.idx -> use Ecto adapter
> 
> Here is the result of the benchmark:
> 
> Name                         ips        average  deviation        
> median         99th %
> mnesia.get.int.idx         30.38       0.0329 s    ±21.16%       0.0308
> s       0.0655 s
> qlc.get.int.idx             0.62         1.61 s     ±0.81%         1.60
> s         1.63 s
> ecto.get.int.idx            0.34         2.94 s     ±1.90%         2.93
> s         3.02 s
> 
> Comparison: 
> mnesia.get.int.idx         30.38
> qlc.get.int.idx             0.62 - 48.82x slower +1.57 s
> ecto.get.int.idx            0.34 - 89.44x slower +2.91 s
> 
> Memory usage statistics:
> 
> Name                       average  deviation         median        
> 99th %
> mnesia.get.int.idx      0.00496 GB     ±0.10%     0.00496 GB    
> 0.00497 GB
> qlc.get.int.idx            1.71 GB     ±0.00%        1.71 GB       
> 1.71 GB
> ecto.get.int.idx           1.55 GB     ±0.00%        1.55 GB       
> 1.55 GB
> 
> Comparison: 
> mnesia.get.int.idx      0.00496 GB
> qlc.get.int.idx            1.71 GB - 344.04x memory usage +1.70 GB
> ecto.get.int.idx           1.55 GB - 313.04x memory usage +1.55 GB
> 
> We can observe a small overhead between plain qlc and Ecto, but a MAJOR
> performance drop between plain mnesia and qlc.
> 
> Has this performance drop been observed in other applications ? May I
> expect better performance with a different usage of qlc ?
> 
> I may try to fix qlc, would some bottlenecks have been identified or
> someone give me some hints on where those bottlenecks can be.
> 
> I have also had a look at erl_syntax module from syntax_tools. Does it
> seem a better approach to use erl_syntax for generating query handles,
> rather than existing qlc parse transform ?
> 
> I need and willing to help on this topic, and every hint is welcome.
> 
> Best regards,

-- 
Jean Parpaillon
--
Software Engineering Consultant
Chairman @ OW2 Consortium - https://ow2.org/
Président L'Insolite Compagnie - https://insolitecompagnie.com
--
Phone: +33 6 30 10 92 86
linkedin: http://www.linkedin.com/in/jeanparpaillon/en
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.