我正在使用 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))
…and…
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
…执行了 2 次,花费了 104 毫秒,并且…
SHOW search_path
…在一次调用中命令 45 毫秒。
我的直觉说这些与 Postgres Rails 适配器有关,但我不明白是什么触发了它们或它们在做什么,或者(更重要的是)它们为什么在典型请求期间触发。
我刚刚更彻底地检查了日志,看起来运行此请求的 Dyno 已在几秒钟前转换为“向上”,因此该请求很可能是第一个。