私は NewRelic を使用して自分の Rails アプリケーションの 1 つに非常に長いリクエストを行っていましたが、かなりの時間を費やしている、まったく無関係に見える多数の 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
…104 ミリ秒のコストで 2 回実行され、…</p>
SHOW search_path
…1 回の呼び出しで 45 ミリ秒を命令しました。
私の直感では、これらは Postgres Rails アダプターに関連していると言われていますが、何がそれらをトリガーするのか、何をしているのか、または (より重要なことに) 典型的なリクエスト中になぜそれらが起動したのか理解できません。
ログをさらに詳しく調べたところ、このリクエストが実行された Dyno がほんの数秒前に「アップ」に遷移したようです。このリクエストが最初のリクエストだった可能性があります。