class ActiveRecord::PostgreSQLAnalyzer::LogSubscriber

Constants

EXPLAINED_SQLS
IGNORED_PAYLOADS
SEQ_SCAN

Public Instance Methods

ignore_payload?(payload) click to toggle source
# File lib/active_record/postgresql_analyzer.rb, line 32
def ignore_payload?(payload)
  payload[:exception] || IGNORED_PAYLOADS.include?(payload[:name]) || payload[:sql] !~ EXPLAINED_SQLS
end
seq_scan?(explain_result) click to toggle source
# File lib/active_record/postgresql_analyzer.rb, line 36
def seq_scan?(explain_result)
  explain_result =~ SEQ_SCAN
end
sql(event) click to toggle source
# File lib/active_record/postgresql_analyzer.rb, line 13
def sql(event)
  payload = event.payload

  return if ignore_payload?(payload)

  connection = ObjectSpace._id2ref(payload[:connection_id])

  # disable SeqScan when index exists
  #   SEE ALSO: http://www.postgresql.org/docs/9.4/static/indexes-examine.html
  connection.execute("SET enable_seqscan TO off", "SCHEMA")

  explain_result = connection.explain(payload[:sql], payload[:binds])
  if seq_scan?(explain_result)
    debug '------------ find Seq Scan query ------------'
    debug payload[:sql]
    debug explain_result
  end
end