ti-enxame.com

Relação entre chave primária e índice clusterizado

Uma TABLE pode ter chave primária sem Índice de Cluster?

e Pode uma tabela ter índice agrupado sem chave primária?

Alguém pode me dizer brevemente o relacionamento da chave primária e do índice clusterizado?

80
F11

Uma chave primária é um conceito lógico - é o identificador exclusivo de uma linha em uma tabela. Como tal, possui vários atributos - pode não ser nulo e deve ser único. Obviamente, como é provável que você esteja procurando registros por seu identificador exclusivo, seria bom ter um índice na chave primária.

Um índice clusterizado é um conceito físico - é um índice que afeta a ordem em que os registros são armazenados no disco. Isso o torna um índice muito rápido ao acessar dados, embora possa diminuir a velocidade de gravação se a chave primária não for um número seqüencial.

Sim, você pode ter uma chave primária sem um índice clusterizado - e, às vezes, convém (por exemplo, quando a chave primária é uma combinação de chaves estrangeiras em uma tabela de junção e não incorre na sobrecarga do shuffle do disco ao escrever).

Sim, você pode criar um índice agrupado em colunas que não são uma chave primária.

80
Neville Kuyt

Uma tabela pode ter uma chave primária que não está em cluster e uma tabela em cluster não requer uma chave primária. Portanto, a resposta para ambas as perguntas é sim.

Um índice clusterizado armazena todas as colunas no nível da folha. Isso significa que um índice em cluster contém todos os dados na tabela. Uma tabela sem um índice clusterizado é chamada de heap.

Uma chave primária é um índice exclusivo que é agrupado por padrão. Por padrão, significa que, quando você cria uma chave primária, se a tabela ainda não estiver em cluster, a chave primária será criada como um índice exclusivo em cluster. A menos que você especifique explicitamente a opção nonclustered.

Um exemplo, onde t1 possui uma chave primária não clusterizada e t2 não está agrupado, mas possui uma chave primária:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

Exemplo no SQL Fiddle.

31
Andomar

Antes de tudo, veja Tabelas organizadas por índices e índices agrupados . Na verdade, recomendo a leitura do site inteiro Use o site Index Luke! desde o início até chegar ao tópico sobre clustering para realmente entender o que está acontecendo.

Agora, para suas perguntas ...


Uma TABLE pode ter chave primária sem Índice de Cluster?

Sim, use a palavra-chave NONCLUSTERED ao declarar sua chave primária para criar uma tabela baseada em heap. Por exemplo:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

Isso é lamentável, pois muitas pessoas parecem apenas aceitar o padrão (que é CLUSTERED), embora em muitos casos uma tabela baseada em heap seja realmente melhor (conforme discutido no artigo vinculado).


e Pode uma tabela ter índice agrupado sem chave primária?

Ao contrário de outros DBMS, o MS SQL Server permite que você tenha um índice de cluster diferente da chave primária ou mesmo sem a chave primária.

O exemplo a seguir cria um índice de cluster separado do PK, que possui uma restrição UNIQUE sobre ele, que é o que você provavelmente deseja na maioria dos casos:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

Se você escolher um índice de cluster não exclusivo (usando CREATE CLUSTERED INDEX ...), o MS SQL Server automaticamente o tornará exclusivo adicionando um campo oculto a ele.

Observe que os benefícios do armazenamento em cluster são mais visíveis para varreduras de intervalo. Se você usar um índice de clustering que não "se alinhe" com as varreduras de intervalo feitas pelo (s) aplicativo (s) cliente (s) (por exemplo, quando confiar demais na coluna oculta mencionada acima ou em cluster em um substituto key ), você está praticamente derrotando o propósito do cluster.


Alguém pode me dizer brevemente o relacionamento da chave primária e do índice clusterizado?

No MS SQL Server, a chave primária também é agrupada por padrão . Você pode alterar esse padrão, conforme discutido acima.

16
Branko Dimitrijevic

Respostas obtidas de MSDN usando índices agrupados

Uma TABLE pode ter chave primária sem Índice de Cluster? - Sim.

Pode uma TABELA ter índice agrupado sem chave primária? - Sim.

Uma Chave Primária é uma restrição que garante a exclusividade dos valores, como que uma linha sempre pode ser identificada especificamente por essa chave.

Um índice é automaticamente atribuído a uma chave primária (como as linhas geralmente são "procuradas" por sua chave primária).

Um índice não clusterizado é uma ordem lógica de linhas, por uma (ou mais) de suas colunas. Pense nisso como efetivamente outra "cópia" da tabela, ordenada por quaisquer colunas em que o índice esteja.

Um índice em cluster é quando a tabela real é ordenada fisicamente por um determinado coluna. Uma tabela nem sempre terá um índice agrupado (por exemplo, enquanto será fisicamente ordenado por algo , essa coisa pode ser indefinido ). Uma tabela não pode ter mais de um índice em cluster, embora possa ter um único índice em cluster composto (ou seja, a tabela é fisicamente ordenada por, por exemplo, Sobrenome, Nome, DOB).

A PK geralmente é (mas nem sempre) um índice em cluster.

4
Sepster

Pelo que pode valer a pena, no MS SQL Server, todas as colunas na chave primária devem ser definidas como NOT Null, enquanto a criação de um índice clusterizado exclusivo não exige isso. Não tenho certeza sobre outros sistemas de banco de dados.

1
robotj

Pode não estar relacionado como resposta a esta pergunta, mas alguns aspectos importantes sobre chave primária e índices clusterizados são ->

Se houver uma chave primária (por padrão, que é o índice de cluster, no entanto, podemos alterar isso) com o índice de cluster, não será possível criar mais um índice de cluster para essa tabela. Mas se ainda não houver um conjunto de chaves primárias e houver um índice em cluster, não será possível criar uma chave primária com o Índice em Cluster.

0
himanshupareek66