0

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

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

谢谢

4

3 回答 3

0

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

DBA 可能会建议您

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

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

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

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

于 2013-05-29T03:15:11.643 回答
0

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

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

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

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

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

于 2013-06-01T19:13:39.240 回答
0

存储过程将保持编译并且执行计划将保持存储这一事实将获得性能提升。如果您从应用程序中进行查询,并且它们很少而且相距甚远,那么情况可能不会如此。

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

于 2013-05-29T02:25:56.930 回答