Bir dizinin, güncelleme sütununun bir dizinde olmadığı güncelleme bildirimleri üzerindeki etkisi


16

Ben sürekli insanlar endeksleri yavaşlatmak demek bkz update, deleteve insert. Bu, mutlakmış gibi battaniye bir ifade olarak kullanılır.

Veritabanımı performansı artırmak için ayarlarken, bu kuralın benim için mantıklı bir şekilde çeliştiği görünen bu duruma rastlıyorum ve başka hiçbir yerde kimsenin söyleyemeyeceği veya açıklayabileceği bir yer bulamıyorum.

SQL Server'da ve diğer birçok DBMS'ye inanıyorum / varsayalım, dizinleriniz belirttiğiniz belirli sütunlara göre oluşturulur. Ekler ve silmeler her zaman tüm satırı etkiler, bu nedenle dizini etkilememelerinin bir yolu yoktur, ancak güncellemeler biraz daha benzersiz görünür, yalnızca belirli sütunları etkileyebilir.

Herhangi bir dizinde bulunmayan sütunlarım varsa ve bunları güncelleştirirsem, yalnızca o tablodaki diğer sütunlarda bir dizin oluşturduğum için yavaşlarlar mı?

Örnek olarak, benim masamda Userbir veya iki dizin var, bir Kimlik / Otomatik Artış sütunu olan birincil anahtar ve muhtemelen bazı yabancı anahtar sütununda başka bir dizin var.
Bir sütunu doğrudan üzerinde dizin olmadan, telefon numaralarını veya adreslerini söyleyin gibi güncelleştirirsem, her iki durumda da diğer sütunlarda bu tabloda dizinler bulunduğum için bu güncelleştirme yavaşlatılıyor mu? Güncelleştirdiğim sütunlar dizinlerde değil, bu nedenle mantıksal olarak dizinler güncellenmemeli, değil mi? Eğer bir şey varsa, ben WHERE yan tümcesinde dizinleri kullanırsanız hızlanır düşünüyorum.


so there is no way they will not affect the index... süzülmüş endeksler için hariç
usr

Kapsanmayan, kümelenmemiş dizin kayıtlara işaretçiler (genellikle tablonun kümelenmiş dizin yaprak düğümlerinde) içeren olarak düşünüyorum. UPDATE (dahil olmayan bir özniteliğin) sırasında yavaşlamaya neden olacak bir durumun, UPDATE öğesinin kümelenmiş dizin içinde hareket etmesine neden olduğu bir durum olabileceğini düşünüyorum. Bir hareketin işaretçinin değişmesine neden olup olmayacağından hala emin değilim, VEYA işaretçi yalnızca kümelenmiş dizine bir KEY değeri ise, bu durumda sistem sadece bir ANAHTAR araması yapacağından olası konum güncellemesi önemli olmaz rekor değeri almak için.
Jmoney38

Yanıtlar:


6

Dizine eklenmemiş bir sütunu güncellemenin dizinlerde değişikliklere neden olmayacağını doğru söylüyorsunuz. Basit bir durumda, masa üzerinde genel bir etkisi olmayacaktır.

Bir sorgu veri aramak için Endeksini kullanabilirsiniz, bu olabilir arama hızlandırmak, ancak (SQL marka bağlı olarak) tam davranış SQL diğer markaların farklı olabilir. (Öncelikle Microsoft SQL Server kullanıyorum.)

Tabii ki, bir sütunu önemli ölçüde daha fazla veri hacmiyle güncellemek, satırların farklı sayfalara taşınmasına neden olabilir.


1
SQL Server OP belirtilir, ben bir etiket ekledim, bu yüzden SQL Server
Tom V - topanswers.xyz deneyin

10

Nispeten hızlı modern bir sistem için, bir OLTP tablosuna tek bir endeksin eklenmesi, muhtemelen sistemlerin büyük çoğunluğu için bir performans açısından neredeyse tespit edilemez . Bununla birlikte, gereksiz dizinler oluşturmamalısınız ve muhtemelen bir tablodaki her sütun için tek sütunlu dizinler oluşturmamalısınız.

Pek çok sorgu için yararlı indekslerin varlığının çok belirgin bir hız artışına yol açacağı varsayımında haklısınız.

Sorunuz performansla ilgili gibi görünse de, dizin ekleme konusunda aşağıdakiler dahil ancak bunlarla sınırlı olmamak üzere birkaç olası sorun vardır:

  1. Dizin oluşturmak için gereken süre, dizin tabloya eklenirken engellenmeye neden olabilir. Kilit çok kısa ömürlüdür ve büyük bir sorun yaratmayacaktır.

  2. Dizin değişiklikleri, temel tabloya başvuran tüm planlar için yürütme planlarının geçersiz kılınmasına neden olur. Bu yürütme planları yeniden derlendiğinde, bazı sorgular için performans olumsuz yönde değişebilir.

  3. Dizin değişiklikleri, sorguların daha önce döndürülmediği hataları döndürmesine neden olabilir. Bir varchar alanında bulunan tarihleri ​​döndürmek için kullanılan filtrelenmiş bir dizini ele alalım; filtre, tarih olmayan satırları kaldırırsa ve bu filtre daha sonra değiştirilirse, bu dizine dayanan sorgular artık tarih dışı verileri dönüştürmeye çalışırken başarısız olabilir.

  4. Yeni bir dizin, yürütme sırasının değişmesine ve daha önce meydana gelmediği yerlerde olası kilitlenmelere neden olabilir.


"Dizin etkilenmeyecek bir güncelleştirme için gereken kod yolunun hala değerlendirilmesi gerekiyor" bu doğru değil. Derleme / optimizasyon aşaması, varsa hangi indekslerin güncellenmesi gerektiğini çok iyi bilecek ve planı buna göre oluşturacaktır. Bir dizindeki (SETLUDE ve kümelenmiş anahtar sütunlar dahil) sütunları değiştirmeyen (SET listesinde bildirme) bir UPDATE deyiminin bu dizini güncellemesi gerekmez ve yürütme aşaması buna dokunmaz. DELETE ve INSERT açık bir şekilde tüm sütunlara (mantıksal olarak) dokunun ve tüm dizinleri güncellemek zorundasınız.
Remus Rusanu

@RemusRusanu ancak dizinin güncellenmesi gereken satırları bulmak için kullanılabilip değerlendirilmemesi gerekmez mi?
Tom V - topanswers.xyz deneyin

@RemusRusanu - Sanırım QO bir plan derlediğinde, daha fazla CPU'ya gerek yok; Ancak planı derlemek için kesinlikle bunu yapmak gerekir. Planlar sık ​​sık derleniyorsa çok küçük bir fark yaratabilir.
Max Vernon

@TomV , silme / güncelleme aday satır (lar) ını bulmak için dizini kullanarak tamamen farklı bir konudur. Bu durumda, satırları bir dizin aracılığıyla bulmanın avantajları, dizin bakım maliyeti sorunlarının üstesinden gelmelidir.
Remus Rusanu

@ MaxVernon DML'nin (UPDATE) sık sık yeniden derlenmesinin geçerli bir senaryosu olmadığını savunuyorum. Geçici sorgulama için geçerli (kaçınılmaz?) Yeniden derlemeler için bazı durumlar satın alıyorum . Ama DML? Ne tür bir uygulama geçici, benzersiz UPDATE ifadeleri oluşturabilir? DML ile sık sık yeniden derlemeler yüksek sesle "Beni parametreleştir" diye bağırır.
Remus Rusanu

-2

Güncelleme işlemi sabit boyutlu (tamsayı gibi) dizine eklenmemiş bir sütunu hedefliyorsa, genel olarak yavaş olmamalıdır, ancak bir select deyimiyle karşılaştırıldığında güncellemenin sonunda yavaş diske de yazılması gerekir.

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.