Don't run explain on slow queries for database adapters that don't support it

This commit is contained in:
Blake Smith 2012-11-21 08:28:37 -06:00
parent 3ec443086b
commit 50e8613528
3 changed files with 24 additions and 6 deletions

View File

@ -6,11 +6,12 @@ module ActiveRecord
base.mattr_accessor :auto_explain_threshold_in_seconds, instance_accessor: false base.mattr_accessor :auto_explain_threshold_in_seconds, instance_accessor: false
end end
# If auto explain is enabled, this method triggers EXPLAIN logging for the # If the database adapter supports explain and auto explain is enabled,
# queries triggered by the block if it takes more than the threshold as a # this method triggers EXPLAIN logging for the queries triggered by the
# whole. That is, the threshold is not checked against each individual # block if it takes more than the threshold as a whole. That is, the
# query, but against the duration of the entire block. This approach is # threshold is not checked against each individual query, but against the
# convenient for relations. # duration of the entire block. This approach is convenient for relations.
# #
# The available_queries_for_explain thread variable collects the queries # The available_queries_for_explain thread variable collects the queries
# to be explained. If the value is nil, it means queries are not being # to be explained. If the value is nil, it means queries are not being
@ -21,7 +22,7 @@ module ActiveRecord
threshold = auto_explain_threshold_in_seconds threshold = auto_explain_threshold_in_seconds
current = Thread.current current = Thread.current
if threshold && current[:available_queries_for_explain].nil? if connection.supports_explain? && threshold && current[:available_queries_for_explain].nil?
begin begin
queries = current[:available_queries_for_explain] = [] queries = current[:available_queries_for_explain] = []
start = Time.now start = Time.now

View File

@ -136,6 +136,13 @@ module ActiveRecord
end end
end end
initializer "active_record.validate_explain_support" do |app|
if app.config.active_record[:auto_explain_threshold_in_seconds] &&
!ActiveRecord::Base.connection.supports_explain?
warn "auto_explain_threshold_in_seconds is set but will be ignored because your adapter does not support this feature. Please unset the configuration to avoid this warning."
end
end
# Expose database runtime to controller for logging. # Expose database runtime to controller for logging.
initializer "active_record.log_runtime" do |app| initializer "active_record.log_runtime" do |app|
require "active_record/railties/controller_runtime" require "active_record/railties/controller_runtime"

View File

@ -108,6 +108,16 @@ if ActiveRecord::Base.connection.supports_explain?
assert_equal expected, base.exec_explain(queries) assert_equal expected, base.exec_explain(queries)
end end
def test_unsupported_connection_adapter
connection.stubs(:supports_explain?).returns(false)
base.logger.expects(:warn).never
with_threshold(0) do
Car.where(:name => 'honda').to_a
end
end
def test_silence_auto_explain def test_silence_auto_explain
base.expects(:collecting_sqls_for_explain).never base.expects(:collecting_sqls_for_explain).never
base.logger.expects(:warn).never base.logger.expects(:warn).never