Yabancı anahtarlarda indeks ihtiyacı


30

Dizinler, birincil anahtarlar ve yabancı anahtarlar ile mücadele ediyorum ... Ve hepsine sahip olma ihtiyacı.

Eğer iki tablom varsa, ikisinin de birincil anahtar olarak bir tamsayı vardır.
İlk tablo FK üzerinden ikinci tablonun birincil anahtarına atıfta bulunur.

  • Her iki tabloda da kimlik sütununda birincil anahtar dizini var
  • table1.ref_fieldİkinci tablonun PK’sına atıfta bulunmak için bir FK kısıtı yarattım ( table2.id).
  • ve bir dizin ekledim table1.ref_field

Bu dizinleri, birincil ve yabancı anahtarları organize etmenin en iyi yolu bu mu?

Yanıtlar:


30

Tasarımınız iyi. Performans sorunu yaşıyorsanız (tasarım sırasında bilmediğiniz), table2.id sütunu ile aynı sırada (ASC), table1.ref_field sütununda bir dizin oluşturmalısınız. Bu, tablolar / sütunlar arasındaki birleşimlerdeki performansı artıracaktır. Herhangi bir endeksi korumanın ek yükü vardır, bu nedenle bu maliyeti, gelişmiş performansın yararına karşı tartmak istersiniz.

PostgreSQL otomatik olarak diğer sütunlara referans veren yabancı anahtar sütunlarında bu tür dizinler oluşturmaz, ne yazık ki, bunu kendiniz yapmanız gerekir.

İşte aynı konuda bir StackOverflow sorusu:

Yabancı Anahtarlarda ve Birincil Anahtarlarda Postgres ve Dizinler

İşte böyle bir indeks ekleyerek nereden yararlanabileceğinizi belirlemenize yardımcı olacak bir sorgu:

Postgresql: Yabancı Anahtarlarda Endeksler


Her zaman talihsiz değildir - DELETEbaşvurulan tablodan gelmiyorsanız , kullanılmayan bir dizini korumaktan kaçınarak size çok fazla G / Ç ve CPU tasarrufu sağlayabilir. Varsayılan olarak oluşturulması gerektiğini düşünüyorum, sadece oluşturulmasını bastırmak için bir seçeneğiniz var.
Craig Ringer

Craig Ringer Sadece DELETE'in etkisi olmaz, eğer partiden çocuk masalarına kadar seçim yaparsanız, performans sorunlarınız da olacaktır. Oracle Bu belge daha fazla açıklamak: asktom.oracle.com/pls/asktom/…
777Anon
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.