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 :

[T-SQL] Optimisation de proc


Sujet :

Adaptive Server Enterprise Sybase

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Par défaut [T-SQL] Optimisation de proc
    Bonjour,

    Je rencontre de gros problèmes de performances avec une de mes procs.
    Voilà résumé le problème :
    Le gros de cette proc est d'insérer dans une table via un curseur.
    Comme vous pouvez le voir plus bas, une jointure a été supprimée (AND ACTNAIRE_NOMI.CD_VALEUR = @CD_VALEUR). Cette jointure apparaissait à plusieurs endroits de la proc, et depuis les performances ont chuté.
    Il n'y avait pas d'index portant sur cette colonne mais pourtant les perf étaient bonnes. Mais depuis qu'on a supprimé cette jointure, sans toucher aux indexs, les perfs ont chuté.

    Pouvez-vous m'aider ? Merci

    Pour les courageux je peux envoyer le script complet de la proc

    Exemple d'un bout de la proc :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    DECLARE cur_nomi CURSOR
    FOR
    SELECT  ID_NOMINATIF,
            ID_TYPE_PROP,
            ID_CIVIL,
            NOM,
            PRENOM,
            BATIMENT,
            RUE,
            COMPLEMENT,
            CODE_POSTAL,
            VILLE,
            PAYS,
            NB_ACT_VS,
            NB_ACT_VP,
            REF_SOCIETE,
            REF_SALARIE,
            CD_REG_COU,
            CD_SS_REG_COU,
            CD_VALEUR,
            ADRE_PAYS_IDEN,
            IND_BLOCAGE,
            LANG
     
    FROM    NOMINATIF_TRANSIT
            WHERE ID_ASS_GEN  = @ID_ASS_GEN
              AND CD_COMPUTER = @CD_COMPUTER
              AND CD_USER     = @CD_USER
     
     
    open cur_nomi
    fetch cur_nomi into @ID_NOMINATIF,
                        @ID_TYPE_PROP,
                        @ID_CIVIL,
                        @NOM,
                        @PRENOM,
                        @BATIMENT,
                        @RUE,
                        @COMPLEMENT,
                        @CODE_POSTAL,
                        @VILLE,
                        @PAYS,
                        @NB_ACT_VS,
                        @NB_ACT_VP,
                        @REF_SOCIETE,
                        @REF_SALARIE,
                        @CD_REG_COU,
                        @CD_SS_REG_COU,
                        @CD_VALEUR,
                        @ADRE_PAYS_IDEN,
                        @IND_BLOCAGE,
                        @LANG
     
     
    /* Boucle sur les lignes */
    WHILE @@sqlstatus = 0
    BEGIN
     
       /* Recherche dans la base des infos existantes concernant cet actionnaire */
       SELECT   @ID_ACTNAIRE      = ACTNAIRE.ID_ACTNAIRE,
                @ID_ACTNAIRE_NOMI = ACTNAIRE_NOMI.ID_ACTNAIRE,
                @NB_ACT_VS_OLD    = ACTNAIRE_NOMI.NB_ACT_VS,
                @NB_ACT_VP_OLD    = ACTNAIRE_NOMI.NB_ACT_VP
     
       FROM   ACTNAIRE, ACTNAIRE_NOMI
     
       WHERE ACTNAIRE.ID_ASS_GEN        =  @ID_ASS_GEN
       AND   ACTNAIRE.ID_NOMINATIF      =  @ID_NOMINATIF
       AND   ACTNAIRE_NOMI.ID_ASS_GEN   =  @ID_ASS_GEN
       AND   ACTNAIRE_NOMI.ID_ACTNAIRE  =  ACTNAIRE.ID_ACTNAIRE
       AND   ACTNAIRE_NOMI.ID_TYPE_PROP =  @ID_TYPE_PROP
       -- Supression du contrôle sur le code valeur
       -- AND   ACTNAIRE_NOMI.CD_VALEUR    =  @CD_VALEUR

  2. #2
    Membre Expert

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    Il faudrait voir le SHOWPLAN ainsi que la définition des indexes sur les deux tables pour voir ce qui ce passe.

    Michael

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Par défaut
    J'ai justement un problème avec le showplan.

    J'essaie de l'obtenir dans SQL Advantage et j'ai le message suivant quand j'execute le script de ma proc :

    DECLARE CURSOR must be the only statement in a query batch.

    Et du coup je n'arrive pas à avoir mon plan... Que faire ?

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    Soit il faut exécuter la proc elle-même avec le SHOWPLAN, soit il faut splitter le code en deux partie et executer le "DECLARE ... CURSOR" séparément. Dans isql cela fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    set showplan on
    set statistics io on
    go
    declare ... cursor for select ...
    go
    ... reste du code
    go
    Michael

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Par défaut
    Citation Envoyé par mpeppler
    Soit il faut exécuter la proc elle-même avec le SHOWPLAN, soit il faut splitter le code en deux partie et executer le "DECLARE ... CURSOR" séparément. Dans isql cela fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    set showplan on
    set statistics io on
    go
    declare ... cursor for select ...
    go
    ... reste du code
    go
    Michael
    Ca ne marche toujours pas
    Voila à quoi ressemble mon script :


    set showplan on
    set statistics io on
    go
    ...code...
    go
    declare cursor for select
    go
    reste du code
    go

    et j'obtiens toujours ceci :

    QUERY PLAN FOR STATEMENT 1 (at line 1).




    STEP 1
    The type of query is SET OPTION ON.


    Server Message: Number 3630, Severity 10
    Server 'TIT1_PAR_TST_SQL', Line 3:
    Total estimated I/O cost for statement 1 (at line 1): 0.




    QUERY PLAN FOR STATEMENT 2 (at line 2).




    STEP 1
    The type of query is SET STATISTICS ON.


    Server Message: Number 3630, Severity 10
    Server 'TIT1_PAR_TST_SQL', Line 3:
    Total estimated I/O cost for statement 2 (at line 2): 0.




    QUERY PLAN FOR STATEMENT 3 (at line 3).




    STEP 1
    The type of query is SET OPTION ON.


    Server Message: Number 3630, Severity 10
    Server 'TIT1_PAR_TST_SQL', Line 3:
    Total estimated I/O cost for statement 3 (at line 3): 0.


    Server Message: Number 7344, Severity 15
    Server 'TIT1_PAR_TST_SQL', Line 122:
    DECLARE CURSOR must be the only statement in a query batch.

    et ensuite plein de messages d'erreurs pour des variables non déclarées mais qui l'ont pourtant été dans la première partie du code...

    As-tu une idée ?

  6. #6
    Membre Expert

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    Est-ce que SQLAdvantage connait le "go" comme isql?

    Est-ce qu'il y a bien un "go" après le declare ... cursor, et PAS de declare ... cursor dans le batch suivant?

    Michael

Discussions similaires

  1. [T-SQL] Optimisation de proc
    Par Deedoo2000 dans le forum Sybase
    Réponses: 19
    Dernier message: 02/08/2006, 08h40
  2. [ASE][T-SQL] Optimisation d'un update
    Par metheorn dans le forum Sybase
    Réponses: 2
    Dernier message: 06/03/2006, 13h12
  3. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 16h01
  4. [SQL] optimisation
    Par s.grenet dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/05/2005, 11h57
  5. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52

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