Cada vez que un índice compuesto es creado, el order de las columnas debe elegirse cuidadosamente. Índices concatenados Está dedicado a este tema.
Sin embargo, existe el mito de que siempre debe elegirse la columna más selectiva en la primera posición; esto es simplemente incorrecto.
Importante
La consideración más importante al definir un índice concatenado es cómo elegir el orden de las columnas para que pueda utilizarse con la mayor frecuencia posible.
Despúes de eso, incluso pueden existir varias razones para colocar primero la columna menos selectiva. Por ejemplo, la base de datos de Oracle puede utilizar un INDEX SKIP SCAN en ese caso. Pero esa es una funcionalidad avanzada. El factor más importante... mmm, ¿ya lo había dicho antes?
La verdadera esencia del mito está relacionada con la indexación de rangos independientes; este el único caso en el que la selectividad debe influir en el diseño del índice (véase Índice Merge: Combinar múltiples índices).
Este mito es extraordinariamente persistente en entornos de SQL Server e incluso aparece en la documentación oficial. La razón es que SQL Server mantiene un histograma solo para la primera columna del índice. Pero eso significa que la primera recomendación debería ser “primero las columnas con distribución desigual", ya que, de todos modos, los histogramas no son útiles para las columnas con distribución uniforme.
No soy el primero en combatir este mito. Aquí hay unas referencías más que lo desmienten:
No coloques automáticamente el término más selectivo en primer lugar en un índice concatenado
— Guy Harrison en “Oracle Performance Survival Guide”
Uno de los cuentos de hadas más citados sobre los índices era la regla de “colocar primero la columna más selectiva“. Nunca fue una regla general sensata (salvo, posiblemente, antes de la versión 6.0).
— Jonathan Lewis en “Oracle Scratchpad”
De nada sirve tener la columna más selectiva a la izquierda si muy pocas consultas filtran por ella. Las consultas que no filtran por esa, pero si lo hacen por otras columnas del índice, tendrán que realizar un escaneo y los escaneos son costosos.
— Gail Shaw en ”SQL (Server) in the Wild”

