Perché disabilitare un indice cluster rende inaccessibile la tabella?


11

Quando un indice è disabilitato, la definizione rimane nel catalogo di sistema ma non viene più utilizzata. SQL Server non mantiene l'indice (poiché i dati nella tabella cambiano) e l'indice non può essere utilizzato per soddisfare le query. Se un indice cluster è disabilitato, l'intera tabella diventa inaccessibile.

Perché non è possibile accedere ai dati direttamente dalla tabella scartando l'albero B? (molto probabilmente analizzando la tabella riga per riga) Non sarebbe più appropriato che rendere i dati completamente inaccessibili?

È una domanda puramente teorica: non lo farei mai. Non è uno scenario, né una cosa da fare, voglio solo sapere perché la cosa va in quel modo, considerarla una domanda interna.

Risposte:


10

perché non è possibile accedere ai dati direttamente dalla tabella scartando l'albero B? (molto probabilmente analizzando la tabella riga per riga) non sarebbe affatto più appropriato dei dati inaccessibili?

Per rispondere alla tua domanda, le nozioni di base sull'indicizzazione sono più utili: un indice è costituito da un insieme di pagine (nodi indice) organizzate in una struttura ad albero B. Questa struttura è di natura gerarchica, con il nodo radice nella parte superiore della gerarchia e i nodi foglia nella parte inferiore. Per maggiori dettagli consultare qui .

Inoltre, come molte persone hanno descritto, Indici cluster == Tabelle originali che sono ordinate fisicamente con una o più chiavi o colonne. Pertanto, quando un indice cluster è disabilitato, non è possibile accedere alle sue righe di dati. Non sarai in grado di inserire alcun dato (per l'indice non cluster l'inserimento avrà esito positivo, ma ciò non è interamente correlato a questo post, poiché qui la discussione è relativa all'indice cluster), altrimenti nessuna operazione di riorganizzazione funzionerà.

Di seguito ti spiegheremo in dettaglio:

useremo il database Adventureworks per vedere l'effetto della disabilitazione dell'indice CLUSTERED .

inserisci qui la descrizione dell'immagine

Ora controlla il conteggio delle righe nella tabella:

inserisci qui la descrizione dell'immagine

Ora disabilita l'indice cluster

inserisci qui la descrizione dell'immagine

Ora seleziona il conteggio delle righe dalla tabella. Questa volta verrà visualizzato un messaggio di errore:

inserisci qui la descrizione dell'immagine

Anche l'operazione di riorganizzazione non funziona !!

inserisci qui la descrizione dell'immagine

Ora ricostruisci l'indice cluster e dovrebbe funzionare bene.

inserisci qui la descrizione dell'immagine

Seleziona la tabella per vedere se possiamo accedere ai dati

inserisci qui la descrizione dell'immagine

Quindi la linea di fondo è che, se disabilitiamo l'indice cluster, i dati nella tabella esistono ancora, ma non saranno accessibili per operazioni diverse da Drop o REBUILD. Tutti gli indici e le viste non cluster correlati non saranno disponibili, così come le chiavi esterne che fanno riferimento alla tabella verranno disabilitate e conducendo il GUASTO per tutte le query che fanno riferimento alla tabella.

Nota: non esiste alcuna opzione per ABILITARE l'indice. Devi RICARICARLO.


2

Il livello foglia dell'albero B + è la tabella. Cosa speri di ottenere disabilitando l'IC? Non farlo se non vuoi che i dati siano inaccessibili.

Non sono davvero sicuro del perché SQL Server ti permetta di farlo.

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

ALTER INDEX PK ON T DISABLE;

... disabilita anche l'NCI, quindi anche le SELECTquery che sarebbero coperte da quelle sono disabilitate. Non riesco a pensare a nessun caso d'uso per questo. - Martin Smith

L'unico uso che mi viene in mente è esattamente quello che si sta discutendo. Disabilitare una tabella. Se hai una tabella che non vuoi che nessuno tocchi, nemmeno dboo sysadmin, puoi disabilitare l'indice cluster. La tabella esiste insieme ai dati, ma è completamente inaccessibile fino a quando non si riattiva l'indice cluster. - Kenneth Fisher

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.