Disons que dans la table des employés, j'ai créé un index (idx_name) sur la emp_name
colonne 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?
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
la source
Comment utiliser l'index dans l'instruction SELECT?
par ici:
Et bien d'autres façons de vérifier cela
Dois-je spécifier explicitement?
la source
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:
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:
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.
la source
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
la source
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é.
Utilisera l'index approprié.
la source
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 hint
qui 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 hint
est également disponible pour MySQL . Merci à Tudor Constantine.la source
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
Ou pour rechercher un index particulier en utilisant quelque chose comme
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.
la source