Meu conhecimento de nível inferior de SQL (Server 2008) é limitado e agora está sendo desafiado por nossos DBAs. Deixe-me explicar (mencionei afirmações óbvias na esperança de estar certo, mas se você vir algo errado, diga-me) o cenário:
Temos uma mesa que contém 'Ordens Judiciais' para as pessoas. Quando criei a tabela, (Nome: CourtOrder), criei assim:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Em seguida, apliquei um índice não agrupado à chave primária (para eficiência). Meu motivo é que é um campo único (chave primária), e deve ser indexado, principalmente para fins de seleção, como costumamosSelect from table where primary key = ...
Em seguida, apliquei um índice CLUSTERED em PersonId. O motivo era agrupar pedidos para uma determinada pessoa fisicamente, já que a grande maioria do trabalho é receber pedidos para uma pessoa. Assim,select from mytable where personId = ...
Eu fui questionado sobre isso agora. Disseram-me que devemos colocar o índice clusterizado na chave primária e o índice normal no personId. Isso me parece muito estranho. Em primeiro lugar, por que você colocaria um índice clusterizado em uma coluna exclusiva? o que é agrupamento? Certamente isso é um desperdício do índice clusterizado? Eu teria acreditado que um índice normal seria usado em uma coluna única. Além disso, agrupar o índice significaria que não podemos agrupar uma coluna diferente (uma por tabela, certo?).
O motivo pelo qual me disseram que cometi um erro é que eles acreditam que colocar um índice clusterizado no PersonId tornaria as inserções lentas. Para o ganho de 5% na velocidade de uma seleção, estaríamos obtendo uma degradação de 95% na velocidade de inserções e atualizações. Isso é correto e válido?
Eles dizem que, como agrupamos o personId, o SQL Server precisa reorganizar os dados sempre que inserimos ou fazemos uma alteração no PersonId.
Então eu perguntei, por que o SQL teria o conceito de CLUSTERED INDEX, se é tão lento? É tão lento quanto eles estão dizendo? Como devo configurar meus índices para obter um desempenho ideal? Eu teria pensado que SELECT é usado mais do que INSERT ... mas eles dizem que estamos tendo problemas de bloqueio em INSERTS ...
Espero que alguém possa me ajudar.