Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Quando usar índices clusterizados ou não clusterizados no SQL Server


Os índices de banco de dados são usados ​​para melhorar a velocidade das operações de banco de dados em uma tabela com um grande número de registros. Índices de banco de dados (tanto índices clusterizados quanto índices não clusterizados) são bastante semelhantes aos índices de livros em sua funcionalidade. Um índice de livros permite que você vá direto aos diferentes tópicos discutidos no livro. Se você quiser pesquisar um tópico específico, basta ir ao índice, encontrar o número da página que contém o tópico que você está procurando e depois ir direto para essa página. Sem um índice, você teria que pesquisar o livro inteiro.

Os índices de banco de dados funcionam da mesma maneira. Sem índices, você teria que pesquisar toda a tabela para realizar uma operação específica do banco de dados. Com índices, você não precisa varrer todos os registros da tabela. O índice aponta diretamente para o registro que você está procurando, reduzindo significativamente o tempo de execução da consulta.

Os índices do SQL Server podem ser divididos em dois tipos principais:
  1. Índices agrupados
  2. Índices não agrupados

Neste artigo, veremos o que são índices clusterizados e não clusterizados, como são criados e quais são as principais diferenças entre os dois. Também veremos quando usar índices clusterizados ou não clusterizados no SQL Server.

Vamos começar com um índice clusterizado.

Índice agrupado


Um índice clusterizado é um índice que define a ordem física na qual os registros da tabela são armazenados em um banco de dados. Como pode haver apenas uma maneira pela qual os registros são armazenados fisicamente em uma tabela de banco de dados, pode haver apenas um índice clusterizado por tabela. Por padrão, um índice clusterizado é criado em uma coluna de chave primária.

Índices agrupados padrão


Vamos criar uma tabela fictícia com coluna de chave primária para ver o índice clusterizado padrão. Execute o seguinte script:

CREATE DATABASE Hospital

CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)


O script acima cria um banco de dados fictício Hospital. O banco de dados tem 4 colunas:id, nome, sexo, idade. A coluna id é a coluna de chave primária. Quando o script acima é executado, um índice clusterizado é criado automaticamente na coluna id. Para ver todos os índices em uma tabela, você pode usar o procedimento armazenado “sp_helpindex”.

USE Hospital
EXECUTE sp_helpindex Patients


Aqui está a saída:



Você pode ver o nome do índice, a descrição e a coluna na qual o índice é criado. Se você adicionar um novo registro à tabela Pacientes, ele será armazenado em ordem crescente do valor na coluna id. Se o primeiro registro inserido na tabela tiver um id de três, o registro será armazenado na terceira linha em vez da primeira linha, pois o índice clusterizado mantém a ordem física.

Índices agrupados personalizados


Você pode criar seus próprios índices clusterizados. No entanto, antes de fazer isso, você precisa criar o índice clusterizado existente. Temos um índice clusterizado devido à coluna de chave primária. Se removermos a restrição de chave primária, o cluster padrão será removido. O script a seguir remove a restrição de chave primária.

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO


O script a seguir cria um índice personalizado “IX_tblPatient_Age” na coluna de idade da tabela Pacientes. Devido a esse índice, todos os registros da tabela Pacientes serão armazenados em ordem crescente de idade.


use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)


Vamos agora adicionar alguns registros fictícios na tabela Pacientes para ver se eles estão realmente inseridos em ordem crescente de idade:

USE Hospital

INSERT INTO Patients

VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)


No script acima, adicionamos 5 registros fictícios. Observe os valores para a coluna de idade. Eles têm valores aleatórios e não estão em nenhuma ordem lógica. No entanto, como criamos um índice clusterizado, os registros serão inseridos na ordem crescente do valor na coluna de idade. Você pode verificar isso selecionando todos os registros da tabela Pacientes.

SELECT * FROM Patients

Aqui está a saída:



Você pode ver que os registros estão ordenados em ordem crescente dos valores na coluna de idade.


Índices não agrupados


Um índice não clusterizado também é usado para acelerar as operações de pesquisa. Ao contrário de um índice clusterizado, um índice não clusterizado não define fisicamente a ordem na qual os registros são inseridos em uma tabela. Na verdade, um índice não clusterizado é armazenado em um local separado da tabela de dados. Um índice não agrupado é como um índice de livro, localizado separadamente do conteúdo principal do livro. Como os índices não clusterizados estão localizados em um local separado, pode haver vários índices não clusterizados por tabela.

Para criar um índice não clusterizado, você deve usar a instrução “CREATE NONCLUSTERED”. O restante da sintaxe permanece igual à sintaxe para criar um índice clusterizado. O script a seguir cria um índice não clusterizado “IX_tblPatient_Name” que classifica os registros em ordem crescente do nome.





use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)



O script acima irá criar um índice que contém os nomes dos pacientes e o endereço de seus respectivos prontuários conforme mostrado abaixo:
Nome Endereço do registro
Ana Endereço do registro
Jon Endereço do registro
Mike Endereço do registro
Nick Endereço do registro
Sara Endereço do registro



Aqui, o “Endereço do registro” em cada linha é a referência aos registros reais da tabela para os Pacientes com nomes correspondentes.

Por exemplo, se você deseja recuperar idade e sexo do paciente chamado “Mike”, o banco de dados primeiro pesquisará “Mick” no índice não clusterizado “IX_tblPatient_Name” e do índice não clusterizado ele buscará a referência real do registro e usará isso para retornar a idade e o sexo reais do paciente chamado "Mike"

Como um banco de dados precisa fazer duas pesquisas, primeiro no índice não clusterizado e depois na tabela real, os índices não clusterizados podem ser mais lentos para operações de pesquisa. No entanto, para as operações INSERT e UPDATE, os índices não clusterizados são mais rápidos, pois a ordem dos registros só precisa ser atualizada no índice e não na tabela real.


Quando usar índices agrupados ou não agrupados


Agora que você conhece as diferenças entre um índice clusterizado e um não clusterizado, vamos ver os diferentes cenários para usar cada um deles.

1. Número de índices


Isso é bastante óbvio. Se você precisar criar vários índices em seu banco de dados, escolha o índice não clusterizado, pois pode haver apenas um índice clusterizado.

2. SELECIONAR operações


Se você deseja selecionar apenas o valor de índice usado para criar e indexar, os índices não clusterizados são mais rápidos. Por exemplo, se você criou um índice na coluna “nome” e deseja selecionar apenas o nome, os índices não clusterizados retornarão rapidamente o nome.

No entanto, se você quiser selecionar outros valores de coluna, como idade, sexo, usando o índice de nome, a operação SELECT será mais lenta, pois primeiro o nome será pesquisado no índice e, em seguida, a referência ao registro da tabela real será usada para pesquisar a idade e o sexo.

Por outro lado, com índices clusterizados, pois todos os registros já estão ordenados, a operação SELECT é mais rápida se os dados estiverem sendo selecionados de colunas diferentes da coluna com índice clusterizado.

3. Operações INSERT/UPDATE


As operações INSERT e UPDATE são mais rápidas com índices não clusterizados, pois os registros reais não precisam ser classificados quando uma operação INSERT ou UPDATE é executada. Em vez disso, apenas o índice não clusterizado precisa ser atualizado.

4. Espaço em disco


Como os índices não clusterizados são armazenados em um local separado da tabela original, os índices não clusterizados consomem espaço em disco adicional. Se o espaço em disco for um problema, use um índice clusterizado.

5. Veredicto Final


Como regra geral, cada tabela deve ter pelo menos um índice clusterizado de preferência na coluna que é usada para SELECIONAR registros e contém valores exclusivos. A coluna de chave primária é um candidato ideal para um índice clusterizado.

Por outro lado, as colunas que geralmente estão envolvidas em consultas INSERT e UPDATE devem ter um índice não clusterizado, assumindo que o espaço em disco não é uma preocupação.