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 :

Fractionner l'éxécution d'une requête


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 252
    Points
    252
    Par défaut Fractionner l'éxécution d'une requête
    Bonjour à tous,

    J'ai écrit une requête contenant une sous requête imbriquée. La sous requête est donc évaluée dans son ensemble pour chacune des lignes de la principale avec à chaque fois 4 tests fait sur différents critères.

    C'est donc assez lourd. Néanmoins, je trouve que les temps de réponse sont acceptables avec des volumes de données plutôt faibles. Pour 10 000 lignes j'ai un temps de réponse à 10min. Ce temps de réponse semble d'ailleurs linéaire puisque avec 1 000 lignes, c'est 1 min.

    Mais le problème vient sur des volumes plus gros. Je n'ai pas essayé de lancer sur une période plus grande concernant 100 000 lignes. Ca devrait faire 100min en tps de réponse! Et 1 000 min à 1M de lignes!! Je voudrais éviter de lancer l script au serveur à 18h et le laisser travailler toute la nuit.
    J'ai aucune connaissance dans tout ce qui est optimisation des Rq/Tps de réponses. Ma question est donc, est t'il possible de faire en sorte que l'exécution se fasse par étape, par exemple mois après mois???
    Sachant que je voudrais le résultat de ma requête dans une table unique et non dans 12 différentes si une exécution mois par mois était possible.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Difficile de répondre dans le vide... Pourrais-tu nous présenter ta requête ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par ruru9 Voir le message
    ...
    J'ai aucune connaissance dans tout ce qui est optimisation des Rq/Tps de réponses. ...
    Cela se voit! 10 minutes pour une requête qui travaille sur 10 000 lignes avec Oracle ? Vous devez faire quelque chose de profondément erroné.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 252
    Points
    252
    Par défaut
    Cela se voit!
    Euh oui m'enfin je ne parle pas d'une requête qui retournerait juste les 10 000 occurrences d'une table.
    Quand je lance 10 000 lignes, lors de l'exécution c'est en fait pour chaque ligne un comparaison sur 3 critères (et non pas 4) comme dit dans mon post précédent, ce qui fait du 10 000² * 3 , soit 300*10^6 comparaisons.

    Encore une fois, je n'ai les compétences pour juger si c'est long ou pas, je pensais que ça restait correct mais apparemment c'est pas le cas. Peut être qu'un expert arrive à faire exécuter au serveur ces 300*10^6 comparaisons en moins de 4 secondes?? Mais je suis quand même sceptique.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ça dépend du test réalisé (s'il est en local où si vous faites des appels à d'autres serveur, ce n'est pas la même histoire), mais actuellement vos performances sont nulles.
    Pouvez-vous publier votre code afin qu'on jette un œil ?

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 252
    Points
    252
    Par défaut
    Je reviens vers vous avec le code que j'ai écris. J'ai les champs suivants :

    - CLE : clé primaire de l'événement
    - ID_TYPE_EVENEMENT : la catégorie
    - DH_DEBUT : Date Heure de début
    - DH FIN : Date Heure de fin

    L’idée est de dénombrer pour chaque évènement avec combien d’autre(s) évènement(s) il se chevauche d’au moins 1 seconde.

    C’est cette table retournée que j’ai aliasé en E3 pour faire un comptage en fonction de la valeur correspondant au nombre d’événements.
    En tout cas, le nombre de contrôles effectués pour chaque occurrence de la requête principale ne semble pas avoir d’influence puisque si j’exécute avec un seul contrôle le temps est le même.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    SELECT SIMULT, count(CLE)  FROM
     
    (SELECT
      E1.CLE,
      E1.ID_TYPE_EVENEMENT,
    (SELECT
    Count(E2.CLE)
    FROM 
      TABLE _EVENEMENT E2
    WHERE
    E2.ID_TYPE_EVENEMENT IN (‘A’) AND E1.CLE <> E2.CLE
     
    and
     
    ((E1.DH_DEBUT > E2.DH_DEBUT and E1.DH_DEBUT<E2.DH_FIN) 
    or
    (E1.DH_DEBUT<E2.DH_DEBUT and E1.DH_FIN > E2. DH_FIN)
    or
    (E1. DH_FIN < E2. DH_FIN and E1. DH_FIN>E2. DH_DEBUT)
     
    )
     
    and
     
     to_char(E2.DH_DEBUT,'YYYYMM') = 201501
    ) as SIMULT
     
    FROM
      TABLE _EVENEMENT E1
     
    WHERE
    E1.ID_TYPE_EVENEMENT IN (‘A’) and to_char(E1.DH_DEBUT,'YYYYMM') = 201501
    ) E3
     
    GROUP BY 
     
    SIMULT

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par ruru9 Voir le message
    Encore une fois, je n'ai les compétences pour juger si c'est long ou pas, je pensais que ça restait correct mais apparemment c'est pas le cas. Peut être qu'un expert arrive à faire exécuter au serveur ces 300*10^6 comparaisons en moins de 4 secondes?? Mais je suis quand même sceptique.
    L'idée de l'optimisation d'un requête ne consiste pas à faire un maximum de calcul en un minimum de temps, mais de réduire le nombre de calculs nécessaires afin de prendre moins de temps.

    Dans votre requête, la sous requete corrélée n'est certainement pas une bonne idée.

    Que donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    SELECT 
    		SIMULT
    	,	count(CLE)  
    FROM(
    	SELECT
    		E1.CLE,
    		E1.ID_TYPE_EVENEMENT,
    		COUNT(*) as SIMULT
     
    	FROM  TABLE_EVENEMENT E1
    	INNER JOIN TABLE_EVENEMENT E2
    		ON E1.CLE <> E2.CLE
    		AND E2.ID_TYPE_EVENEMENT IN ('A') 
    		AND E2.DH_DEBUT >= TO_DATE('201501','YYYYMM')
    		AND E2.DH_DEBUT < TO_DATE('201502','YYYYMM')
    		and (
    				(E1.DH_DEBUT > E2.DH_DEBUT and E1.DH_DEBUT<E2.DH_FIN) 
    				or(E1.DH_DEBUT<E2.DH_DEBUT and E1.DH_FIN > E2. DH_FIN)
    				or(E1. DH_FIN < E2. DH_FIN and E1. DH_FIN>E2. DH_DEBUT)
    			)
    	WHERE	E1.ID_TYPE_EVENEMENT IN ('A') 
    		AND E1.DH_DEBUT >= TO_DATE('201501','YYYYMM')
    		AND E1.DH_DEBUT < TO_DATE('201502','YYYYMM')
    	GROUP BY 
    			E1.CLE,
    			E1.ID_TYPE_EVENEMENT
    ) E3 
    GROUP BY SIMULT

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 252
    Points
    252
    Par défaut
    Merci pour votre réponse. Effectivement le temps de réponse est divisé par 10 en faisant cette autojointure. J'ai l'impression que l'emploi de sous requêtes corrélées est un pis aller, à déconseiller.

Discussions similaires

  1. Vérifier l'éxécution d'une requête
    Par PIEPLU dans le forum Langage
    Réponses: 3
    Dernier message: 13/04/2012, 11h44
  2. Réponses: 4
    Dernier message: 30/03/2008, 21h56
  3. Réponses: 2
    Dernier message: 14/01/2008, 14h17
  4. Réponses: 2
    Dernier message: 23/07/2007, 15h38
  5. Réponses: 5
    Dernier message: 24/10/2005, 18h49

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