【问题标题】:many identical Exist queries on ActiveRecord save?在 ActiveRecord 上保存许多相同的 Exist 查询?
【发布时间】:2013-09-19 17:26:59
【问题描述】:

我有一个有 200,000 行的表。

当我通过 ActiveRecord 模型进行插入/更新时,我看到近 20 个相同的 Exist 查询,每个查询耗时近 100 毫秒!

Domain Load (0.5ms)  SELECT "domains".* FROM "domains" WHERE "domains"."name" = 'sgsgroup.in' LIMIT 1
(0.1ms)  BEGIN
Domain Exists (90.7ms)  SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (89.4ms)  SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (91.6ms)  SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
[...]
Domain Exists (89.7ms)  SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (89.2ms)  SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
SQL (0.6ms)  INSERT INTO "domains" (.... 

我已经在域表上有“名称”索引。任何想法这里发生了什么以及如何优化这些记录更新?

另外,在记录更新时出现类似这样的相同查询是否正常?

【问题讨论】:

  • 90.7ms 不是“近 1 秒”,而是近 1/10 秒。
  • doh - 谢谢!更正:P
  • 不正常,需要查看插入记录的代码。
  • 感谢您的确认。这很奇怪。我重新启动了控制台,现在完全相同的更新/保存使用单个查询,而不是 20 个。我完全不知道它可能是什么。
  • 所以我终于找到了根本原因。问题是由于我在控制台中手动加载(和重新加载)我的模型。 ActiveRecord 正在为加载的模型代码的每个实例生成一个单独的数据库查询。为什么我要重新加载我的模型?因为我有 config.threadsafe!在 application.rb 中阻止我使用重新加载! .. 有趣。

标签: sql activerecord model


【解决方案1】:

这可能与名称唯一性验证不区分大小写有关。不过后续的执行应该被缓存——不知道为什么没有。

您可能想查看您的 RDBMS 是否支持在 LOWER(name) 上创建索引,因为可能未使用 name 上的常规索引。

【讨论】:

  • 谢谢大卫 - 是的,我认为你在 100 毫秒查询时间的根本原因上是绝对正确的。任何想法为什么会发出许多相同的查询?
  • 感谢大卫 - 接受您的回答,请参阅上面我对 tihom 的回复。
  • 我猜我们称之为“暂时性问题”!
  • 问题(重复查询)似乎再次出现,并且随着应用程序的运行逐渐恶化。当我重新启动 rails (Webrick) 时,它会从一个查询开始,但是
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 2011-10-28
  • 2015-12-10
  • 2018-06-17
  • 2020-08-26
  • 2019-03-13
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多