begin process at 2012 05 27 04:39:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

Oracle

 > 

Requêtes

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 13 mai 2008 à 19:01:03 | Requête sur table transformée en vue -> problèmes de performances

rt15

Membre Club Administrateur CodeS-SourceS

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.

mercredi 14 mai 2008 à 11:18:59 | Re : Requête sur table transformée en vue -> problèmes de performances

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

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.

mercredi 14 mai 2008 à 12:40:40 | Re : Requête sur table transformée en vue -> problèmes de performances

dominique.stock

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

mercredi 14 mai 2008 à 13:18:53 | Re : Requête sur table transformée en vue -> problèmes de performances

rt15

Membre Club Administrateur CodeS-SourceS

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...

vendredi 16 mai 2008 à 11:48:04 | Re : Requête sur table transformée en vue -> problèmes de performances

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Bin finalement on va essayer de faire des hint index + des partitionnement de tables.
mercredi 25 février 2009 à 23:05:22 | Re : Requête sur table transformée en vue -> problèmes de performances

maloum1

comment on peut creer une vue si on a beaucoup de tables
jeudi 26 février 2009 à 13:22:10 | Re : Requête sur table transformée en vue -> problèmes de performances

rt15

Membre Club Administrateur CodeS-SourceS
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).


Cette discussion est classée dans : table, vue, from, vacances, employés


Répondre à ce message

Sujets en rapport avec ce message

Pb déclaration dans curseurs imbriqués [ par falcon16 ] Bonjour à tous, je suis en train d'écrire une procédure PL/SQL pour lister tous les enregistrements présents dans toutes les tables de ma base et ains Jointure externe sur la même table !! [ par tequila1 ] BonjourJe dois effectuer une requête avec jointure externe, mais sur la même table.Voici l' exemple :select    EXTRACT(YEAR_MONTH FROM a.periode) ,   affichage doublons [ par EFFACEUR ] Je voudrais afficher tt les lignes ayant un doublons pour pouvoir verifier lequel supprimerSELECT nom as valeur,COUNT(*) FROM table GROUP BY valeur HA Trigger UPDATED sur plusieurs champs [ par Maroxye ] Bonjour! Je débute en SQL et je fois faire un TRIGGER sur l'ajout, la suppression et la modification de certains champs dans une table. Lorsque ces Génération de graphiques [ par pillsmen ] Bonjour à tous,Mon problème concerne la génération d'un graphique dans un état sous ACCESS.On va commencer par le commencement ^^, je pense qu'un exem Update Mysql Table from csharp datagridview [ par olibara ] BonjourSoit ma question erst tellement idiorte que personne ne veut y repondre soit personne ne connait la reponseJe cherche un petit tutorial  simple changement de l'indicatif telephoniques [ par akkachamid ] salut ,j'ai besoin de code d'une procedure qui permet de changer les indicatifs du telephone dans une table Employés.voila la question !!!! Soit la Select * from * [ par ziffox ] Bonjour à tous, Je cherche a faire une requête qui parcourt toute la base, et qui m'affiche le nom de la table et du champ qui contient une valeur. Vue d'ensemble d'une BDD [ par astromanweb ] Bonjour,Je souhaiterai créer une "vue d'ensemble" de ma base de données.Par exemple :  le nombre d'enregistrements, la taille de la table pour chaque programmation pl/sql [ par perle00 ] salut tt le mondej'ai besoin de votre aide pour résoudre cet exercice.1.créer la table TOP_DOGS afin d'y stocker les employés et leur salaire.2.créer


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales