Bonjour,
Ce que je vais dire n'est peut-être pas très clair et donc je m'en excuse.
J'ai compris que dans le Hard parse ou le Soft parse il y a une recherche dans la Shared pool pour voir si un ordre SQL identique à celui en cours de traitement existe déjà. Si c'est le cas, on prends son plan d'exécution, ce qui évite d'avoir à regénérer N plans d'exécution puis en sélectionner un, ce qui est très coûteux en temps de traitement.
J'ai lu qu'une valeur de hash était calculée sur l'ordre SQL et que c'est avec cette valeur qu'on va scanner la Shared pool pour rechercher un ordre SQL équivalent.
Ce que j'aimerais savoir c'est comment est calculée cette valeur de hash.
Si à un instant t le user SCOTT fait "Select nom from EMP where prenom = 'Bambi'" et à un instant t+10 minutes un user JOHN fait "Select nom from EMP where prenom = 'Bambi'" MAIS EMP pointe dans deux schémas différents, sur deux objets de même nom mais avec une structure de table différente, est-ce que la valeur de hash du 2ème ordre SQL va pointer vers le premier ordre SQL et donc récupérer un plan d'exécution qui n'est peut-être pas pertinent?
Autre cas : à un instant t le user SCOTT fait "Select nom from EMP where prenom = 'Bambi'" et à un instant t+10 minutes le même user JOHN, dans la même transaction, fait encore "Select nom from EMP where Prenom = 'Bambi'". Dans le premier cas on utilise un index car prenom = 'Bambi' pointe vers 0.1% des employés.
Je pense que dans le deuxième cas on va pointer vers le plan d'exécution du premier ordre SQL MAIS entre les deux SELECT on a inséré dans la table N données avec Prénom = Bambi --> on a cette fois prenom = 'Babmbi' représentant 50% des employés. Si on réutilise le plan d'exécution du premier Select, on utilise un index alors qu'un full table scan serait plus pertinent... je me trompe?
Partager