Dizine Eklenmiş Görünümler neden benzersiz olmayan kümelenmiş dizinlere izin vermiyor?


12

En sık kullanılan görünümlerimizden bazılarında performansı artırmak için Dizine Eklenmiş Görünümleri kullanmayı düşünüyorum.

Ancak Dizine Alınmış Görünümler, veritabanı yapısının geri kalanı tarafından belirlenen önceliğe biraz karşı çıkan benzersiz olmayan kümelenmiş dizinleri desteklemez.

Örneğin, işte birkaç tablomuzun basitleştirilmiş bir versiyonu.

-Groups-
Group ID    GroupName

-Users-
UserKey    UserName    FullName     GroupID

Dizinler Groups.GroupID (Kümelenmemiş) ve Users.GroupID (Kümelenmiş) üzerindedir. Belirli bir gruptan en çok sayıda kullanıcı alınacağı için, Kullanıcılar tablosunda GroupID'de bulunan kümelenmiş anahtar alınır. Açıkçası, grup başına birden fazla kullanıcınız olacaktır, bu nedenle bu kümelenmiş dizin benzersiz değildir.

Bu, benzersiz olmayan bir kümelenmiş dizine sahip olamadığım için, bu örnek gibi görüşlerimi dizine eklerken bu önceliğin nasıl takip edileceğinden biraz emin olmamı sağlıyor.

ConsumableID    ConsumableVariantID AllowThresholdOverwrite FullPath    GroupID ManufacturerID  Type    ModelID
101              29                 1                       0.1.2.4.    4       3               3       2

Aslında, bu Görünümde her zaman benzersiz olacak tek değer ConsumableID sütunu olduğundan, dizinimi nereye yerleştireceğim konusunda çok az seçeneğim kalmadı.

Görünümler, normal tablolar neden benzersiz olmayan kümelenmiş dizinlere neden izin vermiyor?


3
Bu sayfanın altında 'Bir görünümdeki ilk dizinin neden CLUSTERED ve UNIQUE olması gerekiyor?' Başlıklı çok kısa bir açıklama var. ama fazla ayrıntı vermez. Kesinlikle daha ayrıntılı bir açıklama duymak isterim.
Steve Pettifer

5
Birkaç yorum: 1 - Kümelenememeniz için hiçbir neden yok (GroupID, UserID). Anahtar için kendinizi tek bir sütunla sınırlamayın. 2 - Bir görünümün sınırlamasının, bunun satırların NC dizinlerine kolayca bağlanması gereken tamamlayıcı bir veri nesnesi olması nedeniyle hayal ediyorum. Bir tablo için, benzersiz olmayan CI anahtarı ona bir int eklenir, ancak bunun gerçek bir tablo değil, ancak gerçek bir tablo YANSITMASI gerektiğinden dizinli bir görünüm ile daha zor olacağını düşünüyorum.
JNK

Yanıtlar:


22

Bu Microsoft Teknik Makalesinde aşağıdaki açıklama verilmiştir :

Bir görünümdeki ilk dizinin neden KÜMELENMESİ ve BENZERSİZ olması gerekir?

Dizinli görünüm bakımı sırasında görünümdeki kayıtların anahtar değerine göre kolayca aranmasına izin vermek ve özel mantık gerektiren görünümler içeren kopyaların oluşturulmasını önlemek EŞSİZ olmalıdır. Yalnızca kümelenmiş bir dizin benzersizliği zorlayabilir ve aynı anda satırları depolayabileceğinden kümelenmelidir.

SQL Server, dizinlenmiş görünümleri temel verilerle uyumlu olarak tutmak için bir delta cebiri sistemi kullanır. Ayrıca, bir veya daha fazla dizine alınmış görünümü etkileyen her DML sorgusu için otomatik olarak görünüm-bakım sorgu planı operatörleri içerir. Görünümde benzersiz bir kümelenmiş dizine sahip olmak, uygulama ayrıntılarını büyük ölçüde basitleştirir.

Mevcut düzenleme, sabit şekilli bakım operatörü ağaç şekillerinin temel DML sorgu ağacına dahil edilmesine izin vererek, testi de basitleştiren dikeylik sağlar. Nihayetinde, endeksli görünümler benzersiz olmayan kümelenmiş dizinleri desteklemek için bir gün geliştirilebilir, ancak daha sonra sınırsız zaman ve sınırsız kaynaklar (her ikisi de SQL Server geliştirme ekibine yazma zamanı için geçerli değildir) göz önüne alındığında her şey mümkündür.

Karmaşık güncelleştirme sorgu planı oluşturmanın nasıl elde edilebildiğini ve ince hataların ne kadar kolay sızabileceğini gösteren bir örnek için, dizinlerde oluşan ve filtrelenmiş hatalara (dizinlenmiş görünümlerle yakın bağlantısı olan bir özellik) ilişkin bu örneğe bakın MERGE.


2
Benzer bir hata, GROUP BYyan tümcesi olan ancak gruplandırma ifadelerinin tümü kümelenmiş dizindeki anahtarlar değil , dizine alınmış bir görünümü güncellemeye çalışırsanız oluşabilir . SQL Server 2014 itibariyle geçerlidir.
Quassnoi

4

SQL Server'da tüm dizin anahtarları dahili olarak benzersiz olmalıdır. Tam olarak bir satıra hitap eden kilit anahtarları elde etmek için bu gereklidir. İndeks bakımı için de gereklidir. İçinde yalnızca bir değeri (% 100 yinelenen) olan bir sütunda bir NCI düşünün. Bir satır tablodan silinirse, depolama motorunun karşılık gelen NCI satırını bulup da silmesi gerekir. Tüm NCI satırları ayırt edilemezse bu mümkün olmaz.

Böylece, görünümdeki CI'nin motorun çalışması için (dahili olarak) benzersiz olması gerektiğini görürsünüz.

Bir dizin benzersiz yapmazsanız SQL Server hala dahili olarak benzersiz kılar. Bir yığın tablosunda bir NCI olması durumunda, satır yer işaretini ekler. Benzersiz olmayan bir CI olması durumunda benzersiz bir sütun ekler. CI içeren bir tabloda NCI olması durumunda, önceden belirtmediğiniz herhangi bir CI anahtar sütununu ekler (bu, benzersizleştiriciyi içerebilir).

Dizinlenmiş görünüm durumunda eklenebilecek belirgin bir sütun yoktur. SQL Server bunu otomatik olarak yapamaz.

Normalde, bir insan için görünümün CI'de kullanılacak benzersiz bir sütun kümesine sahip olmasını sağlamak için hangi sütunları ekleyebileceğiniz oldukça açıktır. Bunlar normalde alttaki tablolardan birinin PK veya CI sütunlarıdır. Görünümün GROUP BYnormalde gruplama tuşlarında dizin oluşturması.


2
Bu cevabın ifadesini gözden geçirmenizi şiddetle tavsiye ediyorum. Orijinal soru ile ilgili geçerli bir nokta olsa da, benzersiz olmayan tüm indekslerin benzersiz olmayanlar içerdiğini düşündürüyor gibi görünebilir (durum böyle değildir).
spaghettidba

@spaghettidba teşekkürler, bunu fark etmedim. Umarım şimdi daha iyi.
usr

Üzgünüm henüz değil. İki şeyi birlikte karıştırıyorsunuz. Kümelenmemiş dizinlerin benzersiz olması gerekmez ve dahili olarak benzersiz değildir: bu noktayı yeterince açıklamıyorsunuz. Yanıtınızda söylediğiniz her şey yalnızca kümelenmiş dizinler için geçerlidir.
spaghettidba

@spaghettidba NCI'ler her zaman dahili olarak benzersizdir. Tüm CI anahtarlarını her zaman bir sorgu planının parçası olarak çıkarabilirler. Bkz. Pastebin.com/vkGHpCsR NCI veri sayfası her iki sütunu da içerir.
usr

Nereden geldiğini görüyorum. Birden çok yaprak aynı dizin anahtarını paylaşabilir, ancak kümeleme anahtarı her zaman NCI'lerde bulunur. Dahili olarak her zaman benzersiz olduklarını söylemek yeterli mi? Ben öyle düşünmüyorum.
spaghettidba
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.