Bonjour
Sous FIREBIRD 2.5 (avant dernière version)
J'ai une question sur la construction du plan d’exécution par l'optimisateur qui me semble pas très optimal
Voici les éléments (les requêtes ont été simplifiées pour une meilleur visualisation)
Je joins 2 tables dont les index suivant ont été créés (Les index propres au clé primaire sont évidemment crées ) :
* FK_N_DATA_TAXON lié à la colonne N_Data.Id_Taxon (sélectivité = 0.0008)
* IDX_N_SESSION_ANNEE lié à la colonne N_Session.Date_Session au travers de [EXTRACT(YEAR FROM N_Session.Date_Session)] (Sélectivité = 0.006)
* IDX_N_SESSION_MOIS lié à la colonne N_Session.Date_Session au travers de [EXTRACT(MONTH FROM N_Session.Date_Session)] (Sélectivité = 0.08)
Voici les requêtes :
1.
Voici le plan proposé par l'optimisateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT N_Data.Type_Action FROM N_Data INNER JOIN N_Session ON (N_Session.Id_Session = N_Data.Id_Session) WHERE N_Data.Id_Taxon = :Id_Taxon
avec un temps d’exécution de 0.5sPLAN JOIN (N_DATA INDEX (FK_N_DATA_TAXON), N_SESSION INDEX (PK_N_SESSION))
2.
Voici le plan proposé par l'optimisateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT N_Data.Type_Action FROM N_Data INNER JOIN N_Session ON (N_Session.Id_Session = N_Data.Id_Session AND N_Session.Actif = 1) WHERE N_Data.Id_Taxon = :Id_Taxon AND EXTRACT(YEAR FROM N_Session.Date_Session) BETWEEN 1900 AND 2013 AND EXTRACT(MONTH FROM N_Session.Date_Session) IN (1,3,5,7,9,11)
avec un temps d’exécution de 10sPLAN JOIN (N_SESSION INDEX (IDX_N_SESSION_ANNEE, IDX_N_SESSION_MOIS, IDX_N_SESSION_MOIS, IDX_N_SESSION_MOIS, IDX_N_SESSION_MOIS, IDX_N_SESSION_MOIS, IDX_N_SESSION_MOIS), N_DATA INDEX (FK_BAGUE_ID_SESSION, FK_N_DATA_TAXON))
Cela ne parait pas incohérent puisque les index utilisés en premier sont moins pertinents
IDX_N_SESSION_ANNEE (Sel = 0.006),
IDX_N_SESSION_MOIS (Sel = 0.08
et enfin FK_N_DATA_TAXON (Sel = 0.0008)
Correct ?
3 - Je force le plan d'execution
Le plan final proposé est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT N_Data.Type_Action FROM N_Data INNER JOIN N_Session ON (N_Session.Id_Session = N_Data.Id_Session AND N_Session.Actif = 1) WHERE N_Data.Id_Taxon = :Id_Taxon AND EXTRACT(YEAR FROM N_Session.Date_Session) BETWEEN 1900 AND 2013 AND EXTRACT(MONTH FROM N_Session.Date_Session) IN (1,3,5,7,9,11) PLAN SORT (JOIN (N_DATA INDEX (FK_N_DATA_TAXON), N_SESSION INDEX (PK_N_SESSION, IDX_N_SESSION_ANNEE, IDX_N_SESSION_MOIS)))
le temps d’exécution de 0.5sPLAN JOIN (N_DATA INDEX (FK_N_DATA_TAXON), N_SESSION INDEX (PK_N_SESSION))
Ma question est donc pourquoi l'optimisateur propose en 2 un plan qui est si désastreux en terme de temps d’exécution (facteur 20) ?
Évidemment j'utilise la requête 3 en productivité, mais c'est par curiosité (et pour faire avancé le schmilblick )
a+
olivier
Partager