Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comptage du nombre de requêtes effectuées

Je pense que vous avez répondu à votre propre question en mentionnant assert_queries , mais voilà :

Je recommanderais de jeter un œil au code derrière assert_queries et l'utiliser pour créer votre propre méthode que vous pouvez utiliser pour compter les requêtes. La magie principale impliquée ici est cette ligne :

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

J'ai eu un peu de bricolage ce matin et j'ai extrait les parties d'ActiveRecord qui comptent la requête et j'ai trouvé ceci :

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

Vous pourrez référencer le ActiveRecord::Base.count_queries méthode n'importe où. Passez-lui un bloc dans lequel vos requêtes sont exécutées et il renverra le nombre de requêtes qui ont été exécutées :

ActiveRecord::Base.count_queries do
  Ticket.first
end

Renvoie "1" pour moi. Pour que cela fonctionne :mettez-le dans un fichier à lib/active_record/query_counter.rb et exigez-le dans votre config/application.rb fichier comme celui-ci :

require 'active_record/query_counter'

Hé hop !

Un peu d'explication est probablement nécessaire. Lorsque nous appelons cette ligne :

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

Nous nous connectons au petit framework de notifications de Rails 3. C'est un petit ajout brillant à la dernière version majeure de Rails que personne ne connaît vraiment. Il nous permet de nous abonner aux notifications d'événements dans Rails en utilisant le subscribe méthode. On passe dans l'événement auquel on veut s'abonner comme premier argument puis tout objet qui répond à call comme deuxième.

Dans ce cas, lorsqu'une requête est exécutée, notre petit compteur de requêtes incrémentera consciencieusement la variable ActiveRecord::QueryCounter.query_count, mais uniquement pour le réel requêtes.

Quoi qu'il en soit, c'était amusant. J'espère que cela vous sera utile.