¿Cómo usar el índice en la declaración de selección?

97

Digamos que en la tabla de empleados, he creado un índice (idx_name) en la emp_namecolumna de la tabla.

¿Necesito especificar explícitamente el nombre del índice en la cláusula de selección o se usará automáticamente para acelerar las consultas?

Si es necesario especificarlo en la cláusula de selección, ¿cuál es la sintaxis para usar el índice en la consulta de selección?

Vivek
fuente

Respuestas:

86

Si desea probar el índice para ver si funciona, aquí está la sintaxis:

SELECT *
FROM Table WITH(INDEX(Index_Name))

La instrucción WITH forzará el uso del índice.

Jason
fuente
82
Esta publicación no responde a la pregunta. La respuesta es, en resumen: no tiene que especificar el índice en la consulta. Se usa (o no) automágicamente. Sin embargo, puedes forzarlo. Más detalles (cuándo y por qué hacer esto) en otras publicaciones a continuación.
Rast
34

Buena pregunta,

Por lo general, el motor de base de datos debería seleccionar automáticamente el índice que se utilizará en función de los planes de ejecución de consultas que crea. Sin embargo, hay algunos casos bastante raros en los que desea forzar a la base de datos a usar un índice específico.

Para poder responder a su pregunta específica, debe especificar la base de datos que está utilizando.

Para MySQL, desea leer la documentación de sintaxis de sugerencias de índice sobre cómo hacer esto

Tudor Constantin
fuente
30

¿Cómo usar el índice en la declaración de selección?
de esta manera:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

Y muchas más formas de comprobar esto

¿Necesito especificar explícitamente?

  • No, no es necesario especificarlo explícitamente.
  • El motor de base de datos debería seleccionar automáticamente el índice que se utilizará en función de los planes de ejecución de consultas que crea a partir de la respuesta de @Tudor Constantin.
  • El optimizador juzgará si el uso de su índice hará que su consulta se ejecute más rápido, y si es así, usará el índice. de @niktrl respuesta
VdeX
fuente
13

En general , el índice se utilizará si el costo asumido de usar el índice y luego posiblemente tener que realizar más búsquedas de marcadores es menor que el costo de simplemente escanear toda la tabla.

Si su consulta es de la forma:

SELECT Name from Table where Name = 'Boris'

Y 1 fila de 1000 tiene el nombre Boris, es casi seguro que se usará. Si el nombre de todos es Boris, probablemente recurrirá a un escaneo de tabla, ya que es poco probable que el índice sea una estrategia más eficiente para acceder a los datos.

Si es una tabla ancha (muchas columnas) y lo hace:

SELECT * from Table where Name = 'Boris'

Entonces, aún puede optar por realizar el escaneo de la tabla, si es una suposición razonable de que va a tomar más tiempo recuperar las otras columnas de la tabla que solo buscar el nombre, o nuevamente, si es probable que esté recuperando un muchas filas de todos modos.

Damien_The_Unbeliever
fuente
9

El optimizador juzgará si el uso de su índice hará que su consulta se ejecute más rápido, y si es así, usará el índice.

Dependiendo de su RDBMS puede forzar el uso de un índice, aunque no se recomienda a menos que sepa lo que está haciendo.

En general, debe indexar las columnas que usa en las combinaciones de tablas y las declaraciones where

niktrs
fuente
5

Al utilizar la columna a la que se aplica el índice dentro de sus condiciones, se incluirá automáticamente. No tiene que usarlo, pero acelerará las consultas cuando se use.

SELECT * FROM TABLE WHERE attribute = 'value'

Utilizará el índice apropiado.

ChrisBint
fuente
5

Generalmente, cuando crea un índice en una tabla, la base de datos utilizará automáticamente ese índice mientras busca datos en esa tabla. No necesitas hacer nada al respecto.

Sin embargo, en MSSQL, puede especificar un index hintque puede especificar que se debe usar un índice particular para ejecutar esta consulta. Puede encontrar más información sobre esto aquí .

Index hinttambién parece estar disponible para MySQL . Gracias a Tudor Constantine.

MD Sayem Ahmed
fuente
1

La sugerencia de índice solo está disponible para servidores de bases de datos de Microsoft Dynamics. Para SQL Server tradicional, los filtros que defina en su cláusula 'Dónde' deberían persuadir al motor para que use cualquier índice relevante ... Siempre que el plan de ejecución del motor pueda identificar eficientemente cómo leer la información (ya sea un escaneo de tabla completo o un escaneo indexado ) - debe comparar los dos antes de ejecutar la declaración propiamente dicha, como parte de su optimizador de rendimiento integrado.

Sin embargo, puede forzar al optimizador a escanear usando algo como

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

O buscar un índice en particular usando algo como

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

La decisión es tuya. Mire las propiedades del índice de la tabla en el panel de objetos para tener una idea de qué índice desea usar. Debe coincidir con su (s) filtro (s).

Para obtener mejores resultados, enumere primero los filtros que arrojarían la menor cantidad de resultados. No sé si estoy en lo cierto al decirlo, pero parece que los filtros de consulta son secuenciales; si obtiene la secuencia correcta, el optimizador no debería tener que hacerlo por usted comparando todas las combinaciones, o al menos no comenzar la comparación con las consultas más caras.

Cory
fuente