Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
cnam:nfp107:seance10 [2023/04/22 20:32] – jcheron | cnam:nfp107:seance10 [2023/04/22 21:06] (Version actuelle) – [Index] jcheron | ||
---|---|---|---|
Ligne 52: | Ligne 52: | ||
Le SGDB et l' | Le SGDB et l' | ||
+ | |||
<wrap important> | <wrap important> | ||
Ligne 63: | Ligne 64: | ||
//TODO image// | //TODO image// | ||
+ | |||
Application des sélections aux tables concernées : | Application des sélections aux tables concernées : | ||
Ligne 84: | Ligne 86: | ||
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 114: | 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 135: | 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:// |