una tipos tabla restricciones restriccion mayusculas ejemplos ejemplo check agregar sql sql-server sql-execution-plan

tipos - restricciones mysql



¿Se usará mi índice si no se usan todas las columnas? (8)

¡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 dependerán del índice, porque el índice no es útil.

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

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

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

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


Aquí hay otra respuesta "depende" ... también depende de qué tan grande sea su mesa ...

Estoy de acuerdo con todos los que mencionaron verificar el plan de ejecución para verificar si su índice se está utilizando o no.

Aquí hay un par de artículos sobre la lectura de un plan de ejecución que debería encontrarle útil:

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 escaneos 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ía encontrarle útil. Este artículo trata sobre algunos de los factores que SQL Server usa para determinar qué índice usar ...

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

¡Cuídate! Jeff


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

En respuesta al comentario de David B sobre el predicado "similar", SQLServer aún puede usar el índice, depende de lo que esté seleccionando. Por ejemplo, si selecciona un recuento (*), SQLServer probablemente escaneará el índice y contará 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 SQLServer sienta que es el índice.


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

¿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 central subyacente (a diferencia de la solución inmediata), casi nunca hay una razón para indexar un subconjunto de sus columnas indexadas. Si su índice es (A, B, C, D), un DONDE contra (A, B, C) lo más probable es que resulte en una búsqueda de índice, que es la situación ideal: el índice incluye toda la información que necesita el motor para ir directamente al conjunto de resultados. Creo que esto es válido para los tipos numéricos y las pruebas de igualdad en los tipos de cadenas, aunque puede desglosarse con LIKE ''%'' s. Por otro lado, si su WHERE solo hace referencia a D, lo más probable es que termine con un escaneo de índice, lo que significaría que el motor de SQL tendría que escanear todas las combinaciones de A, B y C, y luego verificar si D cumplió con sus criterios antes de decidir si agregar la fila al conjunto de resultados. En una mesa particularmente grande, cuando tuve que hacer muchas consultas en la columna "D", agregué un índice adicional solo para D y obtuve una mejora del rendimiento de aproximadamente el 90%.

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


El índice se usará, 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 creas lo que pienso, haz una evaluación comparativa. Cree una tabla, llénela con datos representativos, consulte, indexe y vuelva a consultarla.


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

Eso no quiere decir que definitivamente será utilizado, puede ser ignorado por una razón diferente (tal vez 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.


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 es lo suficientemente pequeño como para que una lectura completa de la tabla sea más eficiente que el índice se descontará, pero como regla puede confiar en ello cuando corresponda. .

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 serán recuperados a menudo por las declaraciones

SELECCIONE Y DE LA tabla WHERE A = alpha y B = beta y C = gamma

SELECCIONE Z DE la tabla WHERE A = alpha y B = beta y C = gamma

En general, crearé un índice en A, B, C, X, Z, suponiendo que X y Z son un campo razonablemente pequeño. El motivo es que sé que la vía de acceso en las declaraciones anteriores usará usar el índice, y como los datos que deseo recuperar ya están en el índice leído, entonces no hay lectura separada del bloque de datos requerido para recuperar los datos de la tabla sí mismo será necesario. Esta estrategia puede acelerar drásticamente la recuperación de datos en algunas circunstancias. Por supuesto, usted paga en costos de actualización y espacio en disco, por lo que debe comprender lo que hace su base de datos antes de aplicarlo, pero como en la mayoría de las bases de datos las lecturas superan drásticamente las escrituras, generalmente vale la pena considerarlas.


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

Los índices compuestos pueden acelerar la recuperación de datos para sentencias SELECT en las que la cláusula WHERE hace referencia a toda la parte principal 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 más comúnmente accedidas van primero.

entonces en tu caso, sí. el índice podría / podría ser utilizado. esto podría verificarse usando un plan de explicación.

si MS SQLSERVER es diferente (y sospecho que sí), necesitará una nueva respuesta.

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

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