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

Développement SQL Server Discussion :

Choix entre deux requêtes


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 224
    Points : 443
    Points
    443
    Par défaut Choix entre deux requêtes
    Bonsoir le forum,

    Voici mon problème
    Je travaille sur SQL Server 2005 et dispose d’une table de ce type :


    Je souhaite obtenir une vue du type


    Où les ValeurProrataX valent ValeurX x Dividende / Diviseur.

    Faut-il mieux faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    	MaTable.Clef,
    	MaTable.Valeur1 * MaTable.Dividende / MaTable.Diviseur AS ValeurProrata1,
    	MaTable.Valeur2 * MaTable.Dividende / MaTable.Diviseur AS ValeurProrata2,
    	MaTable.Valeur3 * MaTable.Dividende / MaTable.Diviseur AS ValeurProrata3
    FROM
    	MaTable
    Ou passer par une vue intermédiaire :
    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
    /*	Vue "Ratios"	*/
    SELECT
    	MaTable.Clef,
    	MaTable.Dividende / MaTable.Diviseur AS Ratio
    FROM
    	MaTable
     
     
     
    SELECT
    	MaTable.Clef,
    	Ratios.Ratio * MaTable.Valeur1 AS ValeurProrata1,
    	Ratios.Ratio * MaTable.Valeur1 AS ValeurProrata2,
    	Ratios.Ratio * MaTable.Valeur1 AS ValeurProrata3
    FROM
    	MaTable,
    	Ratios
    WHERE
    	MaTable.Clef = Ratios.Clef
    J’ai l’impression que malgré la jointure, la deuxième solution fait moins d’opérations que la première.
    Il faut également savoir que j’ai une quinzaine de Valeurs et que le calcul du Ratio est plus complexe qu’une simple division (traitement à base de dates).

    Le volume de données traitées ne sera pas important, et les deux solutions pourraient fonctionner, mais je me demandais quel était la meilleure ??


    Merci d’avance et bonne soirée
    Images attachées Images attachées   

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Juste histoire de faire mon chieur, je te conseillerais plutôt des colonnes calculées.

    http://blogs.msdn.com/b/sqlcat/archi...rformance.aspx

    Les gros avantages :
    - Pas d'objet supplémentaire. Tes colonnes calculées sont directement présentes dans ta table.
    - La valeur peut être persitante (mot clé PERSISTED). Le calcul n'est alors effectué qu'une seule fois, puisque la valeur (mais mise à jour si la ligne est mise à jour).
    - La valeur persistante est indexable, et là le gain est alors double.

    Niveau inconvénients :
    - La valeur étant persistante, elle prend évidement un peu de place
    - Dans une clause INSERT, tu te retrouves avec des colonnes qu'il ne faut pas alimenter (ou alors les traiter convenablement par trigger)
    - Si une colonne calculée de la table fait appel à une fonction UDF, alors les requêtes sur la table ne sont plus parallélisables
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    je te conseillerais plutôt des colonnes calculées.
    Pas dispo avec SQL-Server 2005.

    @mromain, je pense que la première solution est toujours la meilleure.
    Au pire, vous pouvez rajouter une vue entre les deux qui va stocker la formule de calcul en plus des autres colonnes, et faire la requête pas dessus qui va simplifier la requête finale. Mais en interne, le moteur va la réécrire comme la première requête.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pas dispo avec SQL-Server 2005.
    Je viens de tester sur un SQL2005 Standard SP4 et si, les colonnes calculées sont disponibles.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Au temps pour moi, j'étais persuadé que c'était arrivé en 2008 !

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 224
    Points : 443
    Points
    443
    Par défaut
    Bonsoir à tous,

    Merci pour ces réponses.
    J'ai pas mal de lecture qui m'attend du coup

    Je vais donc creuser les colonnes calculées.

    Bonne soirée

Discussions similaires

  1. choix entre deux champs
    Par fisto dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2008, 13h47
  2. [Requête]Problèmes de nombre d'enregistrements entre deux requêtes
    Par Paul Gasser dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/03/2007, 12h20
  3. Addition entre deux requêtes
    Par tazmania dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2006, 17h17
  4. Différence entre deux requêtes
    Par viny dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/10/2006, 16h28
  5. Choix entre deux champs dans une requete
    Par Pico10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/07/2005, 15h36

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