Kümelenmiş bir dizini devre dışı bırakmak neden tabloya erişilemiyor?


11

Bir dizin devre dışı bırakıldığında, tanım sistem kataloğunda kalır ancak artık kullanılmaz. SQL Server dizini (tablodaki veriler değiştikçe) korumaz ve dizin sorguları karşılamak için kullanılamaz. Bir Eğer kümelenmiş dizin devre dışı, tüm tablo erişilemez hale gelir.

B ağacını atarak verilere doğrudan tablodan erişmek neden mümkün değil? (büyük olasılıkla tabloyu satır satır tarayarak) Verilere tamamen erişilemez hale getirmekten daha uygun olmaz mıydı?

Bu tamamen teorik bir soru - bunu asla yapmam. Bu bir senaryo ya da yapılacak bir şey değil, sadece bir şeyin neden böyle gittiğini bilmek istiyorum, bunu bir içsel soru olarak düşünün.

Yanıtlar:


10

neden B ağacını atarak doğrudan tablodan verilere erişmek mümkün değil? (büyük olasılıkla tabloyu satır satır tarayarak) erişilemeyen verilerden daha uygun olmaz mıydı?

Sorunuzu yanıtlamak için Dizin oluşturmayla ilgili temel bilgiler daha kullanışlı hale gelir - Dizin, B ağacı yapısında düzenlenmiş bir dizi sayfadan (dizin düğümleri) oluşur. Bu yapı hiyerarşiktir, kök düğümü hiyerarşinin en üstünde ve yaprak düğümleri en alttadır. Daha fazla ayrıntı için buraya bakın .

Ayrıca, birçok kişinin açıkladığı gibi, Kümelenmiş Dizinler == Fiziksel olarak bir veya daha fazla anahtar veya sütunla sıralanan orijinal tablolar. Bu nedenle, kümelenmiş bir Dizin devre dışı bırakıldığında, veri satırlarına erişilemez. Herhangi bir veri ekleyemezsiniz (Kümelenmemiş Dizin için Ekleme başarılı olur - ancak bu yazı ile tamamen ilgili değildir - burada tartışma Kümelenmiş Dizin'dir) veya yeniden düzenleme işlemi de işe yaramaz.

Aşağıda ayrıntılı olarak açıklayacağız:

CLUSTERED Dizinini devre dışı bırakmanın etkisini görmek için Adventureworks veritabanını kullanacağız .

resim açıklamasını buraya girin

Şimdi tablodaki satır sayısını kontrol edin:

resim açıklamasını buraya girin

Şimdi Kümelenmiş Dizini devre dışı bırakın

resim açıklamasını buraya girin

Şimdi tablodan satır sayısını seçin. Bu kez aşağıdaki mesajla hata verecektir:

resim açıklamasını buraya girin

Yeniden düzenleme operasyonu bile çalışmıyor !!

resim açıklamasını buraya girin

Şimdi Kümelenmiş Dizini yeniden oluşturun ve düzgün çalışması gerekir.

resim açıklamasını buraya girin

Verilere erişip erişemeyeceğimizi görmek için tabloyu seçin

resim açıklamasını buraya girin

Yani alt çizgi, yani biz tablo hala var sonra, Data Kümelenmiş Index devre dışı, ama Drop dışında herhangi bir amaçla erişilebilir olacak veya işlemleri REBUILD etmezse. İlgili tüm Kümelenmemiş Dizinler ve görünümler kullanılamayacak ve tabloya başvuran Yabancı Anahtarlar devre dışı bırakılacak ve tabloya başvuran tüm sorgular için FAILURE (BAŞARISIZ) yönlendirilerek orada devre dışı bırakılacaktır.

Not: Dizini ETKİNLEŞTİRME seçeneği yoktur. Yeniden inşa etmelisin.


2

B + ağacının yaprak düzeyi olan tablo. CI'yi devre dışı bırakarak neyi başarmayı umuyorsunuz? Verilere erişilmesini istemiyorsanız bunu yapmayın.

SQL Server'ın bunu yapmanıza neden izin verdiğinden emin değilim.

CREATE TABLE T
(
    X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, 
    Y INT CONSTRAINT UQ UNIQUE NONCLUSTERED
);

ALTER INDEX PK ON T DISABLE;

... ayrıca NCI'yi de devre dışı bırakır, bu nedenle SELECTkapsadığı sorgular bile devre dışı bırakılır. Bunun için bir kullanım durumu düşünemiyorum. - martin-smith

Kafamdan aklıma gelen tek kullanım, tartışılan şey. Bir tabloyu devre dışı bırakma. Kimsenin, hatta dboveya öğelerine dokunmasını istemediğiniz bir tablonuz varsa sysadmin, kümelenmiş dizini devre dışı bırakabilirsiniz. Tablo verilerle birlikte bulunur, ancak kümelenmiş dizini yeniden etkinleştirinceye kadar tamamen erişilemez. - kenneth-fisher

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.