web-dev-qa-db-fra.com

Comment utiliser index dans l'instruction select?

Disons que dans la table employee, j'ai créé un index (idx_name) sur la colonne emp_name de la table.

Dois-je spécifier explicitement le nom de l'index dans la clause select ou elle sera automatiquement utilisée pour accélérer les requêtes.

S'il doit être spécifié dans la clause select, quelle est la syntaxe pour utiliser index dans une requête select?

74
Vivek

Si vous voulez tester l'index pour voir s'il fonctionne, voici la syntaxe:

SELECT *
FROM Table WITH(INDEX(Index_Name))

L'instruction WITH forcera l'index à être utilisé.

72
Jason

Bonne question, 

En règle générale, le moteur de base de données doit sélectionner automatiquement l'index à utiliser en fonction des plans d'exécution de requête qu'il génère. Cependant, il existe des cas assez rares où vous souhaitez forcer la base de données à utiliser un index spécifique.

Pour pouvoir répondre à votre question spécifique, vous devez spécifier la base de données que vous utilisez.

Pour MySQL, vous voulez lire la syntaxe - Index Hint pour savoir comment faire.

31
Tudor Constantin

Comment utiliser index dans une instruction select? 
par ici:

   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);

Et bien d'autres façons de vérifier ceci

Dois-je spécifier explicitement?

  • Non, non Besoin de spécifier explicitement.
  • Le moteur de base de données doit sélectionner automatiquement l'index à utiliser en fonction des plans d'exécution de requête qu'il construit à partir de la réponse de @Tudor Constantin.
  • L'optimiseur jugera si l'utilisation de votre index accélérera l'exécution de votre requête et, le cas échéant, utilisera l'index. de @niktrl answer
25
VdeX

Dans general , l'index sera utilisé si le coût supposé de son utilisation, et éventuellement de la nécessité d'effectuer d'autres recherches de signets, est inférieur au coût du simple balayage du tableau entier.

Si votre requête est de la forme:

SELECT Name from Table where Name = 'Boris'

Et 1 rang sur 1000 a pour nom Boris, il sera presque certainement utilisé. Si tout le monde s'appelle Boris, il utilisera probablement une analyse de table, car il est peu probable que l'index soit une stratégie plus efficace pour accéder aux données.

Si c'est un tableau large (beaucoup de colonnes) et que vous faites:

SELECT * from Table where Name = 'Boris'

Ensuite, il peut toujours choisir d'effectuer l'analyse de la table, s'il est raisonnable de supposer qu'il faudra plus de temps pour extraire les autres colonnes de la table que pour rechercher le nom, ou encore s'il est probable que l'extraction d'une beaucoup de lignes quand même.

13

L'optimiseur jugera si l'utilisation de votre index accélérera l'exécution de votre requête et, le cas échéant, utilisera l'index. 

En fonction de votre SGBDR, vous pouvez forcer l'utilisation d'un index, bien que cela ne soit pas recommandé à moins de savoir ce que vous faites. 

En général, vous devez indexer les colonnes que vous utilisez dans les instructions de jointure de table et où

9
niktrs

Généralement, lorsque vous créez un index sur une table, la base de données utilisera automatiquement cet index lors de la recherche de données dans cette table. Vous n'avez rien à faire à ce sujet.

Cependant, dans MSSQL, vous pouvez spécifier un index hint qui peut spécifier qu'un index particulier doit être utilisé pour exécuter cette requête. Plus d'informations à ce sujet peuvent être trouvées ici .

Index hint semble également être disponible pour MySQL . Merci à Tudor Constantine. 

5
MD Sayem Ahmed

En utilisant la colonne à laquelle l'index est appliqué dans vos conditions, il sera automatiquement inclus. Vous n'êtes pas obligé de l'utiliser, mais cela accélérera les requêtes lorsqu'il sera utilisé.

SELECT * FROM TABLE WHERE attribute = 'value'

Utilisera l'index approprié.

3
ChrisBint

L'indicateur d'index n'est disponible que pour les serveurs de base de données Microsoft Dynamics . Pour SQL Server classique, les filtres que vous définissez dans votre clause 'Where' doivent persuader le moteur d'utiliser tout index pertinent ... peut identifier efficacement comment lire les informations (qu’il s’agisse d’une analyse de table complète ou d’une analyse indexée) - il doit comparer les deux avant d’exécuter l’instruction proprement dite, dans le cadre de son optimiseur de performances intégré.

Cependant, vous pouvez forcer l'optimiseur à numériser en utilisant quelque chose comme

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

Ou chercher un index particulier en utilisant quelque chose comme

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

Le choix t'appartient. Examinez les propriétés d'index de la table dans le panneau des objets pour avoir une idée de l'index que vous souhaitez utiliser. Cela devrait correspondre à votre (vos) filtre (s).

Pour obtenir de meilleurs résultats, énumérez les filtres qui renverraient le moins de résultats en premier ..__ Je ne sais pas si j'ai raison de dire cela, mais il semble que les filtres de requête soient séquentiels; si votre séquence est correcte, l'optimiseur ne devrait pas avoir à le faire pour vous en comparant toutes les combinaisons, ou du moins ne pas commencer la comparaison avec les requêtes les plus coûteuses.

1
Cory