/pg_query_analyzer

Provides a PostgreSQL query analysis in your development logs.

Primary LanguageRuby

== PostgreSQL Query Analyzer for Rails

Provides a PostgreSQL query analysis in your development logs. 

This is useful for finding indexes that your database may benefit from. There 
are alternatives available that guess which indexes may help and provide 
example migrations, but I've found that performing a manual analysis using
tools like this typically leads to the best results. 


== Instructions

Install the gem:

  sudo gem install pg_query_analyzer

Require it development (config/enviroments/development.rb):

  config.gem "pg_query_analyzer"

You'll achieve the best results if you have your production database available
locally. If you're using Heroku (http://heroku.com) this means setting up your
development database to use PostgreSQL and running ("heroku db:pull").

Restart your server ("script/server" or "touch tmp/restart.txt") and tail your
development log ("tail -f -n 100 log/development.log") to see the results. Note
the "total runtime", "cost", and "actual time" data points to locate long 
running queries, as you might see in the second example provided below.

Once you identify which queries are worth optimizing, you can generate and run 
migrations to create the appropriate indexes, restart your server, and check 
your logs to ensure that you're getting the results you expect. Once you're 
finished, you can comment out or remove the config.gem call.

Read more about database indexes here:

  http://www.therailsway.com/2006/11/21/tracks-part-4
  http://blog.evanweaver.com/articles/2007/02/12/table-indexes-in-rails/
  http://github.com/eladmeidar/rails_indexes


== Example One

  User Load (2.5ms)   SELECT * FROM "users" WHERE ("users"."id" = 2) LIMIT 1
  Analyzing User Load Execution Time: 0.002899

  Limit  (cost=0.00..8.27 rows=1 width=3734) (actual time=0.012..0.012 rows=1 loops=1)
  Output: id, login, posts_count, followings_count, followers_count, created_at, updated_at,...
  ->  Index Scan using users_pkey on users  (cost=0.00..8.27 rows=1 width=3734) (actual time=0.011..0.011 rows=1 loops=1)
        Output: id, login, posts_count, followings_count, followers_count, created_at, updated_at...
        Index Cond: (id = 2)
  Total runtime: 0.052 ms


== Example Two

  FeedItem Load (5.1ms)   SELECT * FROM "feed_items" WHERE ("feed_items".user_id = 2) ORDER BY feed_items.post_created_at DESC
  Analyzing FeedItem Load Execution Time: 0.014169

  Sort  (cost=248.49..249.21 rows=290 width=32) (actual time=1.870..1.895 rows=290 loops=1)
  Output: id, user_id, post_id, poster_id, post_created_at, created_at
  Sort Key: post_created_at
  Sort Method:  quicksort  Memory: 47kB
  ->  Seq Scan on feed_items  (cost=0.00..236.62 rows=290 width=32) (actual time=0.015..1.735 rows=290 loops=1)
        Output: id, user_id, post_id, poster_id, post_created_at, created_at
        Filter: (user_id = 2)
  Total runtime: 1.948 ms


== Credits

MODIFIED by John Eberly originally take from http://svn.nfectio.us
PostgreSQL and Oracle Adapter from Luca Mearelli http://spazidigitali.com
Cooked and gemified by Marcos Piccinini http://github.com/nofxx/query-analyzer
PostgreSQL Only Version from Trevor Turk http://github.com/trevorturk/pg_query_analyzer


== MIT License

Spatial Adapter Copyright (c) 2006 Guilhem Vellut <guilhem.vellut+georuby@gmail.com>
PostGis Adapter Functions (c) 2008 Marcos Piccinini <nofxx>
PostgreSQL Only Version   (c) 2010 Trevor Turk <trevorturk@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.