É possível TABLE
ter uma chave primária sem um índice clusterizado?
E pode TABLE
ter um índice clusterizado sem ter uma chave primária?
Alguém pode me dizer resumidamente a relação entre a chave primária e o índice clusterizado?
Respostas:
Uma chave primária é um conceito lógico - é o identificador exclusivo de uma linha em uma tabela. Como tal, tem vários atributos - pode não ser nulo e deve ser único. Claro, como você provavelmente estará pesquisando muito por 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 desacelerar as gravações se sua chave primária não for um número sequencial.
Sim, você pode ter uma chave primária sem um índice clusterizado - e às vezes, você pode querer (por exemplo, quando sua chave primária é uma combinação de chaves estrangeiras em uma tabela de junção e você não quer incorrer na sobrecarga de embaralhamento do disco ao escrever).
Sim, você pode criar um índice clusterizado em colunas que não são uma chave primária.
Uma tabela pode ter uma chave primária que não está agrupada e uma tabela agrupada não requer uma chave primária. Portanto, a resposta a ambas as perguntas é sim.
Um índice clusterizado armazena todas as colunas no nível folha. Isso significa que um índice clusterizado contém todos os dados da tabela. Uma tabela sem um índice clusterizado é chamada de heap.
Uma chave primária é um índice exclusivo agrupado por padrão. Por padrão, significa que quando você cria uma chave primária, se a tabela ainda não estiver agrupada, a chave primária será criada como um índice exclusivo agrupado. A menos que você especifique explicitamente a nonclustered
opção.
Um exemplo, onde t1
tem uma chave primária t2
não clusterizada e não está em cluster, mas tem 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);
Em primeiro lugar, dê uma olhada nas tabelas organizadas por índice e nos índices agrupados . Na verdade, eu recomendo a leitura de todo o Use the Index Luke! site desde o início até chegar ao tópico de agrupamento para realmente entender o que está acontecendo.
Agora, para suas perguntas ...
Uma TABELA pode ter chave primária sem índice agrupado?
Sim, use a palavra-chave NONCLUSTERED ao declarar sua chave primária para fazer uma tabela baseada em heap. Por exemplo:
CREATE TABLE YOUR_TABLE (
YOUR_PK int PRIMARY KEY NONCLUSTERED
-- Other fields...
);
Isso é lamentável, já que muitas pessoas parecem apenas aceitar o padrão (que é CLUSTERED), embora em muitos casos uma tabela baseada em heap fosse realmente melhor (conforme discutido no artigo vinculado).
e uma TABELA pode ter índice agrupado sem chave primária?
Ao contrário de alguns outros DBMSes, o MS SQL Server permitirá que você tenha um índice de cluster diferente da chave primária, ou mesmo sem ter a chave primária.
O exemplo a seguir cria um índice de clustering separado do PK, que tem uma restrição UNIQUE sobre ele, que é provavelmente o que você 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 o tornará exclusivo automaticamente, adicionando um campo oculto a ele.
Observe que os benefícios do agrupamento são mais visíveis para varreduras de intervalo. Se você usar um índice de agrupamento que não "se alinha" com as varreduras de intervalo feitas por seu (s) aplicativo (s) cliente (como quando confiar demais na coluna oculta mencionada acima ou agrupar em uma chave substituta ), você está praticamente derrotando o propósito de agrupamento.
Alguém pode me dizer resumidamente a relação entre chave primária e í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.
Respostas retiradas do MSDN usando índices agrupados
Uma TABELA pode ter chave primária sem índice agrupado? - Sim.
Uma TABELA pode ter índice agrupado sem chave primária? - Sim.
Uma chave primária é uma restrição que garante a exclusividade dos valores, de forma que uma linha sempre possa ser identificada especificamente por essa chave.
Um índice é atribuído automaticamente a uma chave primária (já que as linhas são freqüentemente "pesquisadas" por sua chave primária).
Um índice não agrupado é uma ordenação lógica de linhas, por uma (ou mais) de suas colunas. Pense nisso como efetivamente outra "cópia" da tabela, ordenada pelas colunas em que o índice está.
Um índice clusterizado ocorre quando a tabela real é fisicamente ordenada por uma coluna específica. Uma tabela nem sempre terá um índice clusterizado (ou seja, embora seja fisicamente ordenado por algo , esse item pode estar indefinido ). Uma tabela não pode ter mais de um índice clusterizado, embora possa ter um único índice clusterizado composto (ou seja, a tabela é fisicamente ordenada por, por exemplo, Sobrenome, Nome, DOB).
O PK é freqüentemente (mas nem sempre) um índice clusterizado.
Pelo que pode valer a pena, no MS SQL Server todas as colunas na chave primária devem ser definidas como NÃO Nulas, embora a criação de um índice clusterizado exclusivo não exija isso. Não tenho certeza sobre outros sistemas de banco de dados.
Pode não ser uma resposta a esta pergunta, mas alguns aspectos importantes na chave primária e índices agrupados são ->
Se houver uma chave primária (por padrão, que é índice clusterizado, no entanto, podemos mudá-la) com índice clusterizado, então não podemos criar mais um índice clusterizado para essa tabela. Mas se ainda não houver uma chave primária definida e houver um índice clusterizado, não poderemos criar uma chave primária com Índice clusterizado.