Bonjour,
(Oracle 9.2.0.7.0)
On a une table vacances de plus de 30 millions d'enregistrements.
Certains traitements ne s'appliquent que sur une partie de ceux-ci.
Il a donc été décidé de diviser cette table en 4 tables, de manières à ce que ces traitements spécifiques soient plus performants.
Cependant, d'autres traitements nécessitent d'accèder à l'ensemble des enregistrements de la table originale.
Une vue à donc été réalisée,avec le même nom que la table d'origine :
create view vacances as
select * from vacances_managers
union all
select * from vacances_patrons
union all
select * from vacances_ouvriers
union all
select * from vacances_secretaires
On accède ensuite à cette vue avec des requêtes ressemblant toutes à ça :
select * from vacances, employés where employés.nom='toto' and employés.oid=vacances.oid_employés
oid étant clé primaire de employés référencée par vacances.oid_employés, clé étrangère de vacances.
On a les indexs qui vont bien : les tables vacances_... sur oid_employés, et employés sur nom.
Cependant, les requêtes mettent un temps considérable, sans commune mesure avec ce que l'on avait avec la table des 30 millions d'enregistrements.
En effet, si on regarde le plan d'exécution de Oracle, on tombe sur du full scan :
MERGE JOIN 10
employés TABLE ACCESS (BY INDEX ROW ID) 2
employés.AK_NOM INDEX (UNIQUE SCAN) 1
FILTER 9
vacances 8
UNION ALL 7
vacances_managers TABLE ACCESS (FULL) 3
vacances_patrons TABLE ACCESS (FULL) 4
vacances_ouvriers TABLE ACCESS (FULL) 5
vacances_secretaires TABLE ACCESS (FULL) 6
Du peu que je connais en SQL, je pense qu'il serait préférable de faire le MERGE JOIN 4 fois sur les 4 tables vacances_ en profitant des indexs, puis de faire seulement après le UNION ALL.
Quelqu'un à une idée d'optimisation (Création de la vue différente qui amènerait Oracle à revoir son plan...) ?
Plus généralement, existe-t-il une meilleur méthode de découpage quand on arrive à des tables trop grosses ?
Je me doute que cette question est peut être un peu trop spéicifique à nos problèmes et pas forcément très intéressante...Mais à tout hasard je poste quand même (On sais jamais on est peut être passé à côté d'un truc)
Merci d'avance.