Postgresql

發現失去的外鍵和/或索引

  • October 5, 2018

我們有一個相當大的數據庫(大約 700GB 的數據),它是繼承給我們的,並且有幾個 DBA。隨著時間的推移,我們意識到缺少幾個外鍵和索引。

我想知道是否有某種自動化方法可以使用某種日誌解析或類似方法來發現此類潛在的失去鍵/索引。

我記得前段時間在一篇文章中看到了一個查詢,因此快速搜尋導致:

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
;

來自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但我自己沒有使用過這個。

引用自:https://dba.stackexchange.com/questions/121976