Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
cnam:nfp107:seance10 [2023/04/22 15:38] – créée jcheron | cnam:nfp107:seance10 [2023/04/22 21:06] (Version actuelle) – [Index] jcheron | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Séance 10 : Interrogation de données - Optimisation ====== | ====== Séance 10 : Interrogation de données - Optimisation ====== | ||
- | Plan d' | + | ====== |
Une requête SQL est déclarative (Elle détermine le Quoi ?). | Une requête SQL est déclarative (Elle détermine le Quoi ?). | ||
Elle n' | Elle n' | ||
Ligne 7: | Ligne 8: | ||
Dans un SGBD le programme qui exécute une requête est appelé plan d’exécution. | Dans un SGBD le programme qui exécute une requête est appelé plan d’exécution. | ||
Ce plan d' | Ce plan d' | ||
+ | |||
+ | //TODO image// | ||
Source : sys.bdpedia.fr | Source : sys.bdpedia.fr | ||
- | Choix du plan d' | + | ===== Choix du plan d' |
- | Plan logique | + | |
- | Notations | + | ==== Plan logique |
- | Selection | + | |
+ | === Notations | ||
+ | |||
+ | __Selection | ||
La selection travaille sur R et definit une relation qui ne contient que les tuples de R qui satisfont à la condition (ou prédicat) specifiée. | La selection travaille sur R et definit une relation qui ne contient que les tuples de R qui satisfont à la condition (ou prédicat) specifiée. | ||
- | σ predicat (R) | + | <sxh ; |
- | ... FROM R WHERE predicat | + | <sxh sql; |
- | Projection | + | |
+ | __Projection | ||
La projection travaille sur R et definit une relation restreinte à un sous-ensemble des attributs de R, en extrayant les valeurs des attributs specifiés et en supprimant les doublons. | La projection travaille sur R et definit une relation restreinte à un sous-ensemble des attributs de R, en extrayant les valeurs des attributs specifiés et en supprimant les doublons. | ||
- | Projection : π a1,...,ak (R) | + | <sxh ; |
- | SELECT a1,...,ak FROM R | + | <sxh sql; |
- | Jointure | + | |
+ | __Jointure | ||
La theta-jointure définit une relation qui contient les tuples qui satisfont le predicat P du produit cartesien de R et S. Le predicat P est de la forme R.aiθS.bj où θ est l’un des operateurs de comparaison ( <, | La theta-jointure définit une relation qui contient les tuples qui satisfont le predicat P du produit cartesien de R et S. Le predicat P est de la forme R.aiθS.bj où θ est l’un des operateurs de comparaison ( <, | ||
- | θ-join : R ⋈ predicat S | + | <sxh ; |
- | FROM R INNER JOIN S on predicat | + | <sxh sql; |
- | Exemple | + | |
- | Requête : | + | |
+ | === Exemple === | ||
+ | |||
+ | __Requête :__ | ||
+ | <sxh sql; | ||
SELECT titre FROM Film f INNER JOIN Role r on r.idFilm=f.id WHERE f.annee=1995 AND r.nom_role=' | SELECT titre FROM Film f INNER JOIN Role r on r.idFilm=f.id WHERE f.annee=1995 AND r.nom_role=' | ||
- | Représentation algébrique | + | </ |
+ | |||
+ | __Représentation algébrique__ | ||
+ | |||
+ | //TODO image// | ||
Le SGDB et l' | Le SGDB et l' | ||
- | Il est impossible/ | + | |
+ | <wrap important> | ||
Heuristique classique : réduire au plus tôt la taille des données | Heuristique classique : réduire au plus tôt la taille des données | ||
- | en filtrant les nuplets par des sélections | + | * en filtrant les nuplets par des sélections |
- | en les simplifiant par des projections | + | |
- | Illustration de la recherche du plan logique optimal | + | |
+ | === Illustration de la recherche du plan logique optimal | ||
Séparation des sélections : | Séparation des sélections : | ||
+ | |||
+ | //TODO image// | ||
Application des sélections aux tables concernées : | Application des sélections aux tables concernées : | ||
+ | |||
+ | //TODO image// | ||
Principes essentiels : | Principes essentiels : | ||
- | L’algèbre permet d’obtenir une version opératoire de la requête. | + | - L’algèbre permet d’obtenir une version opératoire de la requête. |
- | Les équivalences algébriques permettent d’explorer un ensemble de plans. | + | |
- | L’optimiseur évalue le coût de chaque plan. | + | |
De manière | De manière | ||
- | Heuristique : l' | + | * Heuristique : l' |
- | Incomplète : Reste à l' | + | |
- | Plan physique | + | |
+ | ==== Plan physique | ||
Le plan physique consiste pour l' | Le plan physique consiste pour l' | ||
Notion d' | Notion d' | ||
- | Bloquants => Matérialisation | + | === Bloquants => Matérialisation |
- | Non bloquants => Pipelinage | + | //TODO image// |
- | Opérateurs bloquants | + | === Non bloquants => Pipelinage |
+ | //TODO image// | ||
+ | |||
+ | === Opérateurs bloquants | ||
Parfois il n’est pas possible d’éviter le calcul complet de l’une des opérations avant de continuer. On est alors en présence d’un opérateur dit bloquant dont le résultat doit être entièrement produit (et matérialisé en cache ou écrit sur disque) avant de démarrer l’opération suivante. Par exemple: | Parfois il n’est pas possible d’éviter le calcul complet de l’une des opérations avant de continuer. On est alors en présence d’un opérateur dit bloquant dont le résultat doit être entièrement produit (et matérialisé en cache ou écrit sur disque) avant de démarrer l’opération suivante. Par exemple: | ||
- | le tri (order by); | + | * le tri (order by); |
- | la recherche d’un maximum ou d’un minimum (max, min); | + | |
- | l’élimination des doublons (distinct); | + | |
- | le calcul d’une moyenne ou d’une somme (sum, avg); | + | |
- | un partitionnement (group by); | + | |
On distingue donc : | On distingue donc : | ||
- | le temps de réponse: c’est le temps mis pour obtenir un premier nuplet; il est quasi-instantané pour une exécution sans opérateur bloquant; | + | * le temps de réponse: c’est le temps mis pour obtenir un premier nuplet; il est quasi-instantané pour une exécution sans opérateur bloquant; |
- | le temps d’exécution: | + | |
- | Index | + | |
+ | ==== Index ==== | ||
Un index est une structure de données permettant d' | Un index est une structure de données permettant d' | ||
Les accès effectués sur un index se font sur des structures optimisées pour la recherche (liste triée, B-tree…) au lieu de se faire par parcours séquentiel et intégral des enregistrements. | Les accès effectués sur un index se font sur des structures optimisées pour la recherche (liste triée, B-tree…) au lieu de se faire par parcours séquentiel et intégral des enregistrements. | ||
- | B-Tree | + | === B-Tree |
- | Intérêt | + | <WRAP tip> |
+ | __Intérêt | ||
R = Nombre de valeurs possibles/ | R = Nombre de valeurs possibles/ | ||
+ | </ | ||
Les index B-TREE sont les plus couramment utilisés. | Les index B-TREE sont les plus couramment utilisés. | ||
Ligne 89: | Ligne 125: | ||
Les index doivent être utilisés sur les attributs : | Les index doivent être utilisés sur les attributs : | ||
- | souvent mobilisés dans une restriction (donc une jointure) | + | * souvent mobilisés dans une restriction (donc une jointure) |
- | très discriminés (c'est à dire pour lesquels peu d' | + | |
- | rarement modifiés | + | |
+ | <WRAP important> | ||
Inconvénients : | Inconvénients : | ||
- | diminuent les performances en mise à jour (puisqu' | + | * diminuent les performances en mise à jour (puisqu' |
- | ajoutent du volume à la base de données et leur volume peut devenir non négligeable. | + | |
- | Ne permettent pas toujours de gagner en efficacité (voir plus bas). | + | |
- | Source : use-the-index-luke.com | + | </ |
- | Bitmap | + | //TODO image// |
- | Intérêt | + | |
+ | Source : [[https:// | ||
+ | |||
+ | === Bitmap | ||
+ | |||
+ | <WRAP tip> | ||
+ | __Intérêt | ||
R = Nombre de valeurs possibles/ | R = Nombre de valeurs possibles/ | ||
+ | </ | ||
Les index Bitmap sont destinés à l' | Les index Bitmap sont destinés à l' | ||
Ligne 110: | Ligne 154: | ||
De tels index optimisent la recherche relative à une question du type : “l' | De tels index optimisent la recherche relative à une question du type : “l' | ||
- | Inconvénients | + | <WRAP important> |
+ | __Inconvénients | ||
diminuent de manière importante les performances en mise à jour (puisqu' | diminuent de manière importante les performances en mise à jour (puisqu' | ||
- | utilisables uniquement pour peu de valeurs distinctes = le meilleur ratio de valeurs distinctes au nombre total occurrences est d' | + | utilisables uniquement pour peu de valeurs distinctes = le meilleur ratio de valeurs distinctes au nombre total occurrences est d' |
- | FullText | + | </ |
- | Les index FullText permettent de faire des recherches sur les champs de type string (CHAR, VARCHAR et TEXT). | + | |
- | Création : | + | === FullText === |
+ | |||
+ | Les index FullText permettent de faire des recherches sur les champs de type string (CHAR, VARCHAR et TEXT). | ||
+ | == Création : == | ||
+ | <sxh sql> | ||
CREATE FULLTEXT INDEX ind_full_titre | CREATE FULLTEXT INDEX ind_full_titre | ||
ON Livre (titre); | ON Livre (titre); | ||
- | Utilisation : | + | </ |
+ | == Utilisation : == | ||
+ | |||
+ | <sxh sql> | ||
SELECT * | SELECT * | ||
FROM Livre | FROM Livre | ||
WHERE MATCH(titre) | WHERE MATCH(titre) | ||
AGAINST (' | AGAINST (' | ||
- | Modes possibles : | + | </ |
- | IN NATURAL LANGUAGE MODE | + | == Modes possibles : == |
- | IN BOOLEAN MODE | + | * IN NATURAL LANGUAGE MODE |
- | WITH QUERY EXPANSION | + | |
- | Index partiels | + | |
- | Permettent de poser un index de manière conditionnelle ⇒ limite la taille de l' | + | |
+ | ==== Index partiels ==== | ||
+ | |||
+ | Permettent de poser un index de manière conditionnelle ⇒ limite la taille de l' | ||
+ | <sxh sql> | ||
CREATE INDEX nr_mail | CREATE INDEX nr_mail | ||
ON mails (subject) | ON mails (subject) | ||
WHERE status = ' | WHERE status = ' | ||
- | Efficacité des index | + | |
+ | </ | ||
+ | |||
+ | ==== Efficacité des index ==== | ||
L' | L' | ||
Une recherche nécessite les 3 opérations suivantes | Une recherche nécessite les 3 opérations suivantes | ||
- | le parcours de l' | + | * le parcours de l' |
- | la suite de la chaîne de nœuds feuilles | + | |
- | la récupération des données de la table | + | |
L' | L' | ||
- | Points importants : | + | === Points importants : === |
+ | |||
+ | |||
+ | * Nombre de valeurs (unique ou multiple/ | ||
+ | * Index composites et importance de l' | ||
+ | * Index lents ⇒ un TABLE ACCESS FULL (lecture de plusieurs enreg par bloc) peut être plus rapide qu'un **INDEX RANGE SCAN** (lecture 1 à 1 de plusieurs enregs) (voir [[https:// | ||
+ | * Index et usage de fonctions ⇒ index avec fonctions possibles pour fonctions pures (voir [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ==== Analyse de requêtes ==== | ||
- | Nombre de valeurs (unique ou multiple/ | ||
- | Index composites et importance de l' | ||
- | Index lents ⇒ un TABLE ACCESS FULL (lecture de plusieurs enreg par bloc) peut être plus rapide qu'un INDEX RANGE SCAN (lecture 1 à 1 de plusieurs enregs) (voir Index lents) | ||
- | Index et usage de fonctions ⇒ index avec fonctions possibles pour fonctions pures (voir Usage de fonctions) | ||
- | Index et requêtes préparées | ||
- | Analyse de requêtes | ||
La plupart des SGDB possédent un analyseur de requêtes permettant de visualiser le plan d' | La plupart des SGDB possédent un analyseur de requêtes permettant de visualiser le plan d' | ||
- | PostgreSQL | + | __PostgreSQL |
- | explain ⇒ Donne le plan d' | + | //TODO image// |
- | explain analyze ⇒ Donne le plan d' | + | |
- | Ressources | + | * explain ⇒ Donne le plan d' |
- | Explain beautifier | + | |
- | Explain documentation | + | |
- | Application | + | === Ressources |
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ==== Application | ||
+ | <WRAP todo> | ||
Benchmark avec et sans Index BTree + Analyse des plans de requête (PostGreSQL) sur : | Benchmark avec et sans Index BTree + Analyse des plans de requête (PostGreSQL) sur : | ||
- | Select monotable sur champ | + | * Select monotable sur champ |
- | Join sur champ | + | |
- | Select avec fonction (LCASE(name) par exemple) | + | |
- | Utilisation de fonction de regroupement | + | |
- | Order By | + | |
- | Références | + | </ |
- | Cours de Philippe RIGAUX (CNAM) | + | ==== Références |
- | Use the index Luke | + | |
- | MySQL performance optimization | + | * [[http:// |
- | PostgreSQL performance tuning | + | * [[https:// |
+ | * [[https:// | ||
+ | * [[https:// |