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

Devo indexar um campo de bits no SQL Server?


Considere o que é um índice no SQL - e o índice é realmente um pedaço de memória apontando para outros pedaços de memória (ou seja, ponteiros para linhas). O índice é dividido em páginas para que partes do índice possam ser carregadas e descarregadas da memória, dependendo do uso.

Quando você solicita um conjunto de linhas, o SQL usa o índice para localizar as linhas mais rapidamente do que a varredura de tabela (observando cada linha).

SQL tem índices clusterizados e não clusterizados. Meu entendimento de índices clusterizados é que eles agrupam valores de índice semelhantes na mesma página. Dessa forma, quando você solicita todas as linhas que correspondem a um valor de índice, o SQL pode retornar essas linhas de uma página de memória em cluster. É por isso que tentar agrupar o índice de uma coluna GUID é uma má ideia - você não tenta agrupar valores aleatórios.

Quando você indexa uma coluna inteira, o índice do SQL contém um conjunto de linhas para cada valor de índice. Se você tiver um intervalo de 1 a 10, terá 10 ponteiros de índice. Dependendo de quantas linhas existem, isso pode ser paginado de maneira diferente. Se sua consulta procurar o índice correspondente a "1" e, em seguida, onde Nome contém "Fred" (supondo que a coluna Nome não esteja indexada), o SQL obtém o conjunto de linhas correspondentes a "1" muito rapidamente e, em seguida, a tabela verifica o restante.

Então, o que o SQL está realmente fazendo é tentar reduzir o conjunto de trabalho (número de linhas) sobre o qual ele deve iterar.

Ao indexar um campo de bits (ou algum intervalo estreito), você reduz apenas o conjunto de trabalho pelo número de linhas correspondentes a esse valor. Se você tiver um pequeno número de linhas correspondentes, isso reduziria muito seu conjunto de trabalho. Para um grande número de linhas com distribuição 50/50, isso pode gerar muito pouco ganho de desempenho em relação à manutenção do índice atualizado.

A razão pela qual todos dizem para testar é porque o SQL contém um otimizador muito inteligente e complexo que pode ignorar um índice se decidir que a varredura de tabela é mais rápida, ou pode usar uma classificação ou organizar páginas de memória da maneira que bem entender.