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

Administration SQL Server Discussion :

Requête trop lente


Sujet :

Administration SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut Requête trop lente
    Bonjour,

    Je viens à vous car j'ai une requête qui, pour ma part, devrait s'exécuter relativement vite et qui met pourtant un temps considérable à s'exécuter...

    Voici la query :
    Code sql : 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
    USE Tickets;
    GO
     
    WITH T1(SIEGE,DATE,CAISSE,TICKET,EAN,PU,QT,CA,RAB,ESCP,CARTECLIENT)
    AS(
    SELECT
            siege,
            LaDate,
            caisse,
            ticket,
            eanart,
            pu,
            SUM(QT) AS 'QT',
            SUM(CA) AS 'CA',
            SUM(RAB) AS 'RAB',
            SUM(ESCP) AS 'ESCP',
            CARTECLIENT
    FROM
            dbo.tblTransactions
    WHERE
            date_dt between '20130701' and '20130702' 
        AND siege = '029'
        AND qt > 0
    GROUP BY
            siege,
            LaDate,
            caisse,
            ticket,
            eanart,
            PU,
            CARTECLIENT
    )
     
    SELECT
            B.*, A.*
    FROM
            T1 A
                INNER JOIN T1 B
                    ON    A.SIEGE = B.SIEGE
                    AND    A.DATE = B.DATE
                    AND A.CAISSE = B.CAISSE
                    AND A.TICKET = B.TICKET + 1
                    AND A.EAN = B.EAN
                    AND A.CARTECLIENT = B.CARTECLIENT
    ORDER BY
            A.SIEGE,
            A.DATE,
            A.CAISSE,
            A.TICKET

    Lorsque j'exécute uniquement la requête créant la CTE, j'ai le résultat en moins d'une seconde. Ca me semble fort qu'une auto jointure rallonge ainsi le temps d'exécution d'autant que la volumétrie de la CTE n'est pas grande (28671 lignes). C'est une vieille table et donc certains colonnes n'ont pas le type de donnée le plus judicieux mais tout de même. Voici le type de colonnes :

    • siege : char(3)
    • LaDate : datetime
    • caisse : char(3)
    • ticket : char(4)
    • eanart : char(13)
    • pu : money
    • qt : money
    • ca : money
    • rab : money
    • escp : money
    • carteclient : char(18)

    En pièce jointe, le plan d'exécution estimé.


    De plus, il semblerait (mais ce n'est encore qu'une supposition) que lorsque la requête tourne, certaine applications reçoivent des messages de time out lors d'exécution de procédure stockées. C'est donc assez ennuyeux^^
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Juste une idée comme ça, le type de ticket : char(4) alors que dans la jointure, le prédicat est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND A.TICKET = B.TICKET + 1
    Si cette colonne est en fait un entier, je pense qu'il serait judicieux de la "caster" dans la cte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH T1(SIEGE,DATE,CAISSE,TICKET,EAN,PU,QT,CA,RAB,ESCP,CARTECLIENT)
    AS(
    SELECT
            siege,
            LaDate,
            caisse,
            CAST(ticket AS INT),
            eanart,
    pour éviter de demander au moteur SQL de faire une double conversion implicite dans la jointure.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    C'est un fait !

    J'avais laissé comme ça pour ne pas appliquer de fonction sur la colonne de filtre histoire de conserver l'index mais cette jointure se fait au niveau de la CTE sur elle-même donc ça devrait être ok.

    Je vais donc tester.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Et hop, le résultat en une seconde.

    Comme quoi, ça ne tient pas à grand chose.

    [mauvaise foi on]Où alors c'est une coïncidence et le truc qui ralentissait mon serveur a fini de le ralentir[mauvaise foi off]

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    [mauvaise foi on]Où alors c'est une coïncidence et le truc qui ralentissait mon serveur a fini de le ralentir[mauvaise foi off]
    Il suffit de comparer les 2 plans d'exécutions

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut

Discussions similaires

  1. Optimisation de requêtes trop lentes..
    Par Nevrosl dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/03/2010, 13h38
  2. requête trop lente
    Par smaildba dans le forum SQL
    Réponses: 9
    Dernier message: 20/04/2009, 12h20
  3. Requête trop lente
    Par shadeoner dans le forum SQL
    Réponses: 11
    Dernier message: 23/05/2008, 10h24
  4. Requête trop lente, comment l'optimiser?
    Par getz85 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 29/01/2008, 13h40
  5. auto-killer une requête trop lente
    Par Nico57 dans le forum Oracle
    Réponses: 5
    Dernier message: 05/12/2006, 18h04

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