DBAtlas · Veritabanı operasyon atlası

Geçersiz (INVALID) index'leri bul ve temizle

PostgreSQLBakım

Komut

SELECT n.nspname AS schema_name,
       c.relname AS index_name,
       t.relname AS table_name,
       pg_size_pretty(pg_relation_size(c.oid)) AS index_size,
       i.indisvalid,
       i.indisready,
       format('DROP INDEX CONCURRENTLY %I.%I;', n.nspname, c.relname) AS fix
FROM pg_index i
JOIN pg_class c ON c.oid = i.indexrelid
JOIN pg_class t ON t.oid = i.indrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE NOT i.indisvalid OR NOT i.indisready;

-- Silmeden önce: devam eden bir index build var mı?
SELECT pid, relid::regclass AS table_name, index_relid::regclass AS index_name, command, phase
FROM pg_stat_progress_create_index;

Ne yapar?

CREATE INDEX CONCURRENTLY veya REINDEX CONCURRENTLY yarıda kalınca geride kalan geçersiz index'leri boyutlarıyla listeler ve silme komutunu üretir.

Ne zaman kullanılır?

Başarısız veya iptal edilmiş online index işlemlerinden sonra, düzenli sağlık kontrolünde ve major upgrade öncesinde.

Dikkat

Hâlâ devam eden bir CREATE INDEX CONCURRENTLY / REINDEX CONCURRENTLY de o anda INVALID görünür; silmeden önce pg_stat_progress_create_index'i kontrol et. INVALID index sorgularda kullanılmaz ama indisready = true ise her INSERT/UPDATE'te güncellenmeye devam eder, yani yalnızca yük getirir. Yeniden oluşturmak için REINDEX INDEX CONCURRENTLY kullanılabilir; ancak hata sebebi (örn. unique ihlali) giderilmediyse tekrar başarısız olur. REINDEX CONCURRENTLY kalıntıları _ccnew/_ccold sonekini taşır. DROP INDEX CONCURRENTLY transaction bloğu içinde çalışmaz.

DBAtlas'ta aç →

İlgili