Por que desativar um índice em cluster torna a tabela inacessível?

11

Quando um índice é desativado, a definição permanece no catálogo do sistema, mas não é mais usada. O SQL Server não mantém o índice (conforme os dados na tabela são alterados) e o índice não pode ser usado para atender a consultas. Se um índice de cluster estiver desabilitado, a tabela inteira ficará inacessível.

Por que não é possível acessar os dados diretamente da tabela descartando a árvore B? (provavelmente examinando a tabela linha por linha) Isso não seria mais apropriado do que tornar os dados completamente inacessíveis?

É uma questão puramente teórica - eu nunca faria isso. Não é um cenário, nem uma coisa para fazer, eu só quero saber por que as coisas acontecem dessa maneira, considere uma questão interna.

Tawfik Khalifeh
fonte

Respostas:

10

por que não é possível acessar os dados diretamente da tabela descartando a árvore B? (provavelmente examinando a tabela linha por linha) não seria mais apropriado do que dados inacessíveis?

Para responder à sua pergunta, os fundamentos da indexação são mais úteis - um índice é composto por um conjunto de páginas (nós de índice) organizados em uma estrutura de árvore B. Essa estrutura é de natureza hierárquica, com o nó raiz na parte superior da hierarquia e os nós folha na parte inferior. Para mais detalhes, consulte aqui .

Além disso, como muitas pessoas descreveram, Clustered Indexes == Tabelas originais ordenadas fisicamente com uma ou mais chaves ou colunas. Portanto, quando um Índice em cluster é desativado, suas linhas de dados não podem ser acessadas. Você não poderá inserir nenhum dado (para o índice não clusterizado, a inserção será bem-sucedida - mas isso não está totalmente relacionado a esta postagem - pois aqui a discussão é sobre o índice clusterizado) ou a operação Reorganizar não funcionará.

Abaixo explicamos em detalhes:

usaremos o banco de dados Adventureworks para ver o efeito de desativar o Índice CLUSTERED .

insira a descrição da imagem aqui

Agora verifique a contagem de linhas na tabela:

insira a descrição da imagem aqui

Agora desative o Índice em Cluster

insira a descrição da imagem aqui

Agora selecione a contagem de linhas da tabela. Desta vez, ocorrerá um erro com a mensagem abaixo:

insira a descrição da imagem aqui

Mesmo a operação de reorganização não funciona !!

insira a descrição da imagem aqui

Agora reconstrua o índice de cluster e ele deve funcionar bem.

insira a descrição da imagem aqui

Selecione a tabela para ver se podemos acessar os dados

insira a descrição da imagem aqui

Portanto, a conclusão é que, se desabilitarmos o Índice de Cluster, os Dados na tabela ainda existirão, mas não estarão acessíveis para nada além de operações Drop ou REBUILD. Todos os índices e visualizações não agrupados relacionados estarão indisponíveis, bem como as Chaves estrangeiras que fazem referência à tabela serão desativadas e, ao liderar o FAILURE para todas as consultas que fazem referência à tabela.

Nota: Não há opção para ATIVAR o Índice. Você tem que reconstruí-lo.

Kin Shah
fonte
2

O nível da folha da árvore B + é a tabela. O que você espera alcançar ao desativar o IC? Só não faça isso se não quiser que os dados estejam inacessíveis.

Não sei ao certo por que o SQL Server permite que você faça isso.

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

ALTER INDEX PK ON T DISABLE;

... também desativa o NCI, portanto, mesmo as SELECTconsultas que seriam cobertas por elas são desativadas. Não consigo pensar em nenhum caso de uso para isso. - Martin Smith

O único uso que consigo pensar é exatamente o que está sendo discutido. Desabilitando uma tabela. Se você possui uma tabela na qual não deseja que ninguém toque, dboou sysadminvocê pode desativar o índice em cluster. A tabela existe junto com os dados, mas fica completamente inacessível até você reativar o índice em cluster. - Kenneth-Fisher

user126897
fonte