sql >> データベース >  >> RDS >> Mysql

実行されたクエリの数を数える

    assert_queriesに言及して、あなた自身の質問に答えたと思います 、しかしここに行きます:

    assert_queriesの背後にあるコードを確認することをお勧めします それを使用して、クエリのカウントに使用できる独自のメソッドを構築します。ここに含まれる主な魔法は次の行です:

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

    今朝少しいじくり回して、クエリカウントを行うActiveRecordの部分を取り除いて、これを思いついた:

    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
    

    ActiveRecord::Base.count_queriesを参照できるようになります どこでもメソッド。クエリが実行されるブロックを渡すと、実行されたクエリの数が返されます:

    ActiveRecord::Base.count_queries do
      Ticket.first
    end
    

    「1」を返します。これを機能させるには:lib/active_record/query_counter.rbのファイルに入れます config/application.rbでそれを要求します このようなファイル:

    require 'active_record/query_counter'
    

    やあプレスト!

    おそらく少し説明が必要です。この行を呼び出すとき:

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

    Rails3の小さな通知フレームワークに接続します。これは、誰も実際に知らないRailsの最新のメジャーバージョンへの光沢のある小さな追加です。 subscribeを使用して、Rails内のイベントの通知をサブスクライブできます。 方法。サブスクライブするイベントを最初の引数として渡し、次にcallに応答するオブジェクトを渡します。 2番目として。

    この場合、クエリが実行されると、小さなクエリカウンターがActiveRecord ::QueryCounter.query_count変数を忠実にインクリメントしますが、これは real のみです クエリ。

    とにかく、これは楽しかったです。お役に立てば幸いです。



    1. 同じ列値を持つmysqlテーブルから特定の行を削除するにはどうすればよいですか?

    2. Oracleのログテーブルから電子メール本文にデータをエクスポートする方法

    3. 成功したMySQL/MariaDBのバックアップおよびリカバリ戦略

    4. Oracleのデュアルテーブルとは何ですか?