当前位置: 首页 > 面试题库 >

计算执行的查询数

岳卓君
2023-03-14
问题内容

我想测试某个代码段执行的SQL查询越少越好。

ActiveRecord::TestCase似乎有其自己的assert_queries方法,它将做到这一点。但是由于我没有修补ActiveRecord,所以对我来说没什么用。

RSpec或ActiveRecord是否提供任何官方的公开方式来计算在代码块中执行的SQL查询的数量?


问题答案:

我认为您通过提及回答了您自己的问题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)

我们了解了Rails
3的小通知框架。这是对Rails的最新主要版本的一个鲜亮的补充,没人真正知道。它允许我们使用subscribe方法在Rails中订阅事件通知。我们传入要订阅的事件作为第一个参数,然后将任何响应的对象call作为第二个参数。

在这种情况下,当执行查询时,我们的小查询计数器将按照应尽的方式递增ActiveRecord ::
QueryCounter.query_count变量,但仅适用于 实际 查询。

无论如何,这很有趣。希望对您有用。



 类似资料:
  • 一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行增删改查的操作。这篇文档阐述了如何使用这些API。关于所有模型检索选项的详细内容,请见数据模型参考。 在整个文档(以及参考)中,我们会大量使用下面的模型,它构成了一个博客应用。 from django.db import models class Blog(models.Model): name = mo

  • 我应该用什么来替换'code TO VERIFY IF QUERY RESULT ROW IS=1'? 我用num_rows尝试了很多种方法,但都行不通。 我的PHP代码:

  • 问题内容: 我应该将“如果查询结果行IS = 1进行验证的代码”替换为什么? 我已经尝试过使用num_rows的多种方法,但无法正常工作。 我的PHP代码: 问题答案: 要么

  • 我正在使用Hibernate作为ORM进行Java EE项目,我已经到了一个阶段,我必须在我的类上执行一些数学计算,比如和、计数、加法和除法。 我有两个解决方案: 选择我的类并在代码中以编程方式应用这些操作 对命名查询进行计算

  • 问题内容: 如何计算MySQL查询返回的行数? 问题答案: 获取查询结果中的总行数… 您可以仅迭代结果并计数。您没有说使用什么语言或客户端库,但是API确实提供了mysql_num_rows函数,该函数可以告诉您结果中的行数。 例如,这在PHP中作为mysqli_num_rows函数公开。编辑问题以提及您正在使用PHP时,这是一个使用mysqli函数的简单示例: 获取符合某些条件的行数… 只需使用

  • 问题内容: SQL2008。 我有一个测试表: 我用10k测试行填充它。 我运行以下两个查询: 我不知道为什么这两个查询有不同的执行计划。 查询1确实针对UQ_Sale_RowVersion索引进行索引搜索。 查询2对PK_Sale进行索引扫描。 我想查询2做索引查找。 我将不胜感激。 谢谢你。 [编辑] 尝试使用datetime2而不是rowversion。同样的问题。 我也尝试强制使用索引(查