发现丢失的外键和/或索引

Gon*_*uez 2 postgresql index foreign-key database-design

我们有一个相当大的数据库(大约700GB的数据),这是我们继承的,并且有几个DBA。随着时间的推移,我们意识到有几个丢失的外键和索引。

我想知道是否有某种自动方法可以使用某种日志解析或类似的方法来发现此类潜在丢失的键/索引。

Kár*_*agy 5

我记得不久前在一篇文章中看到过一个查询,所以快速搜索的结果是:

CREATE FUNCTION pg_temp.sortarray(int2[]) returns int2[] as '
  SELECT ARRAY(
      SELECT $1[i]
        FROM generate_series(array_lower($1, 1), array_upper($1, 1)) i
    ORDER BY 1
  )
' language sql;

  SELECT conrelid::regclass
         ,conname
         ,reltuples::bigint
    FROM pg_constraint
         JOIN pg_class ON (conrelid = pg_class.oid)
   WHERE contype = 'f'
         AND NOT EXISTS (
           SELECT 1
             FROM pg_index
            WHERE indrelid = conrelid
                  AND pg_temp.sortarray(conkey) = pg_temp.sortarray(indkey)
         )
ORDER BY reltuples DESC
;
Run Code Online (Sandbox Code Playgroud)

来自http://mlawire.blogspot.nl/2009/08/postgresql-indexes-on-foreign-keys.html

那会给你你想要的。

并且还找到了https://github.com/pgexperts/pgx_scripts/blob/master/indexes/fk_no_index.sql但我自己没有使用过。