2009-05-22 14 views
25

aşağıdaki deyimi yürütme ediyorum:Neden Kümeli Dizin Güncelleştirmesi'ne neden oluyorum?

UPDATE TOP(1) dbo.userAccountInfo 
SET   Flags = Flags | @AddValue 
WHERE   ID = @ID; 

sütun 'Kimlik' KİMLİK kısıtları ile INT PRIMARY KEY olduğunu. Bayraklar bir BIGINT NOT NULL.

Yürütme yolu, Kümelenmiş Dizin Güncellemesinin gerçekleştiğini gösterir. Çok pahalı bir işlem. Birincil anahtar hariç Bayraklar veya Kimlik'i kapsayan dizin yok. Ben gerçek yürütme yolu gibi hissediyorum olmalıdır:

Kümelenmiş Index Seek => kümelenmiş dizin fiziksel tablo olduğunu

+0

İndeksin ne kümelenme ne de alanı kapladığından kesinlikle emin misiniz? –

+0

Sorguda TOP (1) nedir? – BradC

+0

@ Bilinmeyen Google: Bu tabloda yalnızca bir kümelenmemiş idx var. Ne ID'yi ne de Bayrakları etkiler. @ BradC: Açıklamamdaki birebir uyuşukluk. "Bu ifade tam olarak bir kullanıcıyı etkileyecektir." Ama gerçekten hiçbir amaca hizmet etmiyor. – Kivin

cevap

27

Tablolar iki çeşidi bulunuyor bakın. Bir PRIMARY KEY kısıtlaması var, bu yüzden örtülü bir dizin oluşturdunuz. Bu 'un gerçekleşmesi için tablo oluşturulurken ekstra uzunluğa gitmeniz gerekecek. Kümelenmiş dizin , tablo olduğundan, 'tablo' herhangi bir güncelleştirme kümelenmiş dizinin bir güncelleştirmedir. Kümelenmiş dizin güncellemesi “çok pahalı bir işlem” olarak görüldüğünde, bu bir veritabanının nasıl çalıştığına dair temel yanlış bilgileri içeren bir şehir efsanesidir. Doğru ifade, 'kümelenmiş anahtarın kümelenmemiş tüm dizinleri güncelleştirmesi gereken kümelenmiş bir dizin güncelleştirmesidir'.

+0

Bu çok fazla ... şehir efsaneleri, uyandırdığınız gibi ... RDB'leri çevreleyen bir utanç. Birkaç hafta içinde bir avuç dolusu SQL'i yazıyorum. Kimliğini güncellemediğim sürece, kümelenmiş verilerde (potansiyel olarak) aşırı derecede pahalı bir işlem yapılmasına neden olmayacağımı güvenle söyleyebilir miyim? – Kivin

+2

evet, doğru. – BradC

+5

Güncelleme Kimliği * tüm * diğer dizinlerde bir güncelleme gerektirecektir. Dizinin bir parçası olan başka bir sütunun güncellenmesi, bu dizinlerin güncellenmesini gerektirir. Herhangi bir dizinin parçası olmayan bir sütun (anahtar veya içerdiği sütun gibi) herhangi bir ek güncelleştirmeye neden olmaz. E.g. Bayraklar'da bir dizininiz varsa, güncellemeniz bu dizini korumak için fazladan bir güncelleme yapar. Kötü olmadığına işaret etmedikçe güncellemeler hakkında çok fazla endişelenmem. Çoğu zaman, düzenlenmemiş okumalar (taramalar) problemdir. BTW, TOP (1) ne için? Kimlik PK, değil mi? –

10

güncelleyin, böylece herhangi satır, Güncellemekte olduğunuz güncellerken, kümelenmiş indeks. kümelenmiş dizin ve yığınları:

this MSDN article

+0

Yalnızca birincil anahtarı etkilediğimde Kümelenmiş Dizin Güncellemesi yapmam gerektiğini hissediyorum. Ama ben senin dikkatini çekiyorum. Sanırım, kümelenmiş dizin güncellemelerinin tehlikeli bir şey olduğunu düşünmek için beyin yıkamıştım. – Kivin

+1

Bundan kaçınmanın herhangi bir yolu var mı? – Serge

İlgili konular