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

Adaptive Server Enterprise Sybase Discussion :

[ASE 12.5] optimisationn d'une requête


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2003
    Messages : 148
    Points : 118
    Points
    118
    Par défaut [ASE 12.5] optimisationn d'une requête
    Bonjour,
    J'ai la requête ci-dessous qui a consommé beaucoup des entrées sorties logiques (400.000.000 io). voici ci-dessous la requête:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    update #TbmResults
        set FNDCSR_IDp301SurPerf = 
                  CASE 
                     WHEN TbmRe.FNDCSR_IDp301Perf = -100000 THEN -100000 
                     WHEN FNDOUTidp301.resultFloat = -100000 THEN -100000 
                     ELSE TbmRe.FNDCSR_IDp301Perf - FNDOUTidp301.resultFloat END,
            FNDCSR_IDp303SurPerf = 
                   CASE 
                     WHEN TbmRe.FNDCSR_IDp303Perf = -100000 THEN -100000 
                     WHEN FNDOUTidp303.resultFloat = -100000 THEN -100000 
                     ELSE TbmRe.FNDCSR_IDp303Perf - FNDOUTidp303.resultFloat END,
            FNDCSR_IDp305SurPerf = 
                   CASE 
                     WHEN TbmRe.FNDCSR_IDp305Perf = -100000 THEN -100000 
                     WHEN FNDOUTidp305.resultFloat = -100000 THEN -100000 
                     ELSE TbmRe.FNDCSR_IDp305Perf - FNDOUTidp305.resultFloat END,
            FNDCSR_IDp10SurPerf = 
                   CASE 
                     WHEN TbmRe.FNDCSR_IDp10Perf = -100000 THEN -100000 
                     WHEN FNDOUTidp10.resultFloat = -100000 THEN -100000 
                     ELSE TbmRe.FNDCSR_IDp10Perf - FNDOUTidp10.resultFloat END
     
        from #TbmResults TbmRe, 
        #FND_CSROut FNDOUTidp301, #FND_PARAM FNDPAidp301,
        #FND_CSROut FNDOUTidp303, #FND_PARAM FNDPAidp303,
        #FND_CSROut FNDOUTidp305, #FND_PARAM FNDPAidp305,
        #FND_CSROut FNDOUTidp10, #FND_PARAM FNDPAidp10
     
        where FNDPAidp301.id_periode = 301
        and FNDPAidp303.id_periode = 303
        and FNDPAidp305.id_periode = 305
        and FNDPAidp10.id_periode = 10
     
        and FNDPAidp301.id_param = FNDOUTidp301.id_param
        and FNDPAidp303.id_param = FNDOUTidp303.id_param
        and FNDPAidp305.id_param = FNDOUTidp305.id_param
        and FNDPAidp10.id_param = FNDOUTidp10.id_param
     
        and TbmRe.id_fondsIRP = FNDPAidp301.id_fonds
        and TbmRe.id_fondsIRP = FNDPAidp303.id_fonds
        and TbmRe.id_fondsIRP = FNDPAidp305.id_fonds
        and TbmRe.id_fondsIRP = FNDPAidp10.id_fonds
     
     
    creation des index sur la colonne id_periode de la table #FND_PARAM
    sur la colonne id_param des tables #FND_PARAM et #FND_CSROut
    sur la colonne id_fonds des tables #FND_PARAM et #TbmResults

    Comment puis-je faire pour l'optimiser ou y a t-il un autre moyen de le réecrire ?

    Merci de vos conseils.

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    en fait la requête est assez étrangement construite...

    Quand FNDCSR_IDp30xPerf ou FNDOUTidp30x.resultFloat sont à -100 000, on les affecte à -100 000, sinon on fait la soustraction des deux...

    Pourquoi ne pas mettre en résultat -100 000 de suite et soustraire ensuite les deux si ceux-ci sont différents de -100 000?

    Ce qui donnerait :
    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
    -- Requête 1: mise a -100 000
    UPDATE #TbmResults
        SET FNDCSR_IDp301SurPerf = -100000,
            FNDCSR_IDp303SurPerf = -100000,
            FNDCSR_IDp305SurPerf = -100000,
            FNDCSR_IDp10SurPerf = -100000
        FROM #TbmResults TbmRe, 
        #FND_CSROut FNDOUTidp301, #FND_PARAM FNDPAidp301,
        #FND_CSROut FNDOUTidp303, #FND_PARAM FNDPAidp303,
        #FND_CSROut FNDOUTidp305, #FND_PARAM FNDPAidp305,
        #FND_CSROut FNDOUTidp10, #FND_PARAM FNDPAidp10
     
        WHERE FNDPAidp301.id_periode = 301
        AND FNDPAidp303.id_periode = 303
        AND FNDPAidp305.id_periode = 305
        AND FNDPAidp10.id_periode = 10
     
        AND FNDPAidp301.id_param = FNDOUTidp301.id_param
        AND FNDPAidp303.id_param = FNDOUTidp303.id_param
        AND FNDPAidp305.id_param = FNDOUTidp305.id_param
        AND FNDPAidp10.id_param = FNDOUTidp10.id_param
     
        AND TbmRe.id_fondsIRP = FNDPAidp301.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp303.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp305.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp10.id_fonds
    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
    -- Requête qui fait la soustraction si tous 2 sont différents de -100 000
     
    UPDATE #TbmResults
        SET FNDCSR_IDp301SurPerf = TbmRe.FNDCSR_IDp301Perf - FNDOUTidp301.resultFloat,
            FNDCSR_IDp303SurPerf = TbmRe.FNDCSR_IDp303Perf - FNDOUTidp303.resultFloat,
            FNDCSR_IDp305SurPerf = TbmRe.FNDCSR_IDp305Perf - FNDOUTidp305.resultFloat,
            FNDCSR_IDp10SurPerf =  TbmRe.FNDCSR_IDp10Perf - FNDOUTidp10.resultFloat
        FROM #TbmResults TbmRe, 
        #FND_CSROut FNDOUTidp301, #FND_PARAM FNDPAidp301,
        #FND_CSROut FNDOUTidp303, #FND_PARAM FNDPAidp303,
        #FND_CSROut FNDOUTidp305, #FND_PARAM FNDPAidp305,
        #FND_CSROut FNDOUTidp10, #FND_PARAM FNDPAidp10
     
        WHERE FNDPAidp301.id_periode = 301
        AND FNDPAidp303.id_periode = 303
        AND FNDPAidp305.id_periode = 305
        AND FNDPAidp10.id_periode = 10
     
        AND FNDPAidp301.id_param = FNDOUTidp301.id_param
        AND FNDPAidp303.id_param = FNDOUTidp303.id_param
        AND FNDPAidp305.id_param = FNDOUTidp305.id_param
        AND FNDPAidp10.id_param = FNDOUTidp10.id_param
     
        AND TbmRe.id_fondsIRP = FNDPAidp301.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp303.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp305.id_fonds
        AND TbmRe.id_fondsIRP = FNDPAidp10.id_fonds
        -- Rajout
        AND TbmRe.FNDCSR_IDp301Perf <> -100000
        AND FNDOUTidp301.resultFloat <> -100000
        AND TbmRe.FNDCSR_IDp303Perf <> -100000
        AND FNDOUTidp303.resultFloat <> -100000
        AND TbmRe.FNDCSR_IDp305Perf <> -100000
        AND FNDOUTidp305.resultFloat <> -100000
        AND TbmRe.FNDCSR_IDp10Perf <> -100000
        AND FNDOUTidp10.resultFloat <> -100000
    On ne fait donc l'update que si et seulement si IDp30xPerf sont différent de -100 000, dans tous les autres cas, on aurait le résultat -100 000 (qui est déjà affecté par la première requête)

    Il y a encore sûrement moyen de l'optimiser beaucoup plus, mais sans connaître le contenu des tables, ça s'avère difficile.

    Tentez déjà ça
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Il faudrait voir le plan.

    Mais à priori je pense qu'il faudrait probablement forcer les indexes sur les tables tempo...

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

Discussions similaires

  1. [ASE 15] Envoyer le resultat d'une requète en unicode par mail
    Par antho57 dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 25/03/2008, 12h21
  2. [ASE]SOS Création d'une table à partir d'une requête
    Par bilelle dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 26/09/2007, 11h39
  3. Réponses: 3
    Dernier message: 28/02/2007, 18h46
  4. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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