Exercice 2 : Requêtes SQL complexes
Problème guidé : Analyse et Optimisation de Requêtes SQL Complexes en Environnement Distribué
Section titled “Problème guidé : Analyse et Optimisation de Requêtes SQL Complexes en Environnement Distribué”Filière : MP / MPI
Matière : Informatique - Bases de données
Thème : Modélisation relationnelle, Algèbre relationnelle, Requêtes SQL complexes et Complexité algorithmique.
1. Énoncé du Problème
Section titled “1. Énoncé du Problème”Dans le cadre de la modernisation de son système d’information logistique, une entreprise internationale gère un catalogue de produits, des entrepôts répartis mondialement, ainsi que des flux de commandes. On souhaite concevoir et optimiser un module d’analyse de données capable de traiter des volumes importants (plus de lignes par table).
Le schéma relationnel de la base de données est le suivant (les clés primaires sont soulignées, les clés étrangères sont préfixées par un dièse #) :
Produit(,nom,categorie,prix_unitaire,poids)Entrepot(,nom,pays,capacite_max)Stock(\underline{\text{#id_produit, #id_entrepot}},quantite)Commande(\underline{\text{id_commande}},#id_client,date_commande,pays_destination)LigneCommande(\underline{\text{#id_commande, #id_produit}},quantite_commandée,prix_vente_effectif)
Ordres de grandeur et contraintes physiques
Section titled “Ordres de grandeur et contraintes physiques”- La table
LigneCommandecontient tuples. - La table
Produitcontient tuples. - La table
Stockcontient tuples. - Les pages disque ont une taille standard .
- L’indexation par défaut repose sur les clés primaires (arbres ).
2. Questions
Section titled “2. Questions”Partie I : Modélisation et Algèbre Relationnelle
Section titled “Partie I : Modélisation et Algèbre Relationnelle”- Exprimer en algèbre relationnelle (avec les opérateurs , etc.) la requête suivante : « Lister les noms des produits de la catégorie ‘Électronique’ qui ne sont stockés dans aucun entrepôt situé en ‘France’ ».
- Proposer une estimation théorique du coût (en nombre d’accès disque) d’une jointure par boucle imbriquée simple entre
ProduitetStocksi aucun index n’est disponible.
Partie II : Requêtes SQL Complexes
Section titled “Partie II : Requêtes SQL Complexes”- Écrire une requête SQL standard (SQL:1999+) qui retourne, pour chaque catégorie de produits, le nom du produit le plus cher (en termes de
prix_unitaire). En cas d’égalité de prix, tous les produits ex-aequo devront être affichés. Utilisez les fonctions de fenêtrage (window functions). - Écrire une requête SQL permettant d’identifier les « Entrepôts critiques », c’est-à-dire les entrepôts dont le taux d’occupation global (somme des quantités en stock par rapport à la
capacite_maxde l’entrepôt pondérée par le poids des produits) dépasse .
Partie III : Analyse critique et Optimisation
Section titled “Partie III : Analyse critique et Optimisation”- Soit la requête non optimisée cherchant le chiffre d’affaires total par pays de destination pour l’année 2023. Expliquer pourquoi l’utilisation de sous-requêtes corélées dans le
SELECTserait désastreuse en termes de complexité pour lignes. Proposer une écriture optimale avec les clauses de regroupement. - Esquisse d’analyse critique : Dans un système distribué où la table
LigneCommandeest fragmentée horizontalement par pays, discutez de la limite du modèle relationnel classique ACID face à la scalabilité horizontale (théorème CAP).
3. Pistes et Indications
Section titled “3. Pistes et Indications”- Q1 : Décomposez le problème en deux étapes : d’une part les produits électroniques, d’autre part les produits présents dans un entrepôt français, puis effectuez la différence ensembliste.
- Q3 : Pensez à la fonction de classement
RANK()ouDENSE_RANK()combinée avecPARTITION BY. - Q5 : Une sous-requête corélée évalue la condition pour chaque tuple, menant généralement à une complexité en . Un regroupement (
GROUP BY) bien indexé ramène le coût à ou .
4. Corrigé Pas à Pas
Section titled “4. Corrigé Pas à Pas”Partie I : Modélisation et Algèbre Relationnelle
Section titled “Partie I : Modélisation et Algèbre Relationnelle”1. Expression en algèbre relationnelle : Soit l’ensemble des produits électroniques, et les produits stockés en France.
- Le résultat final est la projection sur le nom : (Alternative plus directe avec l’anti-jointure ) : .
2. Coût de la boucle imbriquée simple :
Soit le nombre de pages de la relation . Sans index, pour chaque tuple de Produit (la relation externe), on doit parcourir toute la relation Stock (relation interne).
Le coût en nombre de blocs accédés est :
C’est prohibitif pour et grand. Les SGBD modernes utilisent des jointures par hachage (Hash Join) ou par fusion triée (Merge Join), ramenant la complexité à .
Partie II : Requêtes SQL Complexes
Section titled “Partie II : Requêtes SQL Complexes”3. Produit le plus cher par catégorie (avec fenêtrage) :
WITH ClassementPrix AS ( SELECT nom, categorie, prix_unitaire, RANK() OVER (PARTITION BY categorie ORDER BY prix_unitaire DESC) as rk FROM Produit)SELECT categorie, nom, prix_unitaireFROM ClassementPrixWHERE rk = 1;Note concours : L’utilisation de RANK() permet de gérer les ex-aequo (contrairement à ROW_NUMBER()).
4. Entrepôts critiques :
SELECT e.id_entrepot, e.nom, SUM(s.quantite * p.poids) AS charge_actuelle, e.capacite_maxFROM Entrepot eJOIN Stock s ON e.id_entrepot = s.id_entrepotJOIN Produit p ON s.id_produit = p.id_produitGROUP BY e.id_entrepot, e.nom, e.capacite_maxHAVING SUM(s.quantite * p.poids) > 0.85 * e.capacite_max;Partie III : Analyse critique et Optimisation
Section titled “Partie III : Analyse critique et Optimisation”5. Évite la sous-requête corélée :
Une sous-requête corélée exécutée dans le SELECT pour chaque ligne de commande va chercher un agrégat sur la table entière ou filtrée, ce qui induit une complexité temporelle désastreuse en dans le pire des cas.
Forme optimale par agrégation directe :
SELECT c.pays_destination, SUM(lc.quantite_commandée * lc.prix_vente_effectif) AS chiffre_affairesFROM Commande cJOIN LigneCommande lc ON c.id_commande = lc.id_commandeWHERE c.date_commande >= '2023-01-01' AND c.date_commande < '2024-01-01'GROUP BY c.pays_destination;Analyse: * Cette requête permet au SGBD d’utiliser un plan d’exécution linéaire (après indexation de date_commande), ramenant la complexité à liée au tri pour le regroupement (Hash Aggregate ou Stream Aggregate).
6. Analyse critique et Limites du modèle :
Dans un contexte distribué à grande échelle ( lignes), la fragmentation de LigneCommande par pays entre plusieurs nœuds pose le problème du Théorème CAP (Consistency, Availability, Partition tolerance).
- Si le système privilégie la cohérence forte (ACID traditionnel), les transactions réparties nécessitent des protocoles de verrouillage en deux phases (2PC) très coûteux en latence réseau.
- Pour des volumes massifs, les architectures se tournent vers des bases de données NoSQL ou des moteurs de type NewSQL (base distribuée avec horodatage vectoriel type TrueTime), acceptant parfois une cohérence éventuelle (eventual consistency) pour garantir la disponibilité sous partition réseau.