A voir également:
- Index oracle fonctionnement
- Fonctionnement processeur - Guide
- Index téléphonique - Guide
- Fonctionnement du protocole http - Guide
- Telecharger index - Télécharger - Gestion de fichiers
- Notice de fonctionnement - Guide
2 réponses
productif
Messages postés
39
Date d'inscription
mardi 8 mars 2011
Statut
Membre
Dernière intervention
9 février 2017
20
13 mars 2011 à 22:23
13 mars 2011 à 22:23
Il faut savoir que même en présence d'un index, l'usage de ce dernier n'est pas systématique ; en effet, pour un nombre de lignes à retourner important, l'usage d'un index est plus coûteux qu'un parcours complet de la table. C'est donc très courant que les index ne soient pas utilisés dès que le moteur SQL estime que le nombre de lignes à récupérer dépasse une certaine valeur (pas très facile à estimer a priori).
Pour revenir aux cas cités :
=> si les statistiques ne sont pas calculées, si le nombre de d'occurrences de 'MESSI' est important ou si la taille de la table est très petite, il est plus de coûteux de lire l'index puis une partie de la table que de lire la table en intégralité.
=> la clause select contient seulement le champ indexé ; toutes les données nécessaires se trouvent dans l'index et il est inutile de lire la table
L'index unique garantit qu'il y aura au plus une seule ligne de données à récupérer ; dès qu'il y a plus d'une poignée de lignes dans la table, l'usage de l'index devient intéressant.
Ces requêtes sont identiques d'un point de vue sémantique, aucun risque qu'elles aient un plan différent (sauf éventuellement en cas d'utilisation de "hints").
C'est lorsque la partie gauche de l'index ne subit pas de condition qu'un index multi-colonnes est ignoré, par exemple :
En fait, dans certains cas particuliers, Oracle saura quand même utiliser l'index multi-colonnes dans une telle requête ; ils appellent ça l' "index skip scan".
Pour revenir aux cas cités :
SELECT * FROM JOUEURS WHERE NOM='MESSI' ->Pas D'index Utilisé SELECT PRENOM FROM JOUEURS WHERE NOM='MESSI' ->Pas d'index Utilisé
=> si les statistiques ne sont pas calculées, si le nombre de d'occurrences de 'MESSI' est important ou si la taille de la table est très petite, il est plus de coûteux de lire l'index puis une partie de la table que de lire la table en intégralité.
SELECT NOM FROM JOUEURS WHERE NOM='MESSI' ->Index Utilisé
=> la clause select contient seulement le champ indexé ; toutes les données nécessaires se trouvent dans l'index et il est inutile de lire la table
CREATE UNIQUE INDEX idx_nom ON JOUEURS(NOM) -> A la place,l'index sera bel et bien utilisé
L'index unique garantit qu'il y aura au plus une seule ligne de données à récupérer ; dès qu'il y a plus d'une poignée de lignes dans la table, l'usage de l'index devient intéressant.
select * from joueurs where Nom='LIONEL' and Prenom='MESSI' -> Index multi utilisé select * from joueurs where Prenom='LIONEL' and Nom='MESSI' ->Index multi utilisé
Ces requêtes sont identiques d'un point de vue sémantique, aucun risque qu'elles aient un plan différent (sauf éventuellement en cas d'utilisation de "hints").
C'est lorsque la partie gauche de l'index ne subit pas de condition qu'un index multi-colonnes est ignoré, par exemple :
select * from joueurs where Prenom='MESSI' ->Index multi non-utilisé
En fait, dans certains cas particuliers, Oracle saura quand même utiliser l'index multi-colonnes dans une telle requête ; ils appellent ça l' "index skip scan".