sql >> Databasteknik >  >> RDS >> Mysql

Räknar antalet utförda frågor

Jag tror att du svarade på din egen fråga genom att nämna assert_queries , men här kommer:

Jag skulle rekommendera att ta en titt på koden bakom assert_queries och använda det för att bygga din egen metod som du kan använda för att räkna frågor. Den huvudsakliga magin här är denna rad:

ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)

Jag pysslade lite i morse och slet ut de delar av ActiveRecord som gör frågeräkningen och kom fram till detta:

module ActiveRecord
  class QueryCounter
    cattr_accessor :query_count do
      0
    end

    IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/]

    def call(name, start, finish, message_id, values)
      # FIXME: this seems bad. we should probably have a better way to indicate
      # the query was cached
      unless 'CACHE' == values[:name]
        self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r }
      end
    end
  end
end

ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

module ActiveRecord
  class Base
    def self.count_queries(&block)
      ActiveRecord::QueryCounter.query_count = 0
      yield
      ActiveRecord::QueryCounter.query_count
    end
  end
end

Du kommer att kunna referera till ActiveRecord::Base.count_queries metod var som helst. Skicka det ett block där dina frågor körs och det kommer att returnera antalet frågor som har körts:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Returnerar "1" för mig. För att få det här att fungera:lägg det i en fil på lib/active_record/query_counter.rb och kräver det i din config/application.rb fil så här:

require 'active_record/query_counter'

Hej presto!

Lite förklaring krävs förmodligen. När vi ringer denna linje:

    ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

Vi kopplar in i Rails 3:s lilla meddelanderamverk. Det är ett glänsande litet tillägg till den senaste större versionen av Rails som ingen riktigt känner till. Det tillåter oss att prenumerera på meddelanden om händelser inom Rails genom att använda subscribe metod. Vi skickar i händelse vi vill prenumerera på som första argument sedan alla objekt som svarar på call som den andra.

I det här fallet när en fråga exekveras kommer vår lilla frågeräknare plikttroget att öka variabeln ActiveRecord::QueryCounter.query_count, men bara för den riktiga frågor.

Hur som helst, det här var kul. Jag hoppas att det kommer till nytta för dig.



  1. UPPER() Funktion i Oracle

  2. Applikationsstackens framtid

  3. hämta ut parameter från lagrad procedur?

  4. Oracle SQL ordning efter i subquery problem!