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

MS SQL Server Discussion :

Optimisation VIEW sur DATE


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 74
    Points : 58
    Points
    58
    Par défaut Optimisation VIEW sur DATE
    Bonjour à tous,

    Je travaille actuellement sur une grosse table ( > 1M lignes) et je souhaite faire une vues sur les ventes des 3 derniers mois :

    J'ai essayer plusieurs méthode :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CDDT > DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 3, 0))
    C'est sensé être propre mais c'est très long.


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CDDT > CASE WHEN (MONTH({ fn CURDATE() }) - 3) <= 0 THEN '01/' + CAST(12 - 3 + MONTH({ fn CURDATE() }) AS char(2)) 
                          + '/' + CAST(YEAR({ fn CURDATE() }) - 1 AS char(4)) ELSE '01/' + CAST(MONTH({ fn CURDATE() }) - 3 AS char(2)) + '/' + CAST(YEAR({ fn CURDATE() }) AS char(4)) END
    C'est moche mais plus rapide que la première.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CDDT > '01/07/2013'
    Forcement c'est le plus rapide mais je perd le coté dynamique.

    Actuellement je suis tombé sur un bon compromis pour exclure les années ultérieur sur lequel je veux pas faire de stats.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    CDDT > '01/01/2013' AND CDDT > DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 3, 0))

    Ça me parait pas top et je suis sur qu'il y a une meilleurs façon de faire.
    Ça eut paraitre futile de vouloir l'optimiser mais pour une requête de classification article cette vue est appelé 2000 fois donc chaque seconde compte

    Si quelque à des conseils je suis preneur.

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Et les indexes ?

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ça eut paraitre futile de vouloir l'optimiser mais pour une requête de classification article cette vue est appelé 2000 fois donc chaque seconde compte
    Cherchez surtout de ce côté la....
    Pourquoi l'appeler 2000 fois? une fois par article.

    Faites une seule requète, certes plus grosses mais dont le temps d'exec sera sensiblement inférieur à 2000 fois celle-ci.


    Peut-on voir le plan d'execution et la requète complete?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 74
    Points : 58
    Points
    58
    Par défaut
    Un index sur quel champ ? La date ? Je eut faire un index dans une vue ou je dois le mettre sur la table ?

    Pour la requête sur une classification ABC, pour chaque article je dois avoir la sommes des tous les articles qui se sont moins vendu donc on peut pas faire autrement,

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    1) postez la requête intégrale et les définitions de vues
    2) on peut faire des vues indexées.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 74
    Points : 58
    Points
    58
    Par défaut
    La requete resemble à ca :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ref, COUNT(qte)
    FROM mouv
    WHERE CDDT > DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 3, 0))
    GROUP BY ref

    Comment je peux faire un index sur la date ?

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Définition de la vue merci...

    Si vous créez un index sur la colonne date de la table par exemple l'éxecution de la vue en profitera...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 74
    Points : 58
    Points
    58
    Par défaut
    En regardant un peu les indexes présent sur la table, il y a a plusieurs qui sont des combinaisons de plusieurs champ.

    Par exemple INDEX_A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CE2	Croissant	char(1)
    DOS	Croissant	numeric(3,0)
    TICOD	Croissant	char(1)
    TIERS	Croissant	char(8)
    FADT	Croissant	date
    MOUV_ID	Croissant	int (c'est la cle de la table)
    Comment puis-je forcer l’exécution d'une recherche via un index ?
    Suis - je obliger de mettre tous les champs de l'index dans mon where pour qu'il soit appelé ?

Discussions similaires

  1. Optimisation WHERE sur date
    Par olibara dans le forum Développement
    Réponses: 7
    Dernier message: 13/11/2014, 10h03
  2. [Debutant(e)]operation sur dates
    Par sUrTr dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/10/2004, 15h58
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

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