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 :

[TSQL]optmiser une requete select


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [TSQL]optmiser une requete select
    Bonjour,
    Pouvez vous SVP,me dire ce qui cloche dans cette requete?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     select    a.colonne1, min(a.colonne2) 
    from    TABLE a
    where    a.colonne3 >= 1
    and a.colonne4 = 0
    and a.colonne5 not in ('5','8')
    and  a.colonne2 > (select    max(b.colonne2) 
                        from    TABLE b
                        where    b.colonne3 >= 1
                        and b.colonne4 <> 0
                        and b.colonne5 not in ('5','8')
                        and  b.colonne1 = a.colonne1)
     
    group by a.colonne1

    colonne2 --->type DATETIME
    TABLE contient environ 1.5Millions de ligne


    Merci de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    j'imagine qu'elle tourne longtemps ? si oui, êtes-vous allé jusqu'au bout ?

    bref, déjà les NOT IN impliquent un scan complet de la table.

    Est-ce que le "and a.colonne5 not in ('5','8')" est discriminant ou pas ?
    Est-ce que le "and a.colonne4=0 est discriminant ou pas ?
    Est-ce que le "and a.colonne3 >= 1 est discriminant ou pas ?

    Est-ce que le colonne1 est bien indexé ?

    il y a plusieurs pistes à regarder, la réécriture peut également être une solution.

    Y-a-t-il des index sur TABLE ?
    Emmanuel T.

  3. #3
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par kagemaru Voir le message
    bref, déjà les NOT IN impliquent un scan complet de la table.
    Non. a.colonne5 not in ('5','8') est interprété comme deux sargs, a.colonne5 <> 5 et a.colonne5 <> 8. L'optimiseur peut donc décider faire un non-matching index scan sur un index couvrant ayant pour première colonne colonne5, si l'un de ces sarg est le plus disciminant de tous. Sinon il peut bien sur utiliser un index sur une colonne d'un autre sarg.

    Pour le reste, je suis d'accord, il nous faut la liste des indexes, le plan d'exécution et les stats sur la table pour pouvoir vraiment t'aider, et
    avoir un index sur les colonnes présentes dans les sargs les plus discriminants est un bon départ. Réécrire en passant par une ou plusieurs tables temporaires pour aider l'optimiseur peut aussi aider.
    DBA sybase confirmé
    Cherche un poste sur Paris

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Non. a.colonne5 not in ('5','8') est interprété comme deux sargs, a.colonne5 <> 5 et a.colonne5 <> 8.
    Dans la mesure où tu as un index en effet.

    Dans le cas d'un nonmatching scan sur une grosse table, c'est en général peu performant, bien qu'un peu plus efficace qu'un scan de table.
    Emmanuel T.

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Désolé mais j'ai été absent un petit moment.Alors pour répondre à vos questions:
    1- la requete est effectivement tres tres longue,je n'ai pas eu la patience de la laisser finir.il existe en effet un index non clusterisé sur TABLE --> idx_table_02 (colonne1,colonne2) qui est pertinent pour la requete.
    j'ai meme essayé de forcer le plan d'xécution à prendre ne compte l'index dans la 1ere étape mais ,cela ne change rien...requete toujours aussi longue.

    ci dessous le plan d'exécution:

    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
     QUERY PLAN FOR STATEMENT 1 (at line 1).
     
     
        STEP 1
            The type of query is SELECT (into Worktable1).
            GROUP BY
            Evaluate Grouped MINIMUM AGGREGATE.
     
            FROM TABLE
                TABLE
                a
            Nested iteration.
            Table Scan.
            Forward scan.
            Positioning at start of table.
     
            Run subquery 1 (at nesting level 1).
            Using I/O Size 32 Kbytes for data pages.
            With LRU Buffer Replacement Strategy for data pages.
            TO TABLE
                Worktable1.
     
        STEP 2
            The type of query is SELECT.
     
            FROM TABLE
                Worktable1.
            Nested iteration.
            Table Scan.
            Forward scan.
            Positioning at start of table.
            Using I/O Size 32 Kbytes for data pages.
            With MRU Buffer Replacement Strategy for data pages.
        STEP 1
     
    NESTING LEVEL 1 SUBQUERIES FOR STATEMENT 1.
     
      QUERY PLAN FOR SUBQUERY 1 (at nesting level 1 and at line 6).
     
        Correlated Subquery.
        Subquery under an EXPRESSION predicate.
     
     
        STEP 1
            The type of query is SELECT.
            Evaluate Ungrouped MAXIMUM AGGREGATE.
     
            FROM TABLE
                TABLE
                b
            Nested iteration.
            Index : idx_table_02
            Backward scan.
            Positioning at index end.
            Scanning only up to the first qualifying row.
            Using I/O Size 4 Kbytes for index leaf pages.
            With LRU Buffer Replacement Strategy for index leaf pages.
            Using I/O Size 4 Kbytes for data pages.
            With LRU Buffer Replacement Strategy for data pages.
     
      END OF QUERY PLAN FOR SUBQUERY 1.
    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 293
    Points : 182
    Points
    182
    Par défaut
    Ben visiblement cela fait des table scan, donc n'utilise pas l'index en question ...
    si tu as créé l'index as tu fais un update stat de ta table?? ou alors l'index est pas positionné sur la bonne col.
    Je vois que cela, mais je suis pas un dev alors ...
    Bon courage
    A+

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    oui mais un scan table sur 1,5 million de lignes,c'est pas dramatique, non?
    l'index idx_table_02 sur colonne1 existe déjà depuis pas mal de temps, donc les update stats, on a en fait des paquets.
    bon ben, si qq'un voit une solution ou des ptits tuyaux pour re-ecrire la requete, je suis preneur...

    Merci.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 293
    Points : 182
    Points
    182
    Par défaut
    Ben moi un table scan sur 1,5 Million de lignes cela me semble beaucoup ... surtout que cela dépend de ta mémoire allouer à ASE plus les acces disk, as tu des baies ? du RAID ?? enfin il me semble qu'un index mieux positionné solutionnerai pas mal de choses !!! Fait des dump de stats avec optdiag et test la création d'autres indexes, update stat et en cas de gain null refais ton index d'origine, et reloa tes stats du début.
    Vila pour moi.
    A+

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 136
    Points
    136
    Par défaut
    la request est elle dépendante de la base sur le serveur?

  10. #10
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    En plus, des caches de 4K pour index et data, c'est pas des plus optimum à ma connaissance... j'ai plutôt l'habitude de laisser ça pour du log...
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  11. #11
    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
    Citation Envoyé par pagyles007 Voir le message
    Bonjour,
    Pouvez vous SVP,me dire ce qui cloche dans cette requete?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     select    a.colonne1, min(a.colonne2) 
    from    TABLE a
    where    a.colonne3 >= 1
    and a.colonne4 = 0
    and a.colonne5 not in ('5','8')
    and  a.colonne2 > (select    max(b.colonne2) 
                        from    TABLE b
                        where    b.colonne3 >= 1
                        and b.colonne4 <> 0
                        and b.colonne5 not in ('5','8')
                        and  b.colonne1 = a.colonne1)
     
    group by a.colonne1
    Quels sont les indexes existants sur TABLE ?

    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

  12. #12
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par fadace Voir le message
    En plus, des caches de 4K pour index et data, c'est pas des plus optimum à ma connaissance... j'ai plutôt l'habitude de laisser ça pour du log...
    Je pense que son serveur utilise des pages de 4K, comme l'indiquent les I/O de 32K (1 extent) lors du scan de la outer table.

    Sinon, que revoient les requêtes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT count(1) FROM TABLE a where a.colonne3 >= 1
    SELECT count(1) FROM TABLE a where a.colonne4 = 0
    SELECT count(1) FROM TABLE a where a.colonne5 NOT IN ('5','8')
    Un de ces search arguments (sarg) est peut être discriminant et un index sur l'une de ces colonnes pourrait être plus pertinant.

    Sinon, n'hésite pas à découper cette requête en plusieurs, et à utiliser des tables tempo, pour aider l'optimiseur.
    DBA sybase confirmé
    Cherche un poste sur Paris

Discussions similaires

  1. [VB6] Variable = Valeur d'une requete Select
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 23/01/2006, 14h40
  2. transformation sur une requete SELECT
    Par juniorAl dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/04/2005, 18h12
  3. Afficher le numéro de ligne dans une requete SELECT
    Par tilb dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/09/2004, 10h20
  4. [BDE & excel] la syntaxe d'une requete select
    Par mandale dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/08/2004, 15h38
  5. Eviter plusieurs OR dans une requete SELECT
    Par zoubidaman dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/06/2004, 05h56

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