Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Heap do SQL Server vs. índice agrupado


O armazenamento heap não tem nada a ver com esses heaps .

Heap significa apenas que os próprios registros não são ordenados (ou seja, não vinculados um ao outro).

Quando você insere um registro, ele apenas é inserido no espaço livre que o banco de dados encontra.

Atualizar uma linha em uma tabela baseada em heap não afeta outros registros (embora afete índices secundários)


Se você criar um índice secundário em um HEAP tabela, o RID (uma espécie de ponteiro físico para o espaço de armazenamento) é usado como um ponteiro de linha.

Índice agrupado significa que os registros fazem parte de uma B-Tree . Quando você insere um registro, a B-Tree precisa ser religado.

Atualizar uma linha em uma tabela clusterizada causa revinculação da B-Tree, i. e. atualizando ponteiros internos em outros registros.


Se você criar um índice secundário em uma tabela clusterizada, o valor da chave de índice clusterizado será usado como um ponteiro de linha.

Isso significa que um índice clusterizado deve ser exclusivo. Se um índice clusterizado não for exclusivo, uma coluna oculta especial chamada uniquifier é anexado à chave de índice que o torna único (e maior em tamanho).

Também vale a pena notar que a criação de um índice secundário em uma coluna faz com que os valores ou a chave do índice clusterizado façam parte da chave do índice secundário.

Ao criar um índice em uma tabela clusterizada, você sempre obtém um índice composto

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

Índice IX_mytable_5678 é de fato um índice nas seguintes colunas:
col5
col6
col7
col8
col1
col2
col3
col4

Isso tem mais um efeito colateral:

Um DESC condição em um índice de coluna única em uma tabela clusterizada faz sentido no SQL Server


Este índice:
CREATE INDEX IX_mytable ON mytable (col1)

pode ser usado em uma consulta como esta:
SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, enquanto este:
CREATE INDEX IX_mytable ON mytable (col1 DESC)

pode ser usado em uma consulta como esta:
SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC