Dlaczego wyłączenie indeksu klastrowego powoduje, że tabela jest niedostępna?

11

Gdy indeks jest wyłączony, definicja pozostaje w katalogu systemowym, ale nie jest już używana. SQL Server nie utrzymuje indeksu (ponieważ dane w tabeli się zmieniają), a indeksu nie można użyć do zaspokojenia zapytań. Jeśli indeks klastrowany jest wyłączony, cała tabela staje się niedostępna.

Dlaczego nie można uzyskać dostępu do danych bezpośrednio z tabeli odrzucającej B-drzewa? (najprawdopodobniej poprzez skanowanie tabeli rząd po rzędzie) Czy nie byłoby to bardziej odpowiednie niż całkowite niedostępność danych?

To pytanie czysto teoretyczne - nigdy bym tego nie zrobił. To nie jest scenariusz ani rzecz do zrobienia, chcę tylko wiedzieć, dlaczego tak się dzieje, uważam to za pytanie wewnętrzne.

Tawfik Khalifeh
źródło

Odpowiedzi:

10

dlaczego nie jest możliwy dostęp do danych bezpośrednio z tabeli odrzucającej B-drzewa? (najprawdopodobniej poprzez skanowanie tabeli wiersz po wierszu) czy nie byłoby to w ogóle bardziej odpowiednie niż niedostępne dane?

Aby odpowiedzieć na twoje pytanie, przydaje się podstaw indeksowania - Indeks składa się z zestawu stron (węzłów indeksowych) zorganizowanych w strukturę B-drzewa. Struktura ta ma charakter hierarchiczny, z węzłem głównym na górze hierarchii i węzłami liści na dole. Aby uzyskać więcej informacji, patrz tutaj .

Ponadto, jak wiele osób opisało, indeksy klastrowe == oryginalne tabele, które są fizycznie uporządkowane z jednym lub większą liczbą kluczy lub kolumn. Kiedy indeks klastrowany jest wyłączony, nie można uzyskać dostępu do jego wierszy danych. Nie będziesz w stanie wstawić żadnych danych (w przypadku indeksu nieklastrowanego wstawianie zakończy się powodzeniem - ale nie jest to całkowicie związane z tym postem - ponieważ tutaj jest dyskusja o indeksie klastrowanym), ani żadna operacja reorganizacji nie będzie działać.

Poniżej szczegółowo wyjaśnię:

użyjemy bazy danych Adventureworks, aby zobaczyć efekt wyłączenia indeksu CLUSTERED .

wprowadź opis zdjęcia tutaj

Teraz sprawdź liczbę wierszy w tabeli:

wprowadź opis zdjęcia tutaj

Teraz wyłącz Indeks klastrowy

wprowadź opis zdjęcia tutaj

Teraz wybierz liczbę wierszy z tabeli. Tym razem wystąpi błąd z komunikatem poniżej:

wprowadź opis zdjęcia tutaj

Nawet operacja reorganizacji nie działa !!

wprowadź opis zdjęcia tutaj

Teraz odbuduj Indeks klastrowany i powinien on działać poprawnie.

wprowadź opis zdjęcia tutaj

Wybierz tabelę, aby zobaczyć, czy możemy uzyskać dostęp do danych

wprowadź opis zdjęcia tutaj

Więc sedno jest takie, że jeśli wyłączymy Indeks klastrowany, Dane w tabeli nadal będą istnieć, ale nie będą dostępne dla niczego poza operacjami Drop lub REBUILD. Wszystkie powiązane niesklastrowane indeksy i widoki będą niedostępne, a także klucze obce odnoszące się do tabeli zostaną wyłączone i tam, prowadząc FAILURE dla wszystkich zapytań odnoszących się do tabeli.

Uwaga: Nie ma opcji WŁĄCZENIA Indeksu. Musisz go ODBUDOWAĆ.

Kin Shah
źródło
2

Poziom liścia drzewa B + to tabela. Co masz nadzieję osiągnąć, wyłączając CI? Po prostu nie rób tego, jeśli nie chcesz, aby dane były niedostępne.

Nie jestem do końca pewien, dlaczego SQL Server pozwala ci to zrobić.

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

ALTER INDEX PK ON T DISABLE;

... wyłącza także NCI, więc nawet SELECTzapytania, które byłyby przez to objęte, są wyłączone. Nie mogę wymyślić żadnego przypadku użycia do tego. - Martin Smith

Jedyne zastosowanie, jakie mogę wymyślić z własnej głowy, to dokładnie to, co jest omawiane. Wyłączanie stołu. Jeśli masz tabelę, której nikt nie chce dotykać, nawet dbolub sysadmin, możesz wyłączyć indeks klastrowany. Tabela istnieje wraz z danymi, ale jest całkowicie niedostępna do momentu ponownego włączenia indeksu klastrowego. - Kenneth-Fisher

użytkownik126897
źródło