sql >> Base de Datos >  >> RDS >> Sqlserver

¿Debo indexar un campo de bit en SQL Server?

Considere qué es un índice en SQL, y el índice es realmente un fragmento de memoria que apunta a otros fragmentos de memoria (es decir, punteros a filas). El índice se divide en páginas para que partes del índice se puedan cargar y descargar de la memoria según el uso.

Cuando solicita un conjunto de filas, SQL usa el índice para encontrar las filas más rápidamente que el escaneo de tablas (mirando cada fila).

SQL tiene índices agrupados y no agrupados. Mi comprensión de los índices agrupados es que agrupan valores de índice similares en la misma página. De esta manera, cuando solicite todas las filas que coincidan con un valor de índice, SQL puede devolver esas filas desde una página de memoria agrupada. Esta es la razón por la que tratar de agrupar en índices una columna GUID es una mala idea:no intente agrupar valores aleatorios.

Cuando indexa una columna de enteros, el índice de SQL contiene un conjunto de filas para cada valor de índice. Si tiene un rango de 1 a 10, entonces tendría 10 punteros de índice. Dependiendo de cuántas filas haya, esto se puede paginar de manera diferente. Si su consulta busca el índice que coincide con "1" y luego donde Nombre contiene "Fred" (suponiendo que la columna Nombre no esté indexada), SQL obtiene el conjunto de filas que coinciden con "1" muy rápidamente, luego la tabla escanea para encontrar el resto.

Entonces, lo que realmente está haciendo SQL es tratar de reducir el conjunto de trabajo (número de filas) sobre el que tiene que iterar.

Cuando indexa un campo de bits (o algún rango estrecho), solo reduce el conjunto de trabajo por el número de filas que coinciden con ese valor. Si tiene una pequeña cantidad de filas que coinciden, reduciría mucho su conjunto de trabajo. Para una gran cantidad de filas con una distribución de 50/50, es posible que obtenga una ganancia de rendimiento muy pequeña en comparación con mantener el índice actualizado.

La razón por la que todos dicen probar es porque SQL contiene un optimizador muy inteligente y complejo que puede ignorar un índice si decide que el escaneo de tablas es más rápido, o puede usar una ordenación, o puede organizar las páginas de memoria como mejor le parezca.