sql - 对 Rails/Heroku 上的 Postgres 数据库的意外 SQL 查询

标签 sql ruby-on-rails postgresql heroku newrelic

我使用 NewRelic 深入研究了对我的一个 Rails 应用程序的一个非常长的请求,发现许多看起来完全陌生的 SQL 查询占用了很长的时间。我用谷歌搜索了一下,但对于它们是什么一无所知,更不用说我是否可以阻止它们的发生了。

SELECT COUNT(*) FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind in (?, ?) AND c.relname = ? AND n.nspname = ANY (current_schemas(false))

……和……

SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = ?::regclass AND a.attnum > ? AND NOT a.attisdropped ORDER BY a.attnum

…每次发生 7 次,总共耗时 145 毫秒和 135 毫秒(分别)。

SELECT DISTINCT(attr.attname) FROM pg_attribute attr INNER JOIN pg_depend dep ON attr.attrelid = dep.refobjid AND attr.attnum = dep.refobjsubid INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[?] WHERE cons.contype = ? AND dep.refobjid = ?::regclass

...以 104ms 的成本执行了 2 次,并且...

SHOW search_path

…在一次通话中要求 45 毫秒。

我的直觉说这些与 Postgres Rails 适配器有关,但我不明白是什么触发了它们或它们在做什么,或者(更重要的是)它们为什么在典型请求期间触发。


我刚刚更彻底地检查了日志,看起来这个请求运行的 Dyno 已经在几秒钟前转换为“up”,所以这个请求很可能是第一个。

最佳答案

表 pg_class、pg_attribute、pg_depend 等都描述了 postgres 中的表、列和依赖项。在 Rails 中,模型类由表定义,因此 Rails 读取表和列来找出每个模型的属性。

在开发模式下,它会在每次访问模型时查找这些值,因此如果您最近进行了更改,Rails 会知道。在生产模式下,Rails 会缓存它,这样您就不会那么频繁地看到它们,所以这真的不是问题。

关于sql - 对 Rails/Heroku 上的 Postgres 数据库的意外 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694392/

相关文章:

SQLite - INSERT INTO SELECT - 如何插入 "join of 3 existing tables into a new table"的数据?

ruby-on-rails - rails 中的订单确认页面

ruby-on-rails - rails,如何从 url 字符串中获取参数?

postgresql - 将 postgresql 本地复制到远程数据库(均带有密码)- 错误 : option "locale" not recognized

mysql - SQL self join中如何让相同的字段不出现两次?

sql - 对什么是 superkey 或 Boyce Codd Normal 形式的误解

sql - 为什么 count(case date) 也计算空情况?

javascript - 如何仅在用户单击相应链接时呈现部分内容?

mysql - MYSQL 的 Liquibase 脚本

java - Spring Boot - 如何设置 PostgreSQL 的默认模式?