Ambas as tabelas têm a mesma estrutura e 19972 linhas em cada tabela. para praticar a indexação, criei as duas tabelas com a mesma estrutura e criei
clustered index on persontb(BusinessEntityID)
e
nonclustered index on Persontb_NC(BusinessEntityId)
e estrutura da mesa
BusinessEntityID int
FirstName varchar(100)
LastName varchar(100)
-- Nonclusted key on businessentityid takes 38%
SELECT BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000
-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId from persontb
WHERE businessentityid BETWEEN 400 AND 4000
Por que o índice clusterizado leva 62% e 38% não clusterizado?
Respostas:
Sim, o índice clusterizado possui menos linhas por página que o índice não clusterizado, pois as páginas folha do índice clusterizado devem armazenar os valores para as outras duas colunas (
FirstName
eLastName
).As páginas folha da NCI armazenam apenas os
BusinessEntityId
valores e um localizador de linhas (RID, se a tabela for uma pilha ou a chave do IC).Portanto, os custos estimados refletem o maior número de leituras e os requisitos de IO.
Se você declarar o NCI como
então seria semelhante ao índice em cluster.
fonte
O índice clusterizado contém não apenas dados do índice da coluna ativados, mas também dados de todas as outras colunas. (Só pode haver um índice em cluster por tabela)
O índice não clusterizado contém apenas dados da (s) coluna (s) indexada (s) e um ponteiro row_id para onde estão os demais dados.
Portanto, esse índice não clusterizado específico é mais leve e menos leitura é necessária para varrer / procurar por ele, e essa consulta específica funcionará mais rapidamente.
No entanto, se você tentou recuperar o Nome e o Sobrenome, seria diferente e o índice em cluster deveria ter um desempenho melhor.
fonte
As porcentagens entre os planos de consulta não fazem sentido em comparação. Você deve comparar as consultas para ter uma comparação válida. Além disso, pequenas contagens de linhas tendem a ocultar diferenças de desempenho entre estratégias de indexação. Ao aumentar a contagem de linhas para 10 milhões, você pode obter uma imagem mais clara das diferenças de desempenho.
Há um exemplo de script que cria 3 tabelas, as duas acima e uma terceira com um índice em cluster e não em cluster.
Preencher as tabelas com 10 milhões de linhas
Podemos usar sys.dm_db_index_physical_stats para ver o tamanho no disco dos índices.
E os resultados:
O índice clusterizado do T1 tem cerca de 1,6 GB de tamanho. O índice não agrupado do T2 é de 170 MB (economia de 90% no IO). O índice não agrupado do T3 é de 97 MB, ou cerca de 95% menos IO que o T1.
Portanto, com base nas E / S exigidas, o plano de consulta original deveria ter sido mais próximo das linhas de 10% / 90%, não de 38% / 62%. Além disso, como é provável que o índice não agrupado se encaixe inteiramente na memória, a diferença pode ser maior ainda, pois as E / S do disco são muito caras.
fonte
10%/90%
figura é mais precisa que a38%/62%
. Seqüências de caracteres com comprimento entre 100 e 200 certamente serão uma superestimação bruta dos requisitos de espaço para um par de nome / sobrenome, para que você tenha uma densidade de página menor que o OP. Quando tento com seus dados de exemplo, os custos estimados aparecem em 87% / 13% .data_pages
nosys.allocation_units
. Você pode ver isso a partirCREATE TABLE T1(C INT);CREATE TABLE T2(C INT);UPDATE STATISTICS T1 WITH PAGECOUNT = 1;UPDATE STATISTICS T2 WITH PAGECOUNT = 100
seguida, comparando os custos estimadosSELECT * FROM T1;SELECT * FROM T2;