Existe um equivalente do SQL Server 2008 da cláusula USING INDEX no Oracle? Especificamente para a construção:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
Na documentação do Sql Server sobre índices exclusivos , afirma (ênfase adicionada):
Índices exclusivos são implementados das seguintes maneiras:
PRIMARY KEY ou UNIQUE constrangimento
Quando você cria uma restrição PRIMARY KEY, um índice clusterizado exclusivo na coluna ou colunas é criado automaticamente se um índice clusterizado da tabela ainda não existir e você não especificar um índice não clusterizado exclusivo . A coluna da chave primária não pode permitir valores NULL.
O que parece implicar que há uma maneira de especificar qual índice deve ser usado para uma chave primária.
create table c (c1 int not null primary key, c2 int)
Respostas:
Não. Quando você cria uma chave primária ou restrição exclusiva no SQL Server, um índice exclusivo para oferecer suporte a essa restrição é criado automaticamente, com as mesmas chaves.
Não. A documentação está apenas tentando explicar se o índice de suporte automático será criado como clusterizado ou não clusterizado, se você não especificar. É confuso, eu concordo.
Para esclarecer, quando você adiciona uma restrição de chave primária a uma tabela existente sem expressar uma preferência, o índice de suporte será armazenado em cluster se não houver um índice em cluster preexistente na tabela. O índice de suporte será criado como não clusterizado se já houver um índice em cluster
Você pode solicitar especificamente uma chave primária em cluster ou não em cluster usando:
PRIMARY KEY CLUSTERED
ouPRIMARY KEY NONCLUSTERED
.Para ser justo, a documentação é muito mais clara sobre o assunto em:
restrição de tabela (Transact-SQL)
fonte
A sintaxe do SQL Server para criar um índice em cluster que também é uma chave primária é:
No que diz respeito ao seu comentário: "fazendo uma PK usar um índice nomeado", o código acima resultará no índice da chave primária chamado "PK_c".
A chave primária e a chave de cluster não precisam ser as mesmas colunas. Você pode defini-los separadamente. No exemplo acima, altere a
CLUSTERED
palavra-chave paraNONCLUSTERED
e simplesmente adicione um índice em cluster usando aCREATE INDEX
sintaxe:No SQL Server, o índice clusterizado é a tabela, eles são um e o mesmo. Um índice em cluster define a ordem lógica das linhas armazenadas na tabela. No meu primeiro exemplo, as linhas são armazenadas na ordem dos valores das colunas
c1
ec2
. Como a chave de cluster também é definida como a chave primária, a combinação dec1
ec2
deve ser exclusiva em toda a tabela.No segundo exemplo, a chave primária é composta pelas colunas
c1
ec2
, no entanto, a chave de cluster é apenas ac2
coluna. Como não especifiquei oUNIQUE
atributo naCREATE INDEX
instrução, a chave de cluster (c2
) não precisa ser exclusiva na tabela. Um "uniquificador" será criado automaticamente pelo SQL Server e anexado aos valores nac2
coluna para criar a chave de cluster. Essa chave de cluster, como agora é exclusiva, será usada como um ID de linha em outros índices criados na tabela.Para provar que a chave de cluster controla o layout das linhas no armazenamento, você pode usar a função não documentada
fn_PhysLocCracker(%%PHYSLOC%%)
. O código a seguir mostra as linhas são dispostas em disco na ordem dac2
coluna, que defini como a chave de cluster:Os resultados do meu tempdb são:
Na imagem acima, as três primeiras colunas são produzidas a partir da
fn_PhysLocCracker
função, mostrando a ordem física das linhas no disco. Você pode ver que oslot_id
valor aumenta a etapa de bloqueio com oc2
valor, que é a chave de cluster. O índice de chave primária armazena linhas em uma ordem diferente, o que pode ser visto forçando o SQL Server a retornar resultados da verificação da chave primária:Observe que não usei uma
ORDER BY
cláusula na instrução acima, pois estou tentando mostrar a ordem dos itens no índice de chave primária.A saída da consulta acima é:
Olhando para a
fn_PhysLocCracker
função, podemos ver a ordem física do índice da chave primária.Como estamos lendo exclusivamente do próprio índice, ou seja, nenhuma coluna fora do índice está sendo referenciada na consulta, os
%%PHYSLOC%%
valores representam as páginas no próprio índice.Os resultados:
fonte