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 2000] Gestion des droits, vues ou fonction et performances


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut [SQL SERVER 2000] Gestion des droits, vues ou fonction et performances
    Bonjour,

    Je suis novice avec SQL Server et j'aurais une petite question concernant les performances d'une idée ...

    J'ai une table TOTO, contenant beaucoup d'enregistrements.
    Chaque enregistrement de la table TOTO possède 2 champs de "droit".

    J'ai également une table UTILISATEUR, contenant mes utilisateurs et je peux, avec d'autres tables récupérer les 2 champs de droit.

    Je souhaites récupérer, pour un utilisateur, l'ensemble de ses données TOTO (restreint avec 1 des 2 champs "droit").

    Je pensais faire une vue utilisant toutes les tables avec les liaisons.
    Le nombre d'enregistrement de cette vue serait la somme des utilisateurs - TOTO.
    C'est à dire qu'elle contiendrait autant d'enregistrement que j'ai de liaison utilisateur - TOTO.

    Ensuite, lorsque je ferais une requetes, j'aurais juste a faire un where ID_utilisateur = 127.

    Seulement j'ai un peu peur sur les performances.
    SQL Server construit il d'abord l'intégralité de la vue avant d'appliquer le where ou part il du where pour construire les données de la vue ?


    Sinon, je pensais peut etre faire une fonction me renvoyant des tuples (en supposant que c'est possible).


    En espérant que vous aurez pu me comprendre, quelqu'un aurait il un avis, une solution ?

    Merci d'avance
    Worldofdada

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    une seule requete sera toujours 10, 100 ou 1000 fois plis rapide que tout qutre code.

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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    Imaginons que j'ai une table CLIENT.
    Un utilisateur connecté peut voir certains clients, par rapport a ses restrictions.

    Si je fais une vue vClient, j'aurais en contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    idClient1   nomClient1   adresseClient1   utilisateur1
    idClient2   nomClient2   adresseClient2   utilisateur1
    idClient3   nomClient3   adresseClient3   utilisateur1
    idClient1   nomClient1   adresseClient1   utilisateur2
    idClient2   nomClient2   adresseClient2   utilisateur2
    idClient2   nomClient2   adresseClient2   utilisateur3
    Le nombre d'enregistrements de cette vue sera la somme de tous les clients visibles pour tous les clients.

    Si l'utilisateur 1 se connecte, il me reste plus qu'a appeler la vue avec un WHERE utilisateur = utilisateur1.

    Pour ce cas de figure, ma question est :
    SQL Server va t'il reconstruire intégralement la vue avant d'appliquer le where ?
    Ou le construction de la vue va directement tenir compte de mon where ?


    Car dans le 1er cas, SQL Server va devoir construire une vue de plusieurs centaines de milliers d'enregistrements.
    Dans le 2eme cas, il ne construit la vue avec seulement mes 3 enregistrements.

    Savez vous comment fonctionne SQL Server afin de savoir si cette méthode est viable ou non ?
    En gros, puis je utiliser cette méthode, où dois je faire une seule requete (la vue me permet de décomposer cette meme requete en 2 petites) ?

    Merci

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Revisez vos cours ou apprenez SQL, il n'y a pas de donnees dans une vue !

    Que vous fassiez une requete directe ou une vue, c'est la meme chose. Les donnes sont dans les tables et nulle part ailleurs !

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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    Je pense que tu ne comprends pas du tout ma question.

    Je sais très bien qu'il n'y a aucune donnée dans une vue.
    Ma question n'a rien a voir avec du SQL mais uniquement avec SQL Server.
    Je ne demande pas comment faire, je demande simplement la méthode de fonctionnement de SQL Server.

    Quand on appelle, dans une requete, une vue : SQL Server CONSTRUIT la vue (j'ai bien dit construit, et pas rempli)

    En admettant avoir une vue nommé vCLIENT_RECENTS.
    La vue contient tous les clients ajoutés il y a moins de n jours.

    Si je fais SELECT * FROM vCLIENT_RECENTS WHERE ID_Client = 5 :
    1 - est ce que la vue va etre CONSTRUITE avec tous les enregistrements de la vue PUIS filtrée avec la contrainte ID_client = 5 ?
    2 - est ce que la vue va etre directement CONSTRUITE avec la contrainte ID_client = 5 ?

    Mon exemple est stupide mais ce n'est pas la question posée.
    C'est un exemple, et ca n'a rien avoir avec mon cas d'utilisation.

    C'est une question sur les performances de SQL Server, pas sur du SQL.

    Encore merci
    Worldofdada

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    J'ai fais un test mais j'ai pas vu de réelle différence ... mais j'étais en local.

    Quelqu'un n'a pas de réponse ?
    Merci

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Selon moi (et seulement moi...) un where sur une vue n'est pas une bonne solution sur des tables volumineuses... il est obligé de l'exécuter en deux fois... forcément.

    Pourquoi ne fais-tu pas une procédure stockée avec comme paramètre ton utilisateur ? Cela te permettrais de l'ajouter directement dans ton select.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create procedure maPS @user int as
    SELECT * 
    FROM CLIENT 
    inner join DROIT on dr_Client = ID_Client
    WHERE ID_Client = @user
    Si l'utilisation d'une procédure ne te gêne pas, passe par là, tu y gagnera toujours en perf !

    Et pour rebondir sur l'une des réponses plus haut... de SQLpro
    une seule requete sera toujours 10, 100 ou 1000 fois plis rapide que tout qutre code.
    Qu'entends-tu par 'une seule requête' ?

    Parce que, pour l'avoir testé, l'utilisation de tables temporaires s'avère beaucoup plus performant que des select imbriqués, par exemple...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    IL N'Y A ACUCUNE DIFFERENCE EN MATIERE D'EXECUTION ENTRE UNE VUE ET UNE REQUÊTE ...
    est-ce clair ?

    que vous fassiez le fitre sur la table ou sur la vue le plan d'exécution est le même.

    Encore une fois il n'y a pas de matérialité dans une vue, c'est une requête SQL à laquelle, si l'on applique des filtres, viendront se rajouter lesdits filtres !

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

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    Ok merci

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Euh... Oui c'est clair...

    Mais je ne comprends pas ton acharnement (sans vouloir te brusquer) à répondre à côté des questions ou problèmes exposés.

    Je ne remet pas en cause ce que tu nous explique... je sais très bien qu'il n'y a aucune différence entre une vue et un select...

    Ceci dit une procédure stockée permet de faire beaucoup plus de choses qu'une vue... et de ce point de vue là (sans jeux de mots... ), si le select s'avère tordu... il est plus performant de faire plusieurs "select" simples en remplissant des tables temporaires pour "in fine" selecter les tables temporaires en résultat de la procédure.

    Encore une fois, je ne veux agacer personne, surtout pas SQLpro dont je connais la qualité en matière SQL. Je fais juste part de ce que j'ai pu constater lors de mon travail.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL Server 2005 - Gestion des droits
    Par nin33 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/11/2008, 21h15
  2. [SQL Server 2000] Source ODBC - Droits utilisateurs
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/04/2008, 09h41
  3. Réponses: 5
    Dernier message: 30/05/2007, 18h08
  4. SQL Server 2005 gestion des priorités
    Par snouille dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/11/2006, 14h13
  5. Réponses: 9
    Dernier message: 28/07/2006, 17h38

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