我正在使用 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))
……和……</p>
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 次,并且…</p>
SHOW search_path
…在一次通话中要求 45 毫秒。
我的直觉说这些与 Postgres Rails 适配器有关,但我不明白是什么触发了它们或它们在做什么,或者(更重要的是)为什么它们在典型请求期间被触发。
我刚刚更彻底地检查了日志,看起来运行这个请求的 Dyno 已经在几秒钟前转换为“up”,所以这个请求很可能是第一个。