【问题标题】:Stored procedure vs multiple queries (activerecord)存储过程与多个查询(活动记录)
【发布时间】:2013-05-29 02:19:12
【问题描述】:

刚开始使用 activerecord。我只是想知道如果我在一个请求中进行多个查询,存储过程会更好吗?这样,我将进行 1 个 SQL 查询,而不是多个。

例如,很多时候,我检查记录是否存在,如果不存在,我创建它。那是2个查询。我可以在一个只进行 1 个查询的存储过程中使用它。这是提高性能的一种方式吗?

谢谢

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord


    【解决方案1】:

    存储过程将保持编译状态并且执行计划将保持存储状态,从而提高性能。如果您从应用程序中进行查询,并且它们很少而且相差甚远,那么情况可能不会如此。

    就打字而言,它的数量大致相同,只是在不同的地方。

    【讨论】:

    • 好的,但我想知道的是,存储过程是在 Rails 生产中完成的吗?我从来没有遇到过。我总是看到对数据库的多个 SQL 查询。
    【解决方案2】:

    例如,很多时候,我检查记录是否存在,如果不存在,我创建它。那是2个查询。

    DBA 可能会建议您这样做

    • 只需插入行,或
    • 使用等效的 SQL MERGE 语句,或者
    • 使用您的 dbms 支持的任何其他语句(我假设 ActiveRecord 以一种或另一种方式实现),例如 REPLACE 或 ON DUPLICATE KEY UPDATE ...

    并捕获因插入重复行而导致的错误。

    所有这些都应该只需要一次往返数据库。而且你不得不捕获错误——除了重复键之外,还有很多事情可以阻止 INSERT 语句成功。

    另一方面,如果您的业务流程确实需要连续的 SQL 语句,那么编写存储过程可能是有意义的。这与“我正在做 1 个 SQL 查询而不是多个查询”并不完全相同。您仍然必须执行连续的 SQL 语句。您向服务器传递的内容较少,但这可能并不重要。服务器仍然执行所有的 SQL 语句。

    【讨论】:

      【解决方案3】:

      我不确定我是否会为这种级别的性能调整而烦恼。

      就单行插入、更新、删除等而言,如果您有正确的索引,那么与 ruby​​、客户端上的 DOM 处理、网络相比,数据库性能可能是一个非常小的性能问题时间等。您可能会为自己节省几毫秒,但这不太重要。

      您可能会喜欢使用以下方法节省时间:

      Model.where(:blah => etc).first_or_initialize(:whatever => 'wotsit')
      

      ...这样您以后就可以为重大的性能问题烦恼。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2012-08-01
        • 1970-01-01
        相关资源
        最近更新 更多