IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Problème de vitesse


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut Problème de performances
    Bonjour,

    j'ai effectué une requête simple qui tourne rapidement sur Oracle 10g chez moi. Le problème est que mon environnement au travail est une Oracle 9i. J'attends vos idées pour la faire autrement (y compris en passant par des tables temporaires ou autre). Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update routes t1 set t1.valid=1
     where not exists (select départ,arrivée from routes t2 where t2.arrivée= t1.départ and t2.valid = 0)
     and t1.valid = 0;
    où routes(départ(PK)= NUMBER, arrivée= NUMBER, valid=NUMBER) peut être remplie avec le script (très moche) suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare
      rand BINARY_INTEGER;
    begin
       execute immediate 'truncate table routes';
      for i in 1..300000 loop
        SELECT  TO_NUMBER(SUBSTR(CURRENT_TIMESTAMP,20,5)) INTO rand FROM dual;
        INSERT INTO routes VALUES (i,rand,0);
      end loop;
     
      commit;
    end;
    /

    Pour donner un peu de concret à la chose, imaginez que chaque nombre dans la table est une ville et que chaque ligne de la table "routes" est une route (la direction est importante) allant d'une ville "départ " à une ville "arrivée".

    Une ville-départ est une ville où n'arrivent aucune route, mais d'où part une route (oui que une seule route car "départ" est la PK). Le but de cette requête est de noter "valid=1" toutes les routes qui partent d'une ville-départ.

    A noter qu'avant de jouer ma requête il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update routes set valid=-1 where départ=arrivée;
    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    T'as essayé de voir si un NOT IN est plus rapide ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE routes t1 SET t1.valid=1
     WHERE depart NOT IN (SELECT arrivée FROM routes WHERE t2.valid = 0)
     AND t1.valid = 0;
    T'as comparé tes plans d'exécution 9i vs 10g ? T'as quoi comme index ?

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    1/ Il ne faut pas utiliser de colonnes dans un NOT EXISTS, ça oblige oracle à lire les données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE routes t1 SET t1.valid=1
     WHERE NOT EXISTS (SELECT 1 FROM routes t2 WHERE t2.arrivée= t1.départ AND t2.valid = 0)
     AND t1.valid = 0;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par McM Voir le message
    1/ Il ne faut pas utiliser de colonnes dans un NOT EXISTS, ça oblige oracle à lire les données.
    Plus maintenant me semble-t-il

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Plan d'execution pour Oracle 9i (avec le 1):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Plan
    UPDATE STATEMENT  CHOOSE			
    	4 UPDATE STAGIAIRE.TABLE1 		
    		3 FILTER  	
    			1 TABLE ACCESS FULL STAGIAIRE.TABLE1 
    			2 TABLE ACCESS FULL STAGIAIRE.TABLE1

    Plan d'exécution pour Oracle 10g Express:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Plan
    UPDATE STATEMENT  ALL_ROWSCost: 1,831  Bytes: 19,986,252  Cardinality: 384,351  			
    	4 UPDATE STAGIAIRE.TABLE1 		
    		3 HASH JOIN ANTI  Cost: 1,831  Bytes: 19,986,252  Cardinality: 384,351  	
    			1 TABLE ACCESS FULL TABLE STAGIAIRE.TABLE1 Cost: 208  Bytes: 9,995,726  Cardinality: 384,451  
    			2 TABLE ACCESS FULL TABLE STAGIAIRE.TABLE1 Cost: 208  Bytes: 9,995,726  Cardinality: 384,451
    La différence de temps est énorme: moins de 20 secondes sur 10g Express, au bout de 10 minutes (traitement interrompu) le traitement 9i était pas terminé ...

    Que faire ? Est-il possible de "suivre" - en faisant plusieurs reqûetes quasi-équivalentes - le plan de la 10g ? Peut on utiliser des directives , genre "merge_aj" ?

    NB: Le test a été fait avec le "1" dans le NOT EXISTS

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Y a t'il moyen de forcer le plan d'exécution entier...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Bon il me semble que j'ai forcé le même plan d'exécution identique...
    Mais c'est toujours aussi lent ...

    En tout cas quand je rajoute les hints ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update /*+ALL_ROWS */routes t1 set t1.valid=1
     where not exists (select /*+HASH_AJ*/  1 from routes t2 where t2.arrivee= t1.depart and t2.valid = 0)
     and t1.valid = 0;
    et que je fais un explain plan dessus... j'ai le plan d'exécution voulu sur 9i....

    A l'exécution je vois pas de différence...
    Est-ce que le plan est bien suivi ?

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Faudrait surtout penser à créer un index pour éviter le FTS

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Après test, c'est l'update que la 9i ne sait pas bien faire. En changeant le update en select *, et en mettant le hint /*+ HASH_AJ*/ tout se passe bien.

    bizarre.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Merci

    Pour l'index, en quoi m'aiderait-il?

    Je doit de toute façon parcourir les tables en entier ou presque...
    D'ailleurs l'optimizer n'utilise pas l'index sur "départ".

    Bon dans tous les cas je vais tester avec des indexs sur arrivée, départ ou les 2.

    Je vous tiens au courant...

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par jlinho2 Voir le message
    Pour l'index, en quoi m'aiderait-il?
    Un FTS ne met pas les blocs en cache, donc tu lis la table 2 fois sur disque.

    En tout cas, ça se tente

Discussions similaires

  1. [SDL] Problème de vitesse
    Par Hybrix dans le forum Développement 2D, 3D et Jeux
    Réponses: 26
    Dernier message: 06/01/2007, 22h31
  2. Problème de vitesse d'execution
    Par Samyhijodelaluna dans le forum MFC
    Réponses: 31
    Dernier message: 17/05/2006, 11h41
  3. [Son] problème de vitesse
    Par glloq8 dans le forum Composants
    Réponses: 6
    Dernier message: 13/02/2006, 14h45
  4. [debutant][c++] Problème de vitesse de déplacement
    Par bornibus dans le forum OpenGL
    Réponses: 15
    Dernier message: 26/02/2005, 09h16
  5. [OpenGL] Problème de Vitesse d'éxécution
    Par stick059 dans le forum OpenGL
    Réponses: 9
    Dernier message: 19/11/2004, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo