1. Introduction
When developing or optimizing Rails applications, one of the important jobs is understanding and optimizing SQL queries because most of the slow web speed is due to inappropriate DB query / processing logic. We are going to ask questions like: How many SQL queries are called after each request, how long does it take to complete an SQL query? Are the query repeatedly called in different places in the code? No ?, which query is called more times than others?
Normally, we usually find them by checking log files, but if we want to analyze a request in detail or if we want to track multiple requests at the same time, it will be difficult for us to find and filter out the messages. related information in log file.
To answer those questions, Steven Yue created a gem called sql_tracker . In this article, we will learn how the sql_tracker gem works and its features to help track and analyze SQL queries.
Tracking
Basically, sql_tracker uses instrumentation API to track SQL queries called from Active Record through the monitoring of the sql.active_record hook:
1 2 3 4 | <span class="token constant">ActiveSupport</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Notifications</span> <span class="token punctuation">.</span> subscribe <span class="token punctuation">(</span> <span class="token string">'sql.active_record'</span> <span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token operator">|</span> _name <span class="token punctuation">,</span> _start <span class="token punctuation">,</span> _finish <span class="token punctuation">,</span> _id <span class="token punctuation">,</span> payload <span class="token operator">|</span> sql_query <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token symbol">:sql</span> <span class="token punctuation">]</span> <span class="token keyword">end</span> |
Instead of using a block, we can provide an instance object, implemented by the method call:
1 2 3 4 5 6 7 8 | <span class="token keyword">class</span> <span class="token class-name">Handler</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">call</span></span> <span class="token punctuation">(</span> _name <span class="token punctuation">,</span> _start <span class="token punctuation">,</span> _finish <span class="token punctuation">,</span> _id <span class="token punctuation">,</span> payload <span class="token punctuation">)</span> sql_query <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token symbol">:sql</span> <span class="token punctuation">]</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token constant">ActiveSupport</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Notifications</span> <span class="token punctuation">.</span> subscribe <span class="token punctuation">(</span> <span class="token string">'sql.active_record'</span> <span class="token punctuation">,</span> <span class="token constant">Handler</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">)</span> |
sql_tracker is declared and tracks queries when a Rails process runs, and stops tracking when the Rails process finishes.
Filtering
We may not want to listen for all the queries. For example, we just want to track SELECT statements of queries, or we want to track queries that are called with a certain directory.
By default, sql_tracker tracks and record all 4 commands (SELECT, INSERT, UPDATE and DELETE), but we can change it by changing the settings tracked_sql_command
1 2 | <span class="token constant">SqlTracker</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Config</span> <span class="token punctuation">.</span> tracked_sql_command <span class="token operator">=</span> <span class="token string">%w(SELECT)</span> |
By default, sql_tracker tracks the app directory and lib folders to ignore unrelated queries (eg queries called from the tests folder).
Grouping
sql_tracker will try to simplify and assemble queries by replacing the special value with xxx. For example, if we execute the following SQL query:
1 2 | <span class="token constant">SELECT</span> users <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> users <span class="token constant">WHERE</span> users <span class="token punctuation">.</span> id <span class="token operator">=</span> <span class="token number">1</span> |
And then another query:
1 2 | <span class="token constant">SELECT</span> users <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> users <span class="token constant">WHERE</span> users <span class="token punctuation">.</span> id <span class="token operator">=</span> <span class="token number">2</span> |
sql_tracker will combine them into 1 query:
1 2 | <span class="token constant">SELECT</span> users <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> users <span class="token constant">WHERE</span> users <span class="token punctuation">.</span> id <span class="token operator">=</span> xxx |
sql_tracker uses regular expressions to rewrite SQL queries. Here for example, it has found and replaced values after operators like =, <>,>, <and even BETWEEN … AND … Once grouped, it becomes easy. It’s easier to analyze queries, and calculate total queries, average time, and more.
Storing
sql_tracker keeps all data in memory, and exports data in a JSON file when the Rails process finishes. All data contained in a hash, the format will have the form:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token punctuation">{</span> key1 <span class="token punctuation">:</span> <span class="token punctuation">{</span> sql <span class="token punctuation">:</span> <span class="token string">'SELECT users.* FROM users ...'</span> <span class="token punctuation">,</span> count <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">0.34</span> <span class="token punctuation">,</span> source <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'apps/model/user.rb:57:in ...'</span> <span class="token punctuation">,</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> key2 <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
When the keys are md5 or the sql queries have been simplified, and the values are full sql query + some statistical information.
By default, the file will be saved in the tmp directory in Rails roots folder, you can also change it using config:
1 2 | <span class="token constant">SqlTracker</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Config</span> <span class="token punctuation">.</span> output_path <span class="token operator">=</span> <span class="token builtin">File</span> <span class="token punctuation">.</span> join <span class="token punctuation">(</span> <span class="token constant">Rails</span> <span class="token punctuation">.</span> root <span class="token punctuation">.</span> to_s <span class="token punctuation">,</span> <span class="token string">'my_folder'</span> <span class="token punctuation">)</span> |
If we have used the puma app server, and set more than 1 worker, we will see more than 1 JSON output file in the output folder because each worker will track and store data separately.
Reporting
Finally, we can generate the report using 1 or more JSON dump files:
1 2 | sql_tracker tmp <span class="token operator">/</span> sql_tracker <span class="token operator">-</span> <span class="token operator">*</span> <span class="token punctuation">.</span> json |
The report will take the form:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">=</span> <span class="token constant">Total</span> <span class="token constant">Unique</span> <span class="token constant">SQL</span> <span class="token constant">Queries</span> <span class="token punctuation">:</span> <span class="token number">24</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">===</span> <span class="token operator">=</span> <span class="token constant">Count</span> <span class="token operator">|</span> <span class="token constant">Avg</span> <span class="token builtin">Time</span> <span class="token punctuation">(</span> ms <span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token constant">SQL</span> <span class="token constant">Query</span> <span class="token operator">|</span> <span class="token constant">Source</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token number">8</span> <span class="token operator">|</span> <span class="token number">0.33</span> <span class="token operator">|</span> <span class="token constant">SELECT</span> `users` <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> `users` <span class="token constant">WHERE</span> `users` <span class="token punctuation">.</span> `id` <span class="token operator">=</span> xxx <span class="token constant">LIMIT</span> <span class="token number">1</span> <span class="token operator">|</span> app <span class="token operator">/</span> controllers <span class="token operator">/</span> users_controller <span class="token punctuation">.</span> rb <span class="token punctuation">:</span> <span class="token number">125</span> <span class="token symbol">:in</span> `create' <span class="token operator">|</span> <span class="token operator">|</span> <span class="token operator">|</span> app <span class="token operator">/</span> controllers <span class="token operator">/</span> projects_controller <span class="token punctuation">.</span> rb <span class="token punctuation">:</span> <span class="token number">9</span> <span class="token symbol">:in</span> `block <span class="token keyword">in</span> update' <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token number">4</span> <span class="token operator">|</span> <span class="token number">0.27</span> <span class="token operator">|</span> <span class="token constant">SELECT</span> `projects` <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> `projects` <span class="token constant">WHERE</span> `projects` <span class="token punctuation">.</span> `user_id` <span class="token operator">=</span> xxx <span class="token constant">AND</span> `projects` <span class="token punctuation">.</span> `id` <span class="token operator">=</span> xxx <span class="token constant">LIMIT</span> <span class="token number">1</span> <span class="token operator">|</span> app <span class="token operator">/</span> controllers <span class="token operator">/</span> projects_controller <span class="token punctuation">.</span> rb <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token symbol">:in</span> `update' <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token number">2</span> <span class="token operator">|</span> <span class="token number">0.27</span> <span class="token operator">|</span> <span class="token constant">UPDATE</span> `projects` <span class="token constant">SET</span> `updated_at` <span class="token operator">=</span> xxx <span class="token constant">WHERE</span> `projects` <span class="token punctuation">.</span> `id` <span class="token operator">=</span> xxx <span class="token operator">|</span> app <span class="token operator">/</span> controllers <span class="token operator">/</span> projects_controller <span class="token punctuation">.</span> rb <span class="token punctuation">:</span> <span class="token number">9</span> <span class="token symbol">:in</span> `block <span class="token keyword">in</span> update' <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token number">2</span> <span class="token operator">|</span> <span class="token number">1.76</span> <span class="token operator">|</span> <span class="token constant">SELECT</span> projects <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> projects <span class="token constant">WHERE</span> projects <span class="token punctuation">.</span> priority <span class="token constant">BETWEEN</span> xxx <span class="token constant">AND</span> xxx <span class="token constant">ORDER</span> <span class="token constant">BY</span> created_at <span class="token constant">DESC</span> <span class="token operator">|</span> app <span class="token operator">/</span> controllers <span class="token operator">/</span> projects_controller <span class="token punctuation">.</span> rb <span class="token punctuation">:</span> <span class="token number">35</span> <span class="token symbol">:in</span> `index' <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token operator">--</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> |
It will show us the total number of calls for each query, the average time of each query, and which line of code calls that query. From this report, we can understand how each query was called, where to call it, … If simple queries are called too many times, think of a solution to caching it. And if the same query is repeated in different places in the source code, it is time to refactor the code.
Usually, we choose some controller tests or integration tests to run, and after the tests have run, open sql_tracker tmp/sql_tracker-*.json
again to dumped data and check the queries.
Conclude
Thus, the article has learned about tracking query in rails with gem sql_tracker. Hope the article helps everyone to debug or improve the quality of their Rails application. See you again!
Reference
https://github.com/steventen/sql_tracker
http://stevenyue.com/blogs/tracking-sql-queries-in-rails/ .