Dizin alanının veri alanından daha büyük olması kötü mü?


22

Genellikle sorguları doğru dizine sahip olmayan büyük tablolara karşı çalıştırmam gerekir. Bu yüzden DBA'dan böyle bir endeks oluşturmasını rica ediyorum. Yaptığı ilk şey masa istatistiklerine bakmak ve indeks uzay boyutunu görmektir.

Çoğunlukla alternatif bir çözüm bulmamı söylerdi çünkü “dizin zaten tablodan daha büyük” Dizinin verilerden daha küçük olması gerektiğini düşünüyor, çünkü bana “dizini bir kitapta hiç gördünüz mü? Bu kitabın kendisinden çok daha küçük ve bir tablo dizini böyle olmalı” dedi.

Onun felsefesinin doğru olduğunu hissetmiyorum, ama ona meydan okuyamam çünkü o bir DBA lideri ve ben bir geliştiriciyim. Bir sorgunun bir dizine ihtiyacı varsa, okunamayan ve erişilemez SP'leri yapan "geçici çözümler" bulmak yerine, dizin yalnızca oluşturulmalıdır.

Sadece gerekli sütunları seçiyorum. Buradaki sorun tarihe göre filtreliyorum, bu nedenle motorun sütunlara uyması için mutlaka bir tablo taraması yapması gerekiyor. Sorgu, istatistik toplamak için günde bir kez çalışır, ancak çalışması 15 dakika sürer (başka bir zorlu ve hızlı kuralımız var: Hiçbir işlem 3 dakikadan daha uzun sürmemelidir).

DBA bana endeks istatistiklerini gösterdi. Bu masada sadece 6'sının kullanıldığı 10 endeks vardı (istatistikler 4'üne sıfır sonuç verdi). Bu, 20'den fazla geliştiricinin katıldığı büyük bir sistemdir. Endeksler ne nedenle olursa olsun oluşturulmuştur ve muhtemelen artık kullanılmamaktadır.

SQL Server 2008'i desteklememiz gerekiyor, çünkü test DB'lerinin çalıştığı şey bu. Ancak müşterilerin hepsi 2014 ve 2016'da.

Yanıtlar:


34

İndeks tasarımını sürgülü anahtar gibi düşünün. Bu kırmızı üçgen anahtar düğmesini istediğiniz çizgi boyunca istediğiniz yere getirebilirsiniz:

Dizin tasarım kararları

Genelde büyüklük olarak ölçmem - genellikle endeks miktarı açısından düşünüyorum, ancak büyüklük de iyi olurdu.

DBA'nizin, anahtarın sağ tarafta çok fazla olduğunu düşündüğü gibi - çok fazla dizin eklediniz ve silme / güncelleme / ekler çok yavaş çalışıyor.

Anahtarın nerede olduğu hakkında tartışmak yerine, endeks sayısından dolayı yaşadığınız performans sorunlarını sormaya çalışın. Belki de kullanıcılarınız silme / güncelleme / ekleme hızından şikayet ediyor veya kilit beklediğini görüyor ya da veri tabanını boyutundan ötürü yedeklemekte zorlanıyor.

Başlangıç ​​noktam genellikle 5 ve 5: tablo başına yaklaşık 5 indeks, indeks başına yaklaşık 5 veya daha az alan. Bu sayı hakkında büyülü bir şey yok - sadece her elimde 5 parmağım olduğu gerçeğinden geliyor, bu yüzden ellerimi yukarı kaldırmak ve kuralı açıklamak kolaydır.

İş yükünüz silme / güncelleme / ekleme işlemlerine karşı çok fazla önyargılı olduğunda ve yetişmek için yeterli donanım beygir gücünüz yoksa, 5'ten daha fazla LESS dizininiz olabilir.

İş yükünüz çoğunlukla salt okunur olduğunda veya çok fazla donanıma yatırım yaptığınızda (tüm veritabanını bellekte önbelleğe almak ve altındaki tüm katı hal depolamaya sahip olmak gibi) birçok MORE dizinine sahip olabilirsiniz.


4

Ayrıca, bir masadaki "Ozar 5" dizininden daha fazlasına sahip olma arzusu, muhtemelen masa üzerinde birçok farklı türde yoğun okuma sorgunuz olduğunu gösterir .

Hangi muhtemelen gösterir , tablodaki kümelenmiş veya kümelenmemiş bir sütun deposu dizininden yararlanabileceğinizi .

N farklı erişim yolunun her biri için iyimser bir dizine sahip olmak yerine, bir sütun deposu size süper hızlı tarama, gereksiz sütunları ve satır bölümlerini atlama olanağı sunar. Böylece, süper kritik işlemler için az sayıda BTree indeksine sahip olabilirsiniz ve diğer her şey için tekrar sütun deposuna geri dönebilirsiniz.

Sütun deposu dizinleri, SQL Server 2016+ ile OLTP yoğun iş yüklerinde çalışmak üzere tasarlanmıştır. Gerçek zamanlı operasyonel analitik için belgelere bakın .


3

Brents'ın cevabını seviyorum ve cevapladım. Yine de başka bir bakış açısı eklemek istiyorum. Bir kullanıcı, bir geliştirici ve bir DBA olarak çalıştım ve görüşlerin alakasız olduğunu hissediyorum. Bir sorgunun nasıl performans gösterdiğine ve sonuç almanın ne kadar sürdüğüne karar vermenin kullanıcıya (veya paydaşlara) bağlı olduğuna inanıyorum. Bu, geliştirici ve DBA'nın gerçekleşmesini sağlamak için birlikte çalışmaktan geçer.

Şirketinizdeki DBA pozisyonu bu konunun 'sorumlusuysa' sorgunuzu analiz edebilir ve daha iyi sorgu tasarımı için önerilerde bulunabilir veya performans için cevap verebilir.

Sorgu ve / veya veri yapısı hedefe ulaşmak için değiştirilemezse, o zaman üç seçenek olduğunu düşünüyorum.

  1. Yavaş veri alımı
  2. Yavaş veri güncelleme
  3. Daha fazla donanım kaynağı $$$$

Elbette her durumun birden fazla işletme ve teknoloji faktörüne bağlı olarak birçok değişkeni var, ancak üç seçeneğin çoğu durumda olmasa da çoğu için geçerli olduğuna inanıyorum.


0

Yasak dizinler> tablo için çok katı görünüyor. Masanız nadiren değişirse (veya kaynaklar için çok fazla rekabet olmadığında geceleri değişirse) ve birçok farklı şekilde sorgulanırsa, birçok büyük endeks haklı gösterilebilir. DBA'lar ayrıca burunlarını ait olmadıkları yerlere yapıştırmamaya dikkat etmelidir. Size / sisteminize gigabaytlar konusunda bir sınır verirse, o alanın nasıl kullanıldığını çok fazla önemsememelidir. Çok çalışıyorsa, bu yüzden olabilir.

Ancak dikkate alınması gereken birçok şey var:

  • Çok sayıda dizin, ekleri / güncellemeleri / silmelerini yavaşlatır. Masanız çok değişiyorsa, çok fazla yapmamaya dikkat edin.
  • Uzay da bir sorun olabilir. Sadece gigabaytların maliyeti yüksek olduğu için (bugünlerde çok fazla değil), aynı zamanda yedekleme işleminin yavaşlamasından (yedekleme işleminin nasıl yapıldığına bağlı olarak) zaman geçmesi de zaman alır.
  • En ciddi veritabanları, nadiren veya hiç kullanılmayan endeksleri bulmak için izlenebilir. Bazılarını düşürmeyi düşünün.
  • Bazen bir endekse ihtiyacınız olduğunu düşünürsünüz, ancak sorgunuzu daha yakından incelerken, aynı sonuçla ve endekse ihtiyaç duymadan farklı şekilde yeniden düzenlenebilir ve yeniden yazılabilir. Dizinin kullanılıp kullanılmadığını görmek için açıklama planını kullanın.
  • Bazen son sütun (lar) çok fazla performans göstermeden çok sütunlu bir dizinden düşebilir. Ve bazen bu, sorguları daha da hızlı hale getirebilir, çünkü dizin saklama alanı daha küçüktür ve endeksten daha fazlası, herhangi bir zamanda bellekte tutulur / önbelleğe alınır.
  • İşlev tabanlı dizinler daha fazla yer kazanmak için normal olanları değiştirebilir. Örnek: tam soyadını sorgulamak yerine, ilk iki harfi de ( where substr(surname, 1, 2) = substr(<userinput>, 1, 2) and surname=<userinput>) ve create index i on customers(substr(surname,1,2)). Bu yeterince hızlı olabilir ve dizininiz daha küçük olacaktır.
  • Veritabanları farklı endeks türlerini destekler. Bazı türler diğerlerinden daha az alan kullanır. Belki endekslerinden bazıları daha az yer harcayan bir türe dönüştürülebilir? Öncelikle farklı indeks tiplerini ve hangi durumlar için iyi ve kötü olduklarını anladığınızdan emin olun.
  • Nadiren bir toplu iş belirli bir dizine ihtiyaç duyan tek şeyse, o dizini yalnızca o toplu iş için oluşturmayı ve sonra bırakmayı düşünün.
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.