Bonjour.

J'ai une question technique sur l'utilisation des vues par le SGBD. Si la réponse dépend du SGBD, prendre en compte le fait que j'utilise MySQL.

Je suis en train de créer des vues sur une nouvelle BDD en cours de création et je me demande si le SGBD peut prendre l'initiative de simplifier la vue selon l'interrogation qui est faite dessus ou s'il va systématiquement exécuter toute la vue à chaque fois qu'elle sera utilisée.

Voici une vue un peu peu complexe qui va donner un paquet d'informations sur les étudiants inscrits à un stage :
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
20
21
22
23
24
25
26
CREATE VIEW stamas.v_etudiant AS
SELECT e.etu_id_utilisateur AS id_etudiant,
    u.uti_login AS login_etudiant,
    u.uti_mot_passe AS mot_passe_etudiant,
    p.prs_nom AS nom_etudiant,
    p.prs_prenom AS prenom_etudiant,
    p.prs_adrel AS adrel_etudiant,
    p.prs_telephone AS tel_etudiant,
    e.etu_adresse AS adresse_etudiant,
    e.etu_id_concours AS id_concours_etudiant,
    c.ccr_libelle AS libelle_concours,
    e.etu_id_etablissement_origine AS id_etab_orig_etudiant,
    e1.etb_nom AS nom_etablissement_origine,
    s.stg_id AS id_stage,
    s.stg_id_etablissement AS id_etablissement_stage,
    e2.etb_nom AS nom_etablissement_stage,
    s.stg_date_debut AS date_debut_stage,
    s.stg_date_fin AS date_fin_stage
FROM t_etudiant_etu AS e
INNER JOIN t_utilisateur_uti AS u ON u.uti_id_personne = e.etu_id_utilisteur
    INNER JOIN t_personne_prs AS p.prs_id = u.uti_id_personne
INNER JOIN t_concours_ccr AS c ON c.ccr_id = e.etu_id_concours
INNER JOIN t_etablissement_etb AS e1 ON e1.etb_id = e.etu_id_etablissement_origine
LEFT OUTER JOIN t_etu_inscrire_stg_eis AS i ON i.eis_id_etudiant = e.etu_id_utilisteur
    LEFT OUTER JOIN t_stage_stg AS s ON s.stg_id = i.eis_id_stage
        LEFT OUTER JOIN t_etablissement_etb AS e2 ON e2.etb_id = s.stg_id_etablissement
Mais l'application peut avoir besoin d'informations partielles sur l'étudiant, par exemple avant qu'il soit inscrit à un stage, ce qui fait que des jointures seraient inutiles dans la vue. Ainsi, si je fais ensuite la requête ci-dessous, les jointures externes sont inutiles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
SELECT id_etudiant, login_etudiant, nom_etudiant, prenom_etudiant, libelle_concours, nom_etablissement_origine
FROM v_etudiant
Vaut-il mieux dans ce cas créer une vue plus simple ou le SGBD est-il capable de détecter que des jointures de la vue sont inutiles et ainsi simplifier le script de la vue ?

Comme je n'ai pas encore de données dans la BDD, je ne peux pas tester en réel mais un EXPLAIN de la requête dans MySQL semble considérer tous les index de toutes les tables.