Suponiendo que una tabla contiene información suficiente para garantizar una búsqueda de índice, ¿con qué cardinalidad SQL Server (o PostgreSQL) optará por un análisis de índice?¿Con qué cardinality SQL Server cambia a un análisis de índice (frente a buscar)
La razón por la que pregunto esto es que anteriormente publiqué una pregunta (link) en la que dos consultas se realizaron a la misma velocidad, pero una no intentó usar el índice en las columnas procesadas. Después de que SQL Server sugirió poner un que cubría el índice que incluía las columnas que se consultaban (sugirió esto para ambas consultas), comencé a buscar razones de por qué sería una sugerencia tan extraña.
Experimenté con hacer los índices que cubre y el compuesto, pero ambos se ejecutaron en el mismo tiempo (estamos hablando de 3 millones de filas).
Finalmente llegué a la conclusión de que era debido a la cardinalidad ultra alta de los datos. Cada fila es única. Estoy deduciendo que esto causó que el servidor SQL elija un análisis de índice. Sin embargo, la consulta indicó "WHERE Col1>? AND Col2 <?", Por lo que esto es un poco confuso.
Mis preguntas son:
- En lo que se cardinalidad de un RDBMS siempre optan por una exploración de índice?
- ¿Alguien puede explicar por qué SQL Server no usaría el índice cuando la instrucción WHERE indicaría que esto tendría sentido?
He adjuntado el plan de ejecución.
Excelente respuesta @Andrew. Eso me lo aclara muy bien, y explica por qué SQL Server eligió escanear el índice. – IamIC
@Andrew: "Sin embargo, en términos de inclinar un índice de cobertura, eso no es realmente fácil, incluso con el 100% de los datos seleccionados un índice de cobertura aún buscará sobre el escaneo en la mayoría de los casos", ¿por qué? – IamIC
El motor de plan de consulta es un optimizador basado en costo, dado que el acceso de la jerarquía de índice tiene un costo de 0, buscando cada página hoja en el índice, es el mismo costo que escanear cada página hoja en el índice (en términos de costo). Dependiendo de la cláusula where utilizada, he visto que hace ambas cosas, pero se requirió un esfuerzo considerable para escanear, el valor predeterminado fue – Andrew