Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menghitung jumlah kueri yang dilakukan

Saya pikir Anda menjawab pertanyaan Anda sendiri dengan menyebutkan assert_queries , tapi begini:

Saya akan merekomendasikan untuk melihat kode di balik assert_queries dan menggunakannya untuk membangun metode Anda sendiri yang dapat Anda gunakan untuk menghitung kueri. Sihir utama yang terlibat di sini adalah baris ini:

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

Saya sedikit mengotak-atik pagi ini dan merobek bagian ActiveRecord yang melakukan penghitungan kueri dan menghasilkan ini:

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

Anda akan dapat mereferensikan ActiveRecord::Base.count_queries metode di mana saja. Berikan blok tempat kueri Anda dijalankan dan itu akan mengembalikan jumlah kueri yang telah dieksekusi:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Mengembalikan "1" untuk saya. Untuk membuatnya berfungsi:taruh dalam file di lib/active_record/query_counter.rb dan minta di config/application.rb file seperti ini:

require 'active_record/query_counter'

Hei!

Sedikit penjelasan mungkin diperlukan. Saat kita memanggil baris ini:

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

Kami menghubungkan ke kerangka pemberitahuan kecil Rails 3. Ini adalah tambahan kecil yang mengilap untuk versi utama terbaru dari Rails yang tidak diketahui oleh siapa pun. Ini memungkinkan kami untuk berlangganan pemberitahuan acara di dalam Rails dengan menggunakan subscribe metode. Kami meneruskan jika kami ingin berlangganan sebagai argumen pertama, lalu objek apa pun yang merespons call sebagai yang kedua.

Dalam hal ini ketika kueri dijalankan, penghitung kueri kecil kami akan dengan patuh menaikkan variabel ActiveRecord::QueryCounter.query_count, tetapi hanya untuk nyata kueri.

Bagaimanapun, ini menyenangkan. Semoga bermanfaat bagi Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengecualian Cast Tidak Valid tidak ditangani MySQL

  2. Bagaimana memilih catatan N terakhir dari tabel di mysql

  3. Apakah aman membandingkan string dengan 'lebih besar dari' dan 'kurang dari' di MySQL?

  4. Buat jumlah ROLLING selama periode waktu tertentu di mysql

  5. Bagaimana cara mengatur hari pertama dalam seminggu ke Senin saat menggunakan Minggu (Tanggal) di PHP/MySQL?