SQLShack (Português)
Os índices são usados para acelerar o processo de consulta no SQL Server, resultando em alta atuação. Eles são semelhantes aos índices de livros didáticos. Nos livros didáticos, se você precisar ir para um capítulo específico, vá para o índice, encontre o número da página do capítulo e vá diretamente para essa página. Sem os índices, o processo de localização do capítulo desejado teria sido muito lento.
O mesmo se aplica a índices em bancos de dados. Sem índices, um SGBD deve percorrer todos os registros da tabela para obter os resultados desejados. Esse processo é chamado de varredura de tabela e é extremamente lento. Por outro lado, se você criar índices, o banco de dados vai primeiro a esse índice e, em seguida, recupera os registros da tabela correspondente diretamente.
Existem dois tipos de índices no SQL Server:
- índice agrupado
- índice não agrupado
Índice agrupado
Um índice agrupado define a ordem em que os dados são armazenados fisicamente em uma tabela. Os dados da tabela podem ser classificados apenas de maneira, portanto, pode haver apenas um índice clusterizado por tabela. No SQL Server, a restrição de chave primária cria automaticamente um índice clusterizado nessa coluna específica.
Vamos dar uma olhada. Primeiro, crie uma tabela “aluno” dentro de “schooldb” executando o seguinte script ou certifique-se de que seu banco de dados tenha um backup completo se você estiver usando seus dados ativos:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CRIAR BASE DE DADOS schooldb
CRIAR TABELA aluno
(
id INT PRIMARY KEY,
name VARCHAR (50) NOT NULL,
gênero VARCHAR (50) NÃO NULO,
Data e hora DOB NÃO NULO,
total_score INT NÃO NULO,
cidade VARCHAR (50) NÃO NULO
)
|
Aviso aqui na tabela “aluno” nós colocamos prima restrição de chave ry na coluna “id”. Isso cria automaticamente um índice clusterizado na coluna “id”. Para ver todos os índices em uma tabela específica, execute o procedimento armazenado “sp_helpindex”. Este procedimento armazenado aceita o nome da tabela como parâmetro e recupera todos os índices da tabela. A consulta a seguir recupera os índices criados na tabela do aluno.
1
2
3
4
5
|
USO schooldb
EXECUTAR sp_helpindex aluno
|
A consulta acima retornará este resultado:
index_name | index_description | index_keys | |
PK__student__3213E83F7F60ED59 | cluster, chave primária exclusiva localizada em PRIMARY | id |
Na saída você pode ver o único índice. Este é o índice que foi criado automaticamente devido à restrição da chave primária na coluna “id”.
Este índice agrupado armazena o registro na tabela do aluno na ordem crescente do “id”. Portanto, se o registro inserido tiver o id 5, o registro será inserido na 5ª linha da tabela ao invés da primeira linha. Da mesma forma, se o quarto registro tiver um id 3, ele será inserido na terceira linha em vez da quarta linha. Isso ocorre porque o índice clusterizado deve manter a ordem física dos registros armazenados de acordo com a coluna indexada, ou seja, id. Para ver essa ordem em ação, execute o seguinte script:
O script acima insere dez registros na tabela do aluno. Observe aqui que os registros são inseridos em ordem aleatória dos valores na coluna “id”. Mas, devido ao índice agrupado padrão na coluna id, os registros são armazenados fisicamente na ordem crescente dos valores na coluna “id”. Execute a seguinte instrução SELECT para recuperar os registros da tabela do aluno.
1
2
3
4
5
|
USE schooldb
SELECIONE * DO aluno
|
Os registros serão recuperados na seguinte ordem:
Criando índice clusterizado customizado
Você pode criar seu próprio índice customizado, bem como o índice clusterizado padrão. Para criar um novo índice clusterizado em uma tabela, você primeiro deve excluir o índice anterior.
Para excluir um índice, vá para “Pesquisador de objetos- > Bancos de dados- > Database_Name- > Tabelas- > Table_Name – > Índices”. Clique com o botão direito no índice que deseja excluir e selecione EXCLUIR . Veja a captura de tela abaixo.
Agora, para criar um novo índice agrupado, execute o seguinte script:
1
2
3
4
5
6
|
use schooldb
CRIAR ÍNDICE CLUSTERED IX_tblStudent_Gender_Score
aluno ON (gênero ASC, total_score DESC)
|
O processo de cre gerar um índice clusterizado é semelhante a um índice normal, com uma exceção. Com o índice clusterizado, você deve usar a palavra-chave “CLUSTERED” antes de “INDEX”.
O script acima cria um índice agrupado denominado “IX_tblStudent_Gender_Score” na tabela do aluno. Este índice é criado nas colunas “gênero” e “total_score”. Um índice que é criado em mais de uma coluna é chamado “índice composto”.
O índice acima primeiro classifica todos os registros na ordem crescente do gênero. Se o gênero for o mesmo para dois ou mais registros, os registros são classificados na ordem decrescente dos valores em sua coluna “total_score”. Você também pode criar um índice agrupado em uma única coluna. Agora, se você selecionar todos os registros do tabela do aluno, eles serão recuperados na seguinte ordem:
Índices não agrupados
Um índice não agrupado não classifica os dados físicos dentro da tabela. o índice não agrupado é armazenado em um local e os dados da tabela são armazenados em outro local. Isso é semelhante a um livro didático onde o conteúdo do livro está localizado em um lugar e o índice está localizado em outro. Isso permite mais de um não agrupado índice por tabela.
É importante mencionar aqui que dentro da tabela os dados serão classificados por um índice agrupado. Porém, dentro do índice não agrupado, os dados são armazenados na ordem especificada. O índice contém valores da coluna nos quais o índice é criado e o endereço do registro ao qual o valor da coluna pertence.
Quando uma consulta é emitida em uma coluna na qual o índice foi criado, o banco de dados irá primeiro ao índice e procurará o endereço da linha correspondente na tabela. Em seguida, ele irá para esse endereço de linha e buscará outros valores de coluna. É devido a essa etapa adicional que os índices não agrupados são mais lentos do que os índices agrupados.
Criando um índice não agrupado
A sintaxe para criar um índice não agrupado é semelhante a o do índice agrupado. No entanto, no caso de um índice não agrupado, a palavra-chave “NONCLUSTERED” é usada em vez de “CLUSTERED”. Dê uma olhada no seguinte script.
1
2
3
4
5
6
|
use schooldb
CRIAR ÍNDICE NÃO EXCLUSIVO IX_tblStudent_Name
Estudante ON (nome ASC)
|
O script acima cria um índice não agrupado na coluna “nome” da tabela do aluno. O índice é classificado por nome em ordem crescente. Como dissemos anteriormente, os dados e o índice da tabela serão armazenados em locais diferentes. Os registros da tabela serão classificados por um índice agrupado, se houver. O índice será classificado de acordo com sua definição e armazenado separadamente Da mesa.
Dados da tabela do aluno:
IX_tblStudent_Name Dados do índice
nome | Endereço da linha |
Alan | Endereço da linha |
Elis | Endereço da linha |
Jolly | Endereço da linha |
Jon | Endereço da linha |
Joseph | Endereço da linha |
Kate | Endereço da linha |
Laura | Endereço da linha |
Ratos | Endereço da linha |
Sara | Endereço da linha |
Wise | Endereço da linha |
Aviso , aqui no índice, cada linha possui uma coluna que armazena o endereço da linha à qual o nome pertence. Portanto, se uma consulta for emitida para recuperar o gênero e o DOB do aluno chamado “Jon”, o banco de dados primeiro pesquisará o nome “Jon” dentro do índice. Em seguida, ele lerá o endereço da linha de “Jon” e irá diretamente para essa linha na tabela “aluno” para buscar o gênero e o DOB de Jon.
Conclusão
Da discussão encontramos as seguintes diferenças entre índices agrupados e não agrupados.
- Só pode haver um índice agrupado por tabela. No entanto, você pode criar vários índices não agrupados em uma única tabela.
- Índices agrupados somente classificam tabelas. Portanto, eles não consomem armazenamento extra. Os índices não agrupados são armazenados em um local separado da tabela real, reivindicando mais espaço de armazenamento.
- Os índices agrupados são mais rápidos do que os índices não agrupados, pois não envolvem nenhuma etapa de pesquisa extra.
Outros excelentes artigos de Ben
Diferença entre identidade & Sequência no SQL Server
Qual é a diferença entre índices agrupados e não agrupados no SQL Server?
- Autor
- Postagens recentes
Veja todas as postagens de Ben Richardson
- Power BI: gráficos em cascata e elementos visuais combinados – 19 de janeiro de 2021
- Power BI : Formatação condicional e cores de dados em ação – 14 de janeiro de 2021
- Power BI: Importando dados do SQL Server e MySQL – 12 de janeiro de 2021
573.279 visualizações
© 2021 Quest Software Inc. TODOS OS DIREITOS RESERVADOS. | GDPR | Termos de uso | Privacidade