Bir tablo için hangi endeksleri oluşturmanın en iyi yolunu bulabileceğim bir yol var mı?
WHERE
cümle içinde kullandığınız birincil anahtarları ve sütunları dizine eklemelisiniz .
Bir tablo için hangi endeksleri oluşturmanın en iyi yolunu bulabileceğim bir yol var mı?
WHERE
cümle içinde kullandığınız birincil anahtarları ve sütunları dizine eklemelisiniz .
Yanıtlar:
Kısa kurallar. (Bunlardan bazıları otomatik olarak oluşturulur, ancak dbms'inize bağlı olarak daha sonra manuel olarak bırakılabilir. Her zaman PostgreSQL üzerinde çalışacağınızı varsaymayın .)
Her birincil anahtar , çok sütunlu birincil anahtarların tüm sütunları kapsayan tek bir dizine sahip olması gerektiği anlamına gelir. Çok sütunlu bir birincil anahtar bildirirseniz PostgreSQL bu dizini otomatik olarak oluşturur.
Tek bir çok sütunlu dizinin size birkaç tek sütunlu dizinden daha iyi performans verdiği birçok durum vardır. Yavaş sorguları izleyin ve hangisinin hangisi olduğunu bulmak için test yapın.
İndekslemede yapılacak herhangi bir değişikliğin bazı veritabanı faaliyetlerini iyileştireceğini ve diğerlerini küçülteceğini varsayalım. Dizinlerde değişiklik yaptıktan önce ve sonra profilleyebileceğim bir dizi SQL ifadesinin olmasını yararlı buluyorum. Bu set SELECT, INSERT, UPDATE ve DELETE ifadelerini içerir.
Belli dbms'iniz için docs çalışmanın yerini hiçbir şey tutamaz.
@Catcall zaten verilenlere ek olarak ve küçük bir düzeltici eklemeye ek olarak :
Ayrıca son zamanlarda SO ile ilgili bu yakından ilgili cevapta bazı temel konuları ele aldım .
Şimdiye kadarki cevaplar birincil anahtarlarda indeksler oluşturmanız gerektiğini gösteriyor, ancak PostgreSQL'de durum böyle değil (kısmi istisnalar geçerlidir). Buradaki kılavuzu alıntı yapıyorum :
Bir tablo için benzersiz bir sınırlama veya birincil anahtar tanımlandığında PostgreSQL otomatik olarak benzersiz bir dizin oluşturur. Endeks birincil anahtar veya benzersiz kısıtlama oluşturan sütunları kapsar (uygunsa, bir çok sütun dizini) ve kısıtlamayı zorlar mekanizmadır.
Cesur vurgu benim.
Sen olabilir oluşturmak istiyorum ek dizinler çok sütun indeksi ikinci veya daha sonraki sütunlar için, ama birincisi genellikle çok sütun endeksine göre gayet kaplıdır - ek sütunlar endeksi çok daha büyük hale dışında. Bu konuyla ilgili ayrıntılı olarak şunları tartıştık:
Kompozit endeks ilk alandaki sorgular için de iyi midir?
Çok noktalı virgül indeksleri , kısmi indeksler ve ifadelerdeki indeksler PostgreSQL'de özellikle güçlü araçlardır. PostgreSQL 9.2’den bu yana , diğer RDBMS’de de “endeksleri” eşdeğer yalnızca dizin taramaları vardır . Bu, başka bir dizin türü değil, mevcut dizin türleriyle RDBMS'nin yeni bir özelliğidir.
Her endeks belirli maliyetler taşır , bu yüzden endekslemeyi gerçekten optimize etmek için bazı temel bilgilerin etrafında yol yoktur. Sadece daha fazla dizin oluşturmak, iyiden daha fazla zarar verebilir Özellikle, dizinler HOT güncellemelerinin performansı artırmasını engelleyebilir .
Genel olarak, yazma işlemleri ( DELETE
, UPDATE
) daha pahalı hale gelir (ama aynı zamanda faydalanabilir!), Okuma işlemleri ( SELECT
) genellikle sadece fayda sağlar. Çok fazla dizin önbellek belleğini tüketebilir, böylece okuma işlemlerinde bile sorun yaşanabilir.
Son olarak, dizin bakımında bu Postgres Wiki sayfası yinelenen veya kullanılmayan dizinleri bulmak için araçlar (diğer şeylerin yanı sıra).
İki seçenek var.
Kendin yapmanın cevabı burada oldukça ayrıntılı bir şekilde belgelenmiştir. Öyleyse başka bir şeye bakalım.
Otomatikleştirilmiş bir tavsiye istiyorsanız, Pghero size yardımcı olabilir.
Bazı eksiklikleri olduğunu söyledi.
WHERE
ve ORDER BY
hayır JOINS
.Daha fazla bilgi için bu videoyu izleyin .