Neden Bu Query Index'i Kullanmıyor
Cast, fonksiyon ve sondan eşleşme

email üstünde unique index vardı. Login hâlâ seq scan yaptı. 'Index bozuk' diye rebuild çalıştırdım. Bozuk değildi. Predikat index tanımıyla aynı tipte değildi.
Kolonu sarmalayan ifade
-- index: (email)
-- planner bunu kullanmaz
SELECT id FROM users WHERE lower(email) = lower($1);
-- implicit cast: email text, parametre varchar değilse
-- veya published_at::date = CURRENT_DATE → index (published_at) düşer
-- leading wildcard
SELECT id FROM posts WHERE title LIKE '%postgres%';
lower(email) için index (lower(email)) olmalı, (email) değil. Tarihi ::date kesmek, btree'nin aralığını bozar. LIKE '%...%' btree ile başlamaz; trigram ayrı karar.
OR ve ilk kolon
(status, published_at) index'i published_at > $1 tek başına gelince çoğu planda seq scan veya ayrı bir index ister. İlk kolon yoksa bileşik index 'kısmen' kullanılır, bazen hiç. OR ile status ve slug'ı birleştirmek de iki index bitmap'e gidebilir; tek index mucizesi beklemiyorum.
Seriyi burada kapatıyorum: EXPLAIN okumak, gereksiz index'i düşürmek, yıldızı kesmek, predikatı index ile aynı bırakmak. Dördü de aynı defter. 'Index ekle' beşinci madde, ilk dördü bitmeden değil.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap