Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contando o número de consultas realizadas


Acho que você respondeu sua própria pergunta mencionando assert_queries , mas aqui vai:

Eu recomendaria dar uma olhada no código por trás de assert_queries e usando isso para construir seu próprio método que você pode usar para contar consultas. A principal mágica envolvida aqui é esta linha:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)

Eu tive um pouco de conserto esta manhã e retirei as partes do ActiveRecord que fazem a contagem de consultas e cheguei a isso:
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

Você poderá fazer referência ao ActiveRecord::Base.count_queries método em qualquer lugar. Passe um bloco onde suas consultas são executadas e ele retornará o número de consultas que foram executadas:
ActiveRecord::Base.count_queries do
  Ticket.first
end

Retorna "1" para mim. Para fazer isso funcionar:coloque-o em um arquivo em lib/active_record/query_counter.rb e exija-o em seu config/application.rb arquivo assim:
require 'active_record/query_counter'

Oi presto!

Um pouco de explicação provavelmente é necessária. Quando chamamos esta linha:
    ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

Nós nos conectamos ao pequeno framework de notificações do Rails 3. É uma pequena adição brilhante à última versão principal do Rails que ninguém realmente conhece. Ele nos permite assinar notificações de eventos dentro do Rails usando o subscribe método. Passamos no evento que queremos assinar como o primeiro argumento, então qualquer objeto que responda a call como o segundo.

Nesse caso, quando uma consulta é executada, nosso pequeno contador de consultas incrementará a variável ActiveRecord::QueryCounter.query_count, mas apenas para a variável real consultas.

De qualquer forma, isso foi divertido. Espero que seja útil para você.