sql >> Database teknologi >  >> RDS >> Mysql

Tæller antallet af udførte forespørgsler

Jeg tror, ​​du besvarede dit eget spørgsmål ved at nævne assert_queries , men her kommer:

Jeg vil anbefale at tage et kig på koden bag assert_queries og bruge det til at bygge din egen metode, som du kan bruge til at tælle forespørgsler. Den vigtigste magi, der er involveret her, er denne linje:

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

Jeg havde lidt af en pille i morges og rippede de dele af ActiveRecord ud, der tæller forespørgslen og kom frem til dette:

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 vil være i stand til at referere til ActiveRecord::Base.count_queries metode hvor som helst. Send det en blok, hvor dine forespørgsler køres, og det vil returnere antallet af forespørgsler, der er blevet udført:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Returnerer "1" for mig. For at få dette til at fungere:læg det i en fil på lib/active_record/query_counter.rb og kræve det i din config/application.rb fil som denne:

require 'active_record/query_counter'

Hej presto!

En lille smule forklaring er nok påkrævet. Når vi kalder denne linje:

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

Vi tilslutter os Rails 3's lille notifikationsramme. Det er en skinnende lille tilføjelse til den seneste større version af Rails, som ingen rigtig kender til. Det giver os mulighed for at abonnere på meddelelser om begivenheder inden for Rails ved at bruge subscribe metode. Vi videregiver, hvis vi ønsker at abonnere på det første argument, derefter ethvert objekt, der reagerer på call som den anden.

I dette tilfælde, når en forespørgsel udføres, vil vores lille forespørgselstæller pligtopfyldende øge ActiveRecord::QueryCounter.query_count-variablen, men kun for den rigtige forespørgsler.

Det var i hvert fald sjovt. Jeg håber, det kommer til nytte for dig.



  1. Problem med oprettelse af udenlandsk nøgle i Oracle

  2. Find det mindste ubrugte tal i SQL Server

  3. Kombiner to tabeller til en ny, så udvalgte rækker fra den anden ignoreres

  4. En teknisk sammenligning:Microsoft Access 2016 vs SQL Server 2016