Comment utiliser l'index dans l'instruction SELECT?

97

Disons que dans la table des employés, j'ai créé un index (idx_name) sur la emp_namecolonne de la table.

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

S'il est nécessaire de le spécifier dans la clause select, quelle est la syntaxe d'utilisation de l'index dans la requête de sélection?

Vivek
la source

Réponses:

86

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

L'instruction WITH forcera l'utilisation de l'index.

Jason
la source
82
Ce message ne répond pas à la question. La réponse est, en bref: vous n'avez pas à spécifier d'index dans la requête. Il est utilisé (ou non) automatiquement. Vous pouvez cependant le forcer. Plus de détails (quand et pourquoi faire cela) dans d'autres articles ci-dessous.
Rast le
34

Bonne question,

En général, 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 crée. 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 souhaitez lire la documentation de la syntaxe d'index Hint pour savoir comment procéder

Tudor Constantin
la source
30

Comment utiliser l'index dans l'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 cela

Dois-je spécifier explicitement?

  • Non, pas 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 @Tudor Constantin.
  • L'optimiseur jugera si l'utilisation de votre index accélérera l'exécution de votre requête, et si tel est le cas, il utilisera l'index. de @niktrl answer
VdeX
la source
13

En général , l'index sera utilisé si le coût supposé de l'utilisation de l'index, et éventuellement de devoir effectuer d'autres recherches de signets, est inférieur au coût de l'analyse de la table entière.

Si votre requête est de la forme:

SELECT Name from Table where Name = 'Boris'

Et 1 ligne sur 1000 porte le nom de Boris, il sera presque certainement utilisé. Si tout le monde s'appelle Boris, il aura probablement recours à un balayage 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 une large table (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 que la récupération des autres colonnes de la table prendra plus de temps que de simplement rechercher le nom, ou encore, s'il est susceptible de récupérer un beaucoup de rangées de toute façon.

Damien_The_Unbeliever
la source
9

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

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

En général, vous devez indexer les colonnes que vous utilisez dans les jointures de table et les instructions where

niktrs
la source
5

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 est utilisé.

SELECT * FROM TABLE WHERE attribute = 'value'

Utilisera l'index approprié.

ChrisBint
la source
5

En règle générale, 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 hintqui peut spécifier qu'un index particulier doit être utilisé pour exécuter cette requête. Vous trouverez plus d'informations à ce sujet ici .

Index hintest également disponible pour MySQL . Merci à Tudor Constantine.

MD Sayem Ahmed
la source
1

L'indicateur d'index n'est disponible que pour les serveurs de base de données Microsoft Dynamics. Pour SQL Server traditionnel, les filtres que vous définissez dans votre clause `` Where '' devraient persuader le moteur d'utiliser tous les index pertinents ... À condition que le plan d'exécution du moteur puisse identifier efficacement comment lire les informations (qu'il s'agisse d'une analyse complète de la table 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 à scanner en utilisant quelque chose comme

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

Ou pour rechercher un index particulier en utilisant quelque chose comme

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

Le choix t'appartient. Regardez 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. Il doit correspondre à vos filtres.

Pour de meilleurs résultats, répertoriez les filtres qui renverraient le moins de résultats en premier. Je ne sais pas si j'ai raison de dire, 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 à votre place en comparant toutes les combinaisons, ou du moins ne pas commencer la comparaison avec les requêtes les plus coûteuses.

Cory
la source