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 :

[SQL Server] Table ou vue?


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut [SQL Server] Table ou vue?
    Bonjour,

    Je vous explique. Mon chef - qui a une bonne expérience du SQL mais qui n'est en aucun cas DBA administrator - m'a lancé sur un projet. Tout part d'une table qui contient les logs d'un serveur web (pas les logs W3C, quelque chose d'un peu plus évolué).

    Mon chef souhaite que je créé une autre table (totalement indépendante du reste de la base) qui traite ces logs pour en tirer des statistiques, chaque ligne représentant un mois, et chaque colonne un "type de média" (CD, vidéo..., mais ça n'a pas grande importance).

    Je lui ai proposé de faire plutôt une vue, puisque les données contenues dans cette table de statistiques sont redondantes, et que la table n'est reliée à rien. En effet, on m'a appris qu'une base de données ne devaient pas contenir de données "calculées", et théoriquement si la base est cohérente, il ne devrait pas y avoir ce genre de table indépendante.

    Mais mon chef redoute la charge que créerait cette vue à chaque appel, alors qu'une table fixe ne nécessiterait que le calcul d'une nouvelle ligne chaque fin de mois. Moi je pensais que les vues étaient faites pour ça.

    Alors qui a raison?

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    LEs 2 discours se tiennent

    Quel sera la fréquence d'accès à cette table/vue ?

    Quel est le SGBD utilisé ?

  3. #3
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Quel sera la fréquence d'accès à cette table/vue ?
    Très faible. C'est une table ou vue qu'on consulte une fois de temps en temps pour voir l'évolution de l'utilisation de notre site web. Justement je me demandes : est-ce qu'une vue est recalculée à chaque nouvelle ligne entrée dans la table de départ (c'est-à-dire très très souvent) ou juste quand on fait un SELECT dessus?
    Citation Envoyé par qi130 Voir le message
    Quel est le SGBD utilisé ?
    SQL Server 2000.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par strat0 Voir le message
    Justement je me demandes : est-ce qu'une vue est recalculée à chaque nouvelle ligne entrée dans la table de départ (c'est-à-dire très très souvent) ou juste quand on fait un SELECT dessus?
    Une vue ne contient pas de données. Elle est calculée à chaque fois qu'on fait un SELECT dessus, et seulement pour la partie interrogée.

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Il me semble que les vues matérialisées d'Oracle n'obéissent pas à cette règle...

    Mais bon, puisqu'Oracle n'est pas dans la course.... et vu le cahier des charges, une vue est à privilégier.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Il me semble que les vues matérialisées d'Oracle n'obéissent pas à cette règle...
    Yep. C'est pourquoi ce ne sont pas des vues, mais des tables avec diverses conditions de rafraîchissement.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    Les vues matérialisées en Oracle existent aussi en SQL Server (à partir de la version 2000 je crois). Mais en MS SQL, on les nommes vues indexées.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Tout à fait juste !

  9. #9
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Est-ce que dans mon cas il y a un quelconque intérêt à faire une vue indexée, sachant que la plupart des lignes, celles des mois précédents, ne bougeront pas, et que seule celle du mois en cours évoluera parallèlement aux requêtes sur le serveur web?

    En tout cas merci à tous, c'est diablement intéressant.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    oui, les vues indexées permettent d'éviter tous les recalculs.

    Attention cependant aux restrictions de construction des vues indexées :
    1) déterminismes
    2) calculs exacts
    et un certains nombre d'autres choses.

    Bref, il faut trouver le bon compromis.

    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/ * * * * *

  11. #11
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Bonjour,

    je relance ce sujet parce que j'envisage éventuellement de mettre à exécution cette solution de vue indexée, mais je me demande de plus en plus s'il n'y a pas eu un malentendu sur ce que je cherche à faire.

    Voilà ce que la vue devrait afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ---------------------------------------------------------
    | Période        | TypeMedia1 | TypeMedia2 | TypeMedia3 |
    ---------------------------------------------------------
    | Janvier 2007   | 320        | 589        | 141        |
    ---------------------------------------------------------
    | Février 2007   | 117        | 879        | 23         |
    ---------------------------------------------------------
    | Mars 2007      | 228        | 322        | 454        |
    ---------------------------------------------------------
    | Mois en cours  | 37         | 22         | 114        |
    ---------------------------------------------------------
    Seule la ligne 'Mois en cours' serait effectivement calculée, les autres mois étant révolus, leurs données ne changeraient plus.

    Or un index, qu'on le pose sur une vue ou sur une table, se pose sur une colonne, pas une ligne. C'est là que j'ai un peu de mal.

    Sans compter que la requête de la vue serait sans doute à rallonge, puisqu'elle tire ses informations d'une table ressemblant à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -------------------------------------------
    | id    | DateRecord          | NomMedia   |
    -------------------------------------------
    | 12345 | 03/03/2008 14:22:54 | TypeMedia1 |
    -------------------------------------------
    | 12346 | 03/03/2008 14:23:05 | TypeMedia3 |
    -------------------------------------------
    | 12347 | 03/03/2008 14:23:25 | TypeMedia1 |
    -------------------------------------------
    | 12348 | 03/03/2008 24:23:53 | TypeMedia2 |
    -------------------------------------------
    Ça suppose donc que je calcule comment se nomme le mois pour chaque mois que je vais effectivement isoler (en remontant jusqu'à novembre 2005).

    (C'est le log de visionnage de "médias" sur un serveur web pour info)

    Alors est-ce qu'avec ces nouvelles informations vous pensez toujours qu'une vue indexée soit une solution envisageable?

    Merci d'avance pour vos lumières.

  12. #12
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    pour ma part je ferais une table finale
    ---------------------------------------------------------
    | Période | TypeMedia1 | TypeMedia2 | TypeMedia3 |
    ---------------------------------------------------------
    | Janvier 2008 | 320 | 589 | 141 |
    ---------------------------------------------------------
    | Février 2008 | 117 | 879 | 23 |
    ---------------------------------------------------------
    | Mars 2008 | 228 | 322 | 454 |
    ---------------------------------------------------------
    | Avril 2008 | 37 | 22 | 114 |
    ---------------------------------------------------------
    avec un trigger sur la table générique
    -------------------------------------------
    | id | DateRecord | NomMedia |
    -------------------------------------------
    | 12345 | 03/03/2008 14:22:54 | TypeMedia1 |
    -------------------------------------------
    | 12346 | 03/03/2008 14:23:05 | TypeMedia3 |
    -------------------------------------------
    | 12347 | 03/03/2008 14:23:25 | TypeMedia1 |
    -------------------------------------------
    | 12348 | 03/03/2008 24:23:53 | TypeMedia2 |
    -------------------------------------------
    du type
    create trigger ttt on table_generique for insert as
    begin
    declare @nommedia varchar(50)

    if not exists (select 1 from table_finale where Période=convert(varchar,getdate(),102) ) -- le format n'est pas le bon a vérifier
    insert into table_finale select convert(varchar,getdate(),102),0,0,0

    select @nommedia = NomMedia from inserted

    if @nommedia =TypeMedia1
    update table_finale set TypeMedia1=TypeMedia1+1
    where Période=convert(varchar,getdate(),102)

    if @nommedia =TypeMedia2
    update table_finale set TypeMedia2=TypeMedia2+1
    where Période=convert(varchar,getdate(),102)


    ...

    end

  13. #13
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Sans vouloir t'offenser je crois que c'est la pire solution qu'on m'ait proposée. Il y a énormément d'enregistrements qui sont faits dans la table qui logue les médias visionnés. Utiliser un tel trigger serait donc probablement une très lourde charge pour la base.

  14. #14
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    pour ton info
    j'ai une appli industrielle de logistique où je récupère grace a des lecteurs codes barres le déplacement de colis sur un tapis de transitique.
    250 lecteurs sur le chemin, une centaine de colis en permanence sur le tapis.
    Au résultat, une centaine de lectures par seconde => vu les données de ta table tu en a au max 5/secondes.
    J'enregistre le CB,l'heure,l'ID du lecteur dans une table comme toi.
    J'ai un trigger qui vient remplir une autre table pour dire où est un colis a l'instant T( je résume).
    Cela fait 4ans que cela tourne a 8 000 000 d'enregistrements/jours
    Ca se saurait si ca ralentissait la base

  15. #15
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    OK, merci. Je note que c'est une autre solution envisageable.

    Mais je voudrais vraiment savoir si une vue indexée serait possible dans mon cas.

  16. #16
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut vues indexées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    OK, merci. Je note que c'est une autre solution envisageable.
     
    Mais je voudrais vraiment savoir si une vue indexée serait possible dans mon cas.
    Je pense que tu devrais écouter serge.

    On me contredira si je me trompe, mais la vue indexée, est une technique possible uniquement sur sql server 2000 enterprise ( ou developer ).

  17. #17
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Ça tombe bien j'utilise SQL Server 2000 Entreprise.

    Je ne suis pas certain de mettre en place au final la méthode des vues indexées, mais je souhaite vraiment savoir si elle est possible ou non dans ce cas précis. C'est pour un rapport de stage.

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    On me contredira si je me trompe, mais la vue indexée, est une technique possible uniquement sur sql server 2000 enterprise ( ou developer ).
    NON ylarvor...

    Les vues indexées sont disponibles dans toutes les versions sauf peut être MSDE/Express.

    La seule différence c'est l'automatisation de la substitution de la requête à la vue qui n'est disponible que dans la version Entreprise.

    Lisez l'article que j'ai écrit sur l'indexation. la méthode la plus pointue en matière de perf est la vue indexées.
    http://www.sqlspot.com/INDEXATION-un...l-exemple.html

    Alors est-ce qu'avec ces nouvelles informations vous pensez toujours qu'une vue indexée soit une solution envisageable?
    OUI strat0...

    En effet la vue indexée sera beaucoup plus performante que la solution à base de trigger.

    Mais attention, vos données numériques doivent être de type DECIMAL et non FLOAT, sinon vous risquez des erreurs d'écarts d'arrondis. En effet plutôt que de recalculer tous les agrégats, la vue indexées procède par replâtrage... tant est si bien qu'en cas d'usage d'un réel imprécis, il se peut que le calcul dévie de la réalité. C'est aussi pourquoi les vues indexées sont beaucoup plus rapide que la solution avec trigger !

    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/ * * * * *

  19. #19
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Mais attention, vos données numériques doivent être de type DECIMAL et non FLOAT, sinon vous risquez des erreurs d'écarts d'arrondis.(...)
    Les données calculées sont de type INT. Il n'y a pas de pourcentages calculés.

    Merci pour ta réponse mais le point que j'aimerais vraiment que tu éclaircisses pour moi, c'est comment "fixer" des lignes d'une vue avec des index puisque par définition des index se posent sur des colonnes. Ou alors je pose justement l'index clusterisé sur toutes les colonnes?

    Il y a là un concept qui m'échappe vraiment...

  20. #20
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    strat0 :
    -il y a un exemple d'index cluster pour une vue dans le tutorial de sql pro.


    sql pro : Pour ma défense, la doc microsoft semble préciser que les vues indexées sont une fonctionnalité de entreprise.

    exemple :

    Résumé : Ce document décrit une nouvelle fonctionnalité de SQL Server 2000 Enterprise Edition, les vues indexées. Outre une explication de ces vues, vous y trouverez des scénarios illustrant les améliorations qu'elles peuvent apporter aux performances.
    document de référence : http://msdn2.microsoft.com/fr-fr/lib...edviews_topic1

    Christian Robert, est d'accord avec vous, sur le fait que la vue indexée est possible sur toute les versions [ y compris express ] sous certaines conditions.

    Apres lecture de cet article, je comprend mieux ce que vous vouliez dire... il semble quand même que sur une version non Enterprise, pour appeler une vue indexée, il faut ajouter à la requête la commande WITH(NOEXPAND).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT*FROM v1 WITH(NOEXPAND)
    Yann.

Discussions similaires

  1. [SQL Server] Table cachée
    Par Riwalenn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2007, 09h08
  2. Réponses: 1
    Dernier message: 07/06/2007, 17h04
  3. Projet ADP + SQL Server : tables en lecture seule
    Par hannii dans le forum Access
    Réponses: 8
    Dernier message: 09/03/2007, 14h16
  4. Réponses: 2
    Dernier message: 27/12/2006, 13h31
  5. [SQL SERVER] Table contient trop d'enregistrements ?
    Par Tankian dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/08/2004, 10h40

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