分析Mnesia查询

Gor*_*rie 13 database erlang profiling mnesia

我们的Mnesia DB运行缓慢,我们认为它应该更快一些.

因此,我们需要对其进行分析并找出正在发生的事情.

有许多选项表明自己:

  • 运行fprof,看看时间在哪里
  • 运行cprof并查看调用了哪些函数

然而,这些都是相当标准的性能监控样式工具.问题是我如何实际进行查询分析 - 哪些查询花费的时间最长.如果我们是Oracle或MySQL商店,我们只会运行一个查询分析器,它将返回需要很长时间才能运行的各种查询.这不是Mnesia似乎可用的工具.

所以问题是:

  • 有什么技术来描述Mnesia
  • 有什么工具来描述Mnesia - 我认为没有,但证明我错了:)
  • 您是如何分析查询并优化mnesia数据库安装的

根据讨论扩大

fprof作为性能分析工具的一个问题是它只会告诉您正在查看的特定查询.所以fprof告诉我X很慢,我调整它以加快速度.然后,低,看,操作Y(这是足够快)现在是狗慢.因此,我描述了Y,并意识到快速制作Y的方法是让X变慢.所以我最终做了一系列双边权衡......

我真正需要的是一种管理多边权衡的方法.我现在记录了2个实际用户活动的度量标准,我可以重放.这些日志代表了我想要优化的内容.

SQL数据库上的"正确"查询分析器将能够分析SQL语句的结构,例如具有以下形式的所有语句:

SELECT [fieldset] FROM [table] WHERE {field = *parameter*}, {field = *parameter*}
Run Code Online (Sandbox Code Playgroud)

并且说这个形式的285个查询平均需要0.37ms才能运行

他们说出了神奇的答案:这个表格的17个查询需要运行6.34秒并在表X上进行全表扫描,你应该在字段Y上放一个索引

当我在一组有代表性的用户活动中得到这样的结果集时,我可以开始在这一轮中进行权衡 - 并设计一个测试模式.

测试模式类似于:

  • 活动X会使查询A,C和C更快,但查询E和F会更慢
  • 测试和测量
  • 然后批准/不批准

我一直在使用Erlang足以"知道"没有像这样的查询分析器,我想知道的是其他人(必须有这个问题)对于mnesia优化的"理由".

Jer*_*all 2

由于 Mnesia 查询只是 erlang 函数,我想您可以像分析自己的 erlang 代码一样分析它们。http://www.erlang.org/doc/efficiency_guide/profiling.html#id2266192有关于可用的 erlang 分析工具的更多信息。

更新作为测试,我在家里的一个测试 mnesia 实例上运行了这个,并使用 fprof 跟踪 mnesia qlc 查询返回的输出,我在下面包含了一个示例。因此它肯定包含比查询调用更多的信息。

....
{[{{erl_lint,pack_errors,1},                      2,    0.004,    0.004}],     
 { {lists,map,2},                                 2,    0.004,    0.004},     %
 [ ]}.

{[{{mnesia_tm,arrange,3},                         1,    0.004,    0.004}],     
 { {ets,first,1},                                 1,    0.004,    0.004},     %
 [ ]}.

{[{{erl_lint,check_remote_function,5},            2,    0.004,    0.004}],     
 { {erl_lint,check_qlc_hrl,5},                    2,    0.004,    0.004},     %
 [ ]}.

{[{{mnesia_tm,multi_commit,4},                    1,    0.003,    0.003}],     
 { {mnesia_locker,release_tid,1},                 1,    0.003,    0.003},     %
 [ ]}.

{[{{mnesia,add_written_match,4},                  1,    0.003,    0.003}],     
 { {mnesia,add_match,3},                          1,    0.003,    0.003},     %
 [ ]}.

{[{{mnesia_tm,execute_transaction,5},             1,    0.003,    0.003}],     
 { {erlang,erase,1},                              1,    0.003,    0.003},     %
 [ ]}.

{[{{mnesia_tm,intercept_friends,2},               1,    0.002,    0.002}],     
 { {mnesia_tm,intercept_best_friend,2},           1,    0.002,    0.002},     %
 [ ]}.

{[{{mnesia_tm,execute_transaction,5},             1,    0.002,    0.002}],     
 { {mnesia_tm,flush_downs,0},                     1,    0.002,    0.002},     %
 [ ]}.

{[{{mnesia_locker,rlock_get_reply,4},             1,    0.002,    0.002}],     
 { {mnesia_locker,opt_lookup_in_client,3},        1,    0.002,    0.002},     %
 [ ]}.

{[ ],
 { undefined,                                     0,    0.000,    0.000},     %
 [{{shell,eval_exprs,6},                          0,   18.531,    0.000},      
  {{shell,exprs,6},                               0,    0.102,    0.024},      
  {{fprof,just_call,2},                           0,    0.034,    0.027}]}.
Run Code Online (Sandbox Code Playgroud)