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

Requêtes MySQL Discussion :

Performances d'une vue ?


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut Performances d'une vue ?
    Bien le bonjour,

    Je m'interroge sur la gestion des vues par MySQL.

    Si je définis une vue comme étant le résutat d'une requête comportant un count(), l'opération count() (très couteuse) sera-t-elle exécutée à chaque lecture de la vue ? N'y a-t-il pas de mécanisme d'optimisation de MySQL (cache ou autre) permettant d'éviter de réexécuter les count() à chaque lecture ?

    Merci de vos réponses.

  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 766
    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 766
    Points : 52 558
    Points
    52 558
    Billets dans le blog
    5
    Par défaut
    Les vues ne sont que des requêtes nommées. Le SELECT sous-jacent à la vue s'exécute donc à chaque interrogation.

    Certains SGBDR proposent des vues "matérialisées" ou "indexées. Mais comme il s'agit de techniques complexe, vous ne trouverez ce genre de chose que sur les gros SGBDR (Oracle, IBM DB2, MS SQL Server). En effet, il faut que le serveur soit capable de substituer à la volée la vue indexée en lieu et place de la requête ad-hoc, ce qui suppose des moteurs de haute volée, ce que n'est évidemment pas MySQL !

    petit exemple sous MS SQL Server (vous pouvez télécharger une version d'éval avec 180 jours d'essais) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- création des objsts du test dans la base temporaire
    USE tempdb;
    GO
     
    CREATE TABLE T_TEST
    (TST_DATE   DATE,
     TST_VALUE  INT,
     TST_DATA   CHAR(1000));
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- insertion de 100 000 lignes avec des valeurs aléatoires
    INSERT INTO T_TEST 
    SELECT DATEADD(DAY, CEILING(RAND()*366), 
           GETDATE()), RAND() * 100000,
           CAST(NEWID() AS VARCHAR(50))
    GO 100000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- création de la vue "classique"
    CREATE VIEW V_CLASSIQUE
    AS
    SELECT TST_DATE, SUM(TST_VALUE) AS SOMME
    FROM   T_TEST
    GROUP  BY TST_DATE
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET STATISTICS IO ON; --> demande l'affiche des statistiques de lecture
    GO
    SELECT *
    FROM   V_CLASSIQUE
    Table 'T_TEST'. Nombre d'analyses 5, lectures logiques 14293, lectures physiques 0...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- création de la vue indexable et de son index
    CREATE VIEW dbo.V_INDEXEE
    WITH SCHEMABINDING
    AS
    SELECT TST_DATE, SUM(TST_VALUE) AS SOMME, COUNT_BIG(*) AS NOMBRE
    FROM   dbo.T_TEST
    GROUP  BY TST_DATE
    GO
     
    CREATE UNIQUE CLUSTERED INDEX X
        ON dbo.V_INDEXEE (TST_DATE);
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- test de lecture de la vue
    SET STATISTICS IO ON;
    GO
     
    SELECT *
    FROM   dbo.V_INDEXEE
    Table 'V_INDEXEE'. Nombre d'analyses 1, lectures logiques 4, lectures physiques 0...

    Gain obtenu : 3500 fois plus rapide.

    CQFD !

    Plus étonnant, faisons la même requête qu'au départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET STATISTICS IO ON; --> demande l'affiche des statistiques de lecture
    GO
    SELECT *
    FROM   V_CLASSIQUE
    Table 'V_INDEXEE'. Nombre d'analyses 1, lectures logiques 4, lectures physiques 0...

    Vous ne rêvez pas... la requête sur la vue classique a été transformé mathématiquement par le moteur SQL en une requête sur la vue indexée pour bénéficier de l'optimisation fournit par cette dernière.
    Il s'agit en l'espèce d'un cas très simple. Mais comprenez qu'un tel effort de traduction pour des requêtes complexes soit une activité intense pour le moteur au moment de l'établissement de son plan de requête. En effet l'algo de base est exponentiel !


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

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

Discussions similaires

  1. Performance d'une vue indexée
    Par hunter_X dans le forum Développement
    Réponses: 15
    Dernier message: 25/04/2011, 21h12
  2. Probleme de performance sur une vue
    Par nomissamoht dans le forum Oracle
    Réponses: 1
    Dernier message: 06/03/2009, 14h51
  3. Problème de performance d'une vue
    Par Christophe Charron dans le forum Requêtes
    Réponses: 0
    Dernier message: 31/07/2008, 14h21
  4. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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