Eu tenho essas definições de tabela herdadas ( a partir daqui ):
CREATE TABLE [dbo].[JobItems] (
[ItemId] UNIQUEIDENTIFIER NOT NULL,
-- lots of other columns
CONSTRAINT [PrimaryKey_GUID_HERE] PRIMARY KEY NONCLUSTERED ([ItemId] ASC)
);
CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex]
ON [dbo].[JobItems]([ItemId] ASC);
que efetivamente produz dois índices idênticos. Quero me livrar de um deles para reduzir o tempo de inserção e liberar espaço em disco.
A tabela é armazenada em um banco de dados SQL Azure de produção, portanto, não posso reconstruir a tabela e não posso descartar o índice clusterizado (o SQL Azure requer um índice clusterizado para cada tabela).
Meu requisito é manter todas as garantias de integridade de dados fornecidas pela definição original e me livrar do índice não clusterizado. Parece que ter uma NOT NULL
restrição e um índice exclusivo me dá as mesmas garantias que uma restrição PK. Portanto, a restrição PK é redundante e posso eliminá-la e ao índice subjacente.
Posso simplesmente descartar a restrição PK aqui sem esperar que algo seja interrompido?
Os índices não são idênticos. O CI inclui todas as outras colunas, enquanto o PK tem apenas a coluna de chave ItemId na folha. Portanto, o índice agrupado provavelmente tem 100 vezes o tamanho do índice não agrupado.
Por exemplo, COUNT(*) e consultas de paginação serão significativamente mais caras apenas com o índice clusterizado, pois terão que usar varreduras de tabela.
No momento, seu índice exclusivo e PK identificam exclusivamente cada linha. Isso é redundante. O índice pode ser removido e o cluster pode ser movido para o PK. No entanto, ele falhará se houver chaves estrangeiras em ItemId.
Primeiro procure a(s) chave(s) estrangeira(s):
Em seguida, basta descartar os dois (Index + PK) e recriar um PK clusterizado: