Pregunta

Tengo un índice en las columnas A, B, C, D de la tabla T

Tengo una consulta que saca de T con A, B, C en la cláusula WHERE.

¿Se utilizará el índice o se necesitará un índice separado que solo incluya A, B, C?

¿Fue útil?

Solución

David B tiene razón en que debe verificar el plan de ejecución para verificar que se está utilizando el índice.

¿Se usará el índice o se necesitará un índice separado que solo incluya A, B, C?

Para responder a esta última parte de la pregunta, que creo que es el tema subyacente principal (a diferencia de la solución inmediata), casi nunca es una razón para indexar un subconjunto de sus columnas indexadas . Si su índice es (A, B, C, D), un DÓNDE en contra (A, B, C) probablemente dará como resultado un índice de búsqueda , que es la situación ideal: el índice incluye Toda la información que el motor necesita para ir directamente al conjunto de resultados. Creo que esto es válido para los tipos numéricos y para las pruebas de igualdad en los tipos de cadena, aunque puede descomponerse con LIKE '%' s). Por otro lado, si su DÓNDE solo hace referencia a D, lo más probable es que termine con un índice escaneo , lo que significaría que el motor SQL tendría que escanear todas las combinaciones de A, B y C, y luego verifique si D cumple con sus criterios antes de decidir si agregar la fila al conjunto de resultados. En una tabla particularmente grande, cuando tuve que hacer muchas consultas contra la columna "D", agregué un índice adicional para D solo, y observé una mejora del rendimiento del 90%.

Editar: También debería recomendar el uso del Asesor de ajuste de motor de base de datos en SQL Management Studio. Le indicará si su tabla no está indexada idealmente para la consulta que desea ejecutar.

Otros consejos

¡Depende!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

Estos no se basarán en el índice, porque el índice no es útil.

Haga clic en " visualizar el plan de ejecución estimado " para confirmar el uso potencial del índice.

en las bases de datos de Oracle, esto se denomina Índice compuesto (12g documentos pero válido para versiones anteriores)

  

Los índices compuestos pueden acelerar la recuperación de datos para las sentencias SELECT en las que la cláusula WHERE hace referencia a todas las partes iniciales de las columnas en el índice compuesto. Por lo tanto, el orden de las columnas utilizadas en la definición es importante. En general, las columnas a las que se accede más comúnmente van primero.

en tu caso, sí. El índice sería / podría ser utilizado. Esto podría verificarse utilizando un plan explicativo.

si MS SQLSERVER es diferente (y sospecho que podría serlo) necesitará una nueva respuesta.

Editar: También debería mencionar que solo considerará el índice de uso ... eso no significa necesariamente que lo usará.

Edit2: Oracle 11g y versiones posteriores ahora tienen una opción que le permitirá saltear columnas en un índice. por lo tanto, una consulta en A, B y D podría seguir utilizando el índice

Se utilizará el índice, sí. Es bastante inteligente sobre qué índices producirán un plan de consulta más óptimo, y no debería tener problemas con eso.

Al igual que con este tipo de cosas, no confíe en mi palabra, haga una prueba comparativa. Cree una tabla, rellénela con datos representativos, consulte, indexe y vuelva a consultarla.

El hecho de que el índice contenga una columna que no se usa en su consulta no evitará que se use.

Eso no quiere decir que definitivamente se usará , se puede ignorar por una razón diferente (quizás porque uno o más índices son más útiles).

Como siempre, tome un squizz en el plan de ejecución estimado para ver qué es probable que suceda.

Comience con la búsqueda de iguales simples (DONDE A = 1 y B = 'Rojo' y C = 287) sí, el índice (lo más probable) se usará. El índice se utilizará primero para ayudar al optimizador " adivina " la cantidad de filas que coincidirán con la selección, y luego la segunda, para acceder realmente a esas filas.

En respuesta al comentario de David B sobre " like " predicado, SQLServer puede seguir usando el índice, depende de lo que esté seleccionando. Por ejemplo, si selecciona un recuento (*), es probable que SQLServer escanee el índice y cuente los aciertos que coincidan con la cláusula where ya que el índice es más pequeño y requeriría menos IO para escanear. Y puede decidir hacerlo incluso si está seleccionando algunas columnas de la tabla base, dependiendo de qué tan selectivo se sienta el índice de SQL Server.

Aquí hay otro " depende " responde ... también depende de qué tan grande sea tu mesa ...

Estoy de acuerdo con todos los demás que han mencionado la verificación del plan de ejecución para verificar si se está utilizando o no su índice.

Aquí hay un par de artículos sobre la lectura de un plan de ejecución que le pueden resultar útiles:

http://www.sqlservercentral.com/articles/Administering/executionplans/ 1345 / http://www.codeproject.com/KB/database/ sql-tuning-tutorial-1.aspx

También hay un buen artículo sobre búsquedas y exploraciones que recomendaría: http://blogs.msdn.com/craigfr/archive/ 2006/06/26 / 647852.aspx

Hay un registro de buenos artículos en el blog de Craig Freedman, aquí hay otro que deberías encontrar útil. Este artículo trata sobre algunos de los factores que utiliza SQL Server para determinar qué índice usar ...

http://blogs.msdn.com/craigfr /archive/2006/07/13/664902.aspx

¡Cuídate! Jeff

En términos generales, sí, todas las bases de datos modernas son lo suficientemente inteligentes como para hacer esto. Hay excepciones, por ejemplo, si las estadísticas en la tabla muestran que el volumen de datos en ella es lo suficientemente pequeño como para que una lectura de la tabla completa sea más eficiente, entonces el índice se descontará, pero como regla general, puede confiar en ello donde sea apropiado.

En consecuencia, puede aprovechar esto al diseñar sus índices. Digamos, por ejemplo, que tengo una tabla que contiene A, B, C como valores clave y columnas Y y Z que contienen datos que sé que se recuperarán a menudo con las declaraciones

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

El I generalmente creará un índice en A, B, C, X, Z, asumiendo que X y Z son un campo razonablemente pequeño. La razón de esto es que sé que la ruta de acceso en las declaraciones anteriores usará el índice, y como los datos que quiero recuperar ya están en la lectura del índice , entonces no hay una lectura separada del bloque de datos necesario para recuperar los datos de la tabla en sí será necesario. Esta estrategia puede acelerar drásticamente la recuperación de datos en algunas circunstancias. Por supuesto, lo paga en costos de actualización y espacio en disco, por lo que necesita entender lo que hace su base de datos antes de aplicarla, pero como en la mayoría de las bases de datos las lecturas superan en número a las escrituras, generalmente vale la pena considerarlas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top