Warum kann durch Deaktivieren eines Clustered-Index nicht auf die Tabelle zugegriffen werden?

11

Wenn ein Index deaktiviert ist, bleibt die Definition im Systemkatalog, wird jedoch nicht mehr verwendet. SQL Server verwaltet den Index nicht (da sich die Daten in der Tabelle ändern), und der Index kann nicht zur Erfüllung von Abfragen verwendet werden. Wenn ein Clustered-Index deaktiviert ist, kann nicht mehr auf die gesamte Tabelle zugegriffen werden.

Warum ist es nicht möglich, direkt aus der Tabelle auf die Daten zuzugreifen und den B-Baum zu verwerfen? (höchstwahrscheinlich durch zeilenweises Scannen der Tabelle) Wäre das nicht angemessener, als die Daten vollständig unzugänglich zu machen?

Es ist eine rein theoretische Frage - das würde ich eigentlich nie tun. Es ist weder ein Szenario noch eine Aufgabe, ich möchte nur wissen, warum das so läuft. Betrachten Sie es als eine interne Frage.

Tawfik Khalifeh
quelle

Antworten:

10

Warum ist es nicht möglich, direkt aus der Tabelle auf die Daten zuzugreifen und den B-Baum zu verwerfen? (höchstwahrscheinlich durch zeilenweises Scannen der Tabelle) Wäre das nicht angemessener als unzugängliche Daten überhaupt?

Um Ihre Frage zu beantworten, sind die Grundlagen der Indizierung nützlicher: Ein Index besteht aus einer Reihe von Seiten (Indexknoten), die in einer B-Baum-Struktur organisiert sind. Diese Struktur ist hierarchischer Natur, wobei sich der Wurzelknoten oben in der Hierarchie und die Blattknoten unten befinden. Weitere Details finden Sie hier .

Wie viele Leute beschrieben haben, sind Clustered Indexes == Originaltabellen, die physisch mit einem oder mehreren Schlüsseln oder Spalten geordnet sind. Wenn ein Clustered-Index deaktiviert ist, kann nicht auf seine Datenzeilen zugegriffen werden. Sie können keine Daten einfügen (für Nicht-Clustered-Index ist das Einfügen erfolgreich - dies hängt jedoch nicht vollständig mit diesem Beitrag zusammen - da hier die Diskussion über Clustered-Index erfolgt), oder es funktioniert auch keine Reorganisationsoperation.

Im Folgenden werden Sie im Detail erklärt:

Wir werden die Adventureworks-Datenbank verwenden, um die Auswirkungen der Deaktivierung des CLUSTERED- Index zu sehen.

Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie nun die Zeilenanzahl in der Tabelle:

Geben Sie hier die Bildbeschreibung ein

Deaktivieren Sie nun den Clustered Index

Geben Sie hier die Bildbeschreibung ein

Wählen Sie nun die Zeilenanzahl aus der Tabelle aus. Dieses Mal tritt ein Fehler mit der folgenden Meldung auf:

Geben Sie hier die Bildbeschreibung ein

Auch der Reorganisationsvorgang funktioniert nicht !!

Geben Sie hier die Bildbeschreibung ein

Erstellen Sie jetzt den Clustered Index neu und es sollte gut funktionieren.

Geben Sie hier die Bildbeschreibung ein

Wählen Sie die Tabelle aus, um zu sehen, ob wir auf die Daten zugreifen können

Geben Sie hier die Bildbeschreibung ein

Die Quintessenz ist also, dass, wenn wir den Clustered-Index deaktivieren, die Daten in der Tabelle weiterhin vorhanden sind, aber nur für Drop- oder REBUILD-Operationen zugänglich sind. Alle zugehörigen nicht gruppierten Indizes und Ansichten sind nicht verfügbar, und Fremdschlüssel, die auf die Tabelle verweisen, werden deaktiviert. Dort wird FAILURE für alle Abfragen geführt, die auf die Tabelle verweisen.

Hinweis: Es gibt keine Option zum Aktivieren des Index. Sie müssen es wieder aufbauen.

Kin Shah
quelle
2

Die Blattebene des B + -Baums ist die Tabelle. Was erhoffen Sie sich durch Deaktivieren des CI? Tun Sie dies nur nicht, wenn Sie nicht möchten, dass auf die Daten nicht zugegriffen werden kann.

Ich bin mir nicht sicher, warum SQL Server dies überhaupt zulässt.

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

ALTER INDEX PK ON T DISABLE;

... deaktiviert auch die NCI, sodass auch SELECTAbfragen, die davon abgedeckt würden, deaktiviert werden. Ich kann mir keinen Anwendungsfall dafür vorstellen. - Martin-Smith

Der einzige Nutzen, den ich mir vorstellen kann, ist genau das, was diskutiert wird. Tabelle deaktivieren. Wenn Sie eine Tabelle haben , dass Sie niemanden berühren wollen, auch dbooder sysadmin, dann können Sie den Clustered - Index deaktivieren. Die Tabelle ist zusammen mit den Daten vorhanden, kann jedoch erst dann vollständig aufgerufen werden, wenn Sie den Clustered-Index wieder aktivieren. - Kenneth-Fischer

user126897
quelle