¿Debo crear un índice no agrupado en todas las columnas de búsqueda o solo en cada columna por separado?
On febrero 15, 2021 by adminNo estoy seguro de utilizar correctamente índices no agrupados. El estimador del plan SSMS dijo que se agregara otro índice cuando el siguiente índice ya estaba en la tabla.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
Mi consulta fue
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Mi pregunta es … ¿debería crear un índice para todas las claves de búsqueda posibles? Busco por mzone, iso y postal en diferentes consultas.
Gracias
Comentarios
- ¿Está incluyendo todas las columnas de la tabla?
- Sí, estoy incluyendo todas las columnas.
- Incluir todas las columnas en un solo índice no va a ayudar mucho; dicho índice, en primer lugar, básicamente duplica los requisitos de espacio, y, en segundo lugar, solo se puede usar para las n columnas más a la izquierda; NO simplemente hace que la búsqueda de la columna 17 de la tabla sea más rápida por arte de magia.
- Y tener un índice separado para cada columna, solo porque podría buscarlo algún día, tampoco es muy bueno. Un índice le cuesta, en términos de rendimiento en cada inserción, actualización o eliminación. No ' t sobreindex – eso ' es casi peor que no tener ningún índice …
- Gracias por esos comentarios @marc_s, esa es exactamente la información que estaba buscando. Además, ¿es apropiado decir que hay un buen rango de índices no agrupados para tener (entre 5 y 10, por ejemplo) o es puramente relativo a las necesidades de la tabla? Si es así, ¿a qué tipo de cosas se refiere?
Respuesta
SQL Server le mostrará un índice le gustaría utilizar, ya que estima que el índice facilitaría la vida. Ciertamente no hay necesidad de crear un índice en cada campo de búsqueda, de hecho, hacerlo empeorará sustancialmente el rendimiento de escritura. Si tiene menos de, digamos, 5 a 10 índices en la tabla dada, y ejecuta esa consulta todo el tiempo, probablemente desee agregar el índice sugerido exactamente como lo muestra SSMS.
JNK» s Editar debajo de
También es importante mirar juntos los índices sugeridos. Todas las sugerencias están en silos, por así decirlo, por lo que un índice sugerido completo podría reemplazarse agregando un campo INCULDE
d en otro índice.
Por ejemplo, es posible tener sugerencias para estos dos índices:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Cuando, de hecho, podría satisfacer las necesidades de ambos con:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
He visto esto con índices mucho más complicados (10-20 campos clave, 10-20 campos incluidos) donde se agrega un campo al INCLUDE
eliminará la necesidad del segundo índice.
Comentarios
- @MaxVernon: read Stairway to SQL Server Indexing – Part 1, Introduction to Indexes y luego el resto de los artículos de la serie – cubre prácticamente todo sobre los índices de SQL Server, desde la introducción hasta los temas avanzados
- @MaxVernon: o consulte Índice de cobertura con columnas incluidas para ver una discusión de las columnas incluidas para hacer e un índice " que cubra "
Respuesta
La razón por la que le dice que cree un nuevo índice es porque el que tiene no es el más óptimo posible. El optimizador de consultas es bastante selectivo en la forma en que elige qué índice usar, el siguiente enlace debería ayudarlo a comprender la selectividad:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Dijo anteriormente que había incluido todas las columnas dentro del índice, esencialmente duplicando los datos de la tabla. Sobre esta base, ¿cuál sería el daño de crear 3 índices separados en las columnas que menciona? El espacio utilizado sería menor y la velocidad sería mucho más rápida. Me arriesgaría a adivinar que esto es lo que le dice el DTA / plan de ejecución, solo que de una manera diferente.
Mire los detalles del plan de ejecución que genera la consulta para identificar dónde están sus cuellos de botella y utilícelo como una guía sobre cómo diseñar sus índices. SQL Server es bastante bueno para saber qué es lo mejor: confíe en lo que le dice.
Espero que esto le ayude.
Deja una respuesta