Requête sur table transformée en vue -> problèmes de performances [Résolu]

cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 13 mai 2008 à 19:01 - Dernière réponse : cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention
- 26 févr. 2009 à 13:22
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.
Afficher la suite 

6 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 14 mai 2008 à 11:18
+3
Utile
Il semblerait qu'en passant par des hint lors de la création de la vue, on peut forcer l'emploi des indexs.

Ce qui me donne :

create view vacances as
select /*+ INDEX (vacances_managers I1_vacances_managers)*/ * from vacances_managers
union all
select /*+ INDEX (vacances_patrons I1_vacances_patrons)*/ * from vacances_patrons
union all
select /*+ INDEX (vacances_ouvriers I1_vacances_ouvriers)*/ * from vacances_ouvriers
union all
select /*+ INDEX (vacances_secretaires I1_vacances_secretaires)*/ * from vacances_secretaires

Avec I1_vacances_... les indexs sur oid_employés.

J'attends avant de valider si vous avez des remarques sur cette solution, ou d'autres solutions.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 16 mai 2008 à 11:48
+3
Utile
Bin finalement on va essayer de faire des hint index + des partitionnement de tables.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 14 mai 2008 à 12:40
0
Utile
Bonjour,


petite idée ...


As-tu besoin de tous les champs de la table ? ...


une vue avec quelques champs ne serait pas plus rapide ?

Dom
Commenter la réponse de dominique.stock
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 14 mai 2008 à 13:18
0
Utile
Merci de t'être intéressé à mon problème.

Mais je ne peux pas exclure certaines des 39 colonnes de la vue (La vue est requêtée d'un peu partout dans une application en forme d'usine à gaz).

Et cela n'éviterait pas le FULL SCAN...
Commenter la réponse de cs_rt15
maloum1 2 Messages postés mercredi 28 janvier 2009Date d'inscription 28 août 2010 Dernière intervention - 25 févr. 2009 à 23:05
0
Utile
comment on peut creer une vue si on a beaucoup de tables
Commenter la réponse de maloum1
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 26 févr. 2009 à 13:22
0
Utile
Salut,

Il faut créer un nouveau topic lorsque l'on veut poser une question.

Pour ta question, le code ci-dessus utilise 4 tables. Faire la même chose avec plus de tables n'est pas franchement difficile... Il faut que tu détailles plus ton problème (Mais dans un nouveau topic encore une fois).
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.