mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
add the query to AR::Relation#explain output
Rationale: this is more readable if serveral queries are involved in one call. Also, it will be possible to let AR log EXPLAINs automatically in production mode, where queries are not even around.
This commit is contained in:
parent
a5b362df56
commit
1be9830d4d
5 changed files with 17 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
require 'active_support/core_ext/object/blank'
|
||||
require 'active_support/core_ext/module/delegation'
|
||||
|
||||
|
@ -155,8 +156,8 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
queries.map do |sql|
|
||||
@klass.connection.explain(sql)
|
||||
end.join
|
||||
"EXPLAIN for: #{sql}\n#{@klass.connection.explain(sql)}"
|
||||
end.join("\n")
|
||||
end
|
||||
|
||||
def to_a
|
||||
|
|
|
@ -9,12 +9,15 @@ module ActiveRecord
|
|||
|
||||
def test_explain_for_one_query
|
||||
explain = Developer.where(:id => 1).explain
|
||||
assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
|
||||
assert_match %(developers | const), explain
|
||||
end
|
||||
|
||||
def test_explain_with_eager_loading
|
||||
explain = Developer.where(:id => 1).includes(:audit_logs).explain
|
||||
assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
|
||||
assert_match %(developers | const), explain
|
||||
assert_match %(EXPLAIN for: SELECT `audit_logs`.* FROM `audit_logs` WHERE `audit_logs`.`developer_id` IN (1)), explain
|
||||
assert_match %(audit_logs | ALL), explain
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,6 +9,7 @@ module ActiveRecord
|
|||
|
||||
def test_explain_for_one_query
|
||||
explain = Developer.where(:id => 1).explain
|
||||
assert_match %(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = 1), explain
|
||||
assert_match %(QUERY PLAN), explain
|
||||
assert_match %(Index Scan using developers_pkey on developers), explain
|
||||
end
|
||||
|
@ -16,7 +17,9 @@ module ActiveRecord
|
|||
def test_explain_with_eager_loading
|
||||
explain = Developer.where(:id => 1).includes(:audit_logs).explain
|
||||
assert_match %(QUERY PLAN), explain
|
||||
assert_match %(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = 1), explain
|
||||
assert_match %(Index Scan using developers_pkey on developers), explain
|
||||
assert_match %(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" IN (1)), explain
|
||||
assert_match %(Seq Scan on audit_logs), explain
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,12 +9,15 @@ module ActiveRecord
|
|||
|
||||
def test_explain_for_one_query
|
||||
explain = Developer.where(:id => 1).explain
|
||||
assert_match %(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = 1), explain
|
||||
assert_match(/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/, explain)
|
||||
end
|
||||
|
||||
def test_explain_with_eager_loading
|
||||
explain = Developer.where(:id => 1).includes(:audit_logs).explain
|
||||
assert_match %(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = 1), explain
|
||||
assert_match(/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/, explain)
|
||||
assert_match %(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" IN (1)), explain
|
||||
assert_match(/(SCAN )?TABLE audit_logs/, explain)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1287,6 +1287,7 @@ User.where(:id => 1).joins(:posts).explain
|
|||
may yield
|
||||
|
||||
<plain>
|
||||
EXPLAIN for: SELECT `users`.* FROM `users` INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id` WHERE `users`.`id` = 1
|
||||
<plus>----<plus>-------------<plus>-------<plus>-------<plus>---------------<plus>---------<plus>---------<plus>-------<plus>------<plus>-------------<plus>
|
||||
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
||||
<plus>----<plus>-------------<plus>-------<plus>-------<plus>---------------<plus>---------<plus>---------<plus>-------<plus>------<plus>-------------<plus>
|
||||
|
@ -1302,6 +1303,7 @@ Active Record performs a pretty printing that emulates the one of the database
|
|||
shells. So, the same query running with the PostgreSQL adapter would yield instead
|
||||
|
||||
<plain>
|
||||
EXPLAIN for: SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "users"."id" = 1
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------------
|
||||
Nested Loop Left Join (cost=0.00..37.24 rows=8 width=0)
|
||||
|
@ -1324,12 +1326,15 @@ User.where(:id => 1).includes(:posts).explain
|
|||
yields
|
||||
|
||||
<plain>
|
||||
EXPLAIN for: SELECT `users`.* FROM `users` WHERE `users`.`id` = 1
|
||||
<plus>----<plus>-------------<plus>-------<plus>-------<plus>---------------<plus>---------<plus>---------<plus>-------<plus>------<plus>-------<plus>
|
||||
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
||||
<plus>----<plus>-------------<plus>-------<plus>-------<plus>---------------<plus>---------<plus>---------<plus>-------<plus>------<plus>-------<plus>
|
||||
| 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |
|
||||
<plus>----<plus>-------------<plus>-------<plus>-------<plus>---------------<plus>---------<plus>---------<plus>-------<plus>------<plus>-------<plus>
|
||||
1 row in set (0.00 sec)
|
||||
|
||||
EXPLAIN for: SELECT `posts`.* FROM `posts` WHERE `posts`.`user_id` IN (1)
|
||||
<plus>----<plus>-------------<plus>-------<plus>------<plus>---------------<plus>------<plus>---------<plus>------<plus>------<plus>-------------<plus>
|
||||
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
||||
<plus>----<plus>-------------<plus>-------<plus>------<plus>---------------<plus>------<plus>---------<plus>------<plus>------<plus>-------------<plus>
|
||||
|
|
Loading…
Reference in a new issue