Bir tablo için hangi dizinleri oluşturacağımı nasıl bilebilirim?


33

Bir tablo için hangi endeksleri oluşturmanın en iyi yolunu bulabileceğim bir yol var mı?


11
Var. Deneyin use-the-index-luke.com örneğin.
dezso

En çok gördüğüm cevap, WHEREcümle içinde kullandığınız birincil anahtarları ve sütunları dizine eklemelisiniz .
Oskar Persson

Lütfen yapma bunu. Birincil anahtar, verilerin tabloda nasıl fiziksel olarak sıralandığını ve bunun kendi düşünceleri olduğunu tanımlar. Birincil anahtarı, diğer tüm indekslerinizde de kullanıldığı gibi, dikkatlice seçmeniz gerekir. Bakınız: sqlskills.com/blogs/kimberly/…
Ali Razeghi

4
@AliRazeghi Bu (fiziksel sıralama) bazı DBMS'lerde (belirli koşullar altında) doğrudur, bazılarında değildir. Örneğin, PostgreSQL'de doğru değil.
dezso

Oylama geri!
Ali Razeghi

Yanıtlar:


29

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ı dizine ekle.
  • Her yabancı anahtarı endeksleyin.
  • Bir JOIN yan tümcesinde kullanılan her sütunu indeksleyin.
  • WHERE yan tümcesinde kullanılan her sütunu indeksleyin.
  • Dbms'inizin desteklediği "ezoterik" indeksleme seçeneklerini öğrenmek için belgelerinizi inceleyin.

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.

  • ENDEKSİ OLUŞTURMA
  • Dizinler (Özellikle, dizin oluşturma ifadeleri, kısmi dizinler ve dizin kullanımının incelenmesi ile ilgili bölümleri not edin)

14

@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).


Doğru hatırlıyorsam, Oracle v.> = 10 ve Sql Server> = 2008
EAmez

1

İki seçenek var.

  1. Sen yap.
  2. Teknoloji yapar.

Kendin yapmanın cevabı burada oldukça ayrıntılı bir şekilde belgelenmiştir. Öyleyse başka bir şeye bakalım.

Pghero

Otomatikleştirilmiş bir tavsiye istiyorsanız, Pghero size yardımcı olabilir.

Bazı eksiklikleri olduğunu söyledi.

  1. Sadece üzerinde çalışıyor WHEREve ORDER BYhayır JOINS.
  2. Yalnızca NULL yüzde ve farklı değerler için istatistikler kullanır.

Daha fazla bilgi için bu videoyu izleyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.