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 :

Requête indexée - sous requête


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut Requête indexée - sous requête
    Bonjour à tous,

    Quelle est la solution pour faire une vue indexée depuis une requête comprenant une sous requête ?

    J'ai essayé plusieurs techniques mais je n'y arrive pas ?

    Faudrait il partir sur une table "consolidée" qui contiendrait déja le max(version) ?

    Solution avec sous requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    CREATE VIEW v_frequence30
    AS
       SELECT i.datepoint30,
              sum (ISNULL (freq.frequence,0) / 30) AS freq_30mn, COUNT_BIG(*) as count
       FROM frequence freq
            INNER JOIN interval_1mn i ON i.datepoint = freq.datepoint
       WHERE freq.dateversion in (SELECT max(dateversion) FROM frequence freq1 where freq1.datepoint=freq.datepoint)
       GROUP BY i.datepoint30
    GO
    Solution avec un JOIN:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT i.datepoint30,
           sum (ISNULL (freq.frequence, 0) / 30) AS freq_30mn,
           COUNT_BIG (*) AS count
    FROM frequence freq
         INNER JOIN interval_1mn i ON i.datepoint = freq.datepoint
         INNER JOIN (SELECT max (dateversion) AS dateversion, datepoint
               FROM frequence
               GROUP BY datepoint) AS maxfreq
            ON     maxfreq.dateversion = freq.dateversion
               AND maxfreq.datepoint = freq.datepoint
    GROUP BY i.datepoint30

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Je suppose que vous essayez de résoudre un problème de performance, identifiez déjà où les ressources sont consommés avec un plan d'exécution.
    Vous pouvez également testez la requête avec les fonctions de fenêtrage et le cross apply.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 820
    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 820
    Points : 52 888
    Points
    52 888
    Billets dans le blog
    5
    Par défaut
    Pour qu'une vue indexée puisse être créée, il faut impérativement un surjection entre les valeurs de l'ensemble de départ (requête alimentant la vue) et la vue cible. Or la surjection n'est pas assurée quand il y a :
    • des jointures externes
    • des sous requêtes
    • des opérations enemblistes (UNION, INTERSECT, EXCEPT)
    • des groupements (DISTINCT, GROUP BY)
    • des informations non déterministes
    • etc...


    C'est marqué dans le doc... Il suffit de la lire !
    https://learn.microsoft.com/fr-fr/sq...l-requirements

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

  4. #4
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut
    J'ai lu, et j'ai bien saisi ou était le problème.

    D'ou ma question, faut il créer une table intermédiaire qui contient déja le résultat de la sous-requête, de sorte à la supprimer dans la vue.
    Et ainsi je pourrai faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    CREATE VIEW v_frequence30
    AS
       SELECT i.datepoint30,
              sum (ISNULL (freq.frequence,0) / 30) AS freq_30mn, COUNT_BIG(*) as count
       FROM frequence_consolid freq
            INNER JOIN interval_1mn i ON i.datepoint = freq.datepoint
       WHERE freq.dateversion in (SELECT max(dateversion) FROM frequence freq1 where freq1.datepoint=freq.datepoint)
       GROUP BY i.datepoint30
    GO

  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 820
    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 820
    Points : 52 888
    Points
    52 888
    Billets dans le blog
    5
    Par défaut
    En supposant que vous mettez tous vos objets dans le schéma SQL dbo (ce qui est stupide...) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE VIEW dbo.v_frequence30
    WITH SCHEMABINDING
    AS
       SELECT i.datepoint30, freq.dateversion, 
              sum (ISNULL (freq.frequence,0) / 30) AS freq_30mn, COUNT_BIG(*) as count
       FROM   dbo.frequence_consolid AS freq
              INNER JOIN dbo.interval_1mn AS  
                 ON i.datepoint = freq.datepoint
       GROUP  BY i.datepoint30, freq.dateversion;
    GO
     
    CREATE UNIQUE CLUSTERED INDEX XV 
       ON dbo.v_frequence30 (atepoint30, dateversion)
    GO
    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/ * * * * *

Discussions similaires

  1. problème avec z-index sous firefox ???
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/09/2005, 20h39
  2. Réponses: 1
    Dernier message: 11/08/2005, 17h33
  3. Probleme définition d'index sous Paradox
    Par zinaif dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/06/2005, 10h38
  4. comment s'incremente un index sous oracle ?
    Par elitol dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/07/2004, 16h16
  5. Les index sous Sybase
    Par Emdis dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 02/06/2003, 15h21

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