我正在努力优化我的 PostgreSQL 15 数据库中的数据库访问。我想识别 public 模式中的表中的列是 外键 但 not 有与它们关联的索引。这些信息将帮助我优先考虑添加索引以提高查询性能。有人可以提供一个 PostgreSQL 查询来返回这些列的表名和列名吗?
开始的事情:
SELECT conname AS fkey_constraint
, relname AS tablename
, attname AS columnname
, format('CREATE INDEX idx_%s_%s_fkey ON %I.%I(%I);'
, relname
, attname
, nspname
, relname
, attname
) AS index_proposal
FROM pg_constraint
JOIN pg_class ON pg_class.oid = conrelid
JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
JOIN pg_attribute ON ARRAY[pg_attribute.attnum] <@ conkey AND pg_class.oid = pg_attribute.attrelid
LEFT JOIN pg_index ON pg_class.oid = indrelid AND ARRAY[pg_attribute.attnum] = (string_to_array(pg_index.indkey::text, ' '))::smallint[]
WHERE contype = 'f'
AND indexrelid IS NULL
ORDER BY relname, conname, attname;
没有检查版本 15,但它应该适用于更旧的版本。上周在版本 16 上使用过它。