Optimiser une requête
La démarche sur une requête lente : mesurer, lire le plan, trouver l'opération en cause, appliquer un remède (index, prédicat utilisable, colonnes utiles, jointure, pagination par clé, statistiques) et remesurer.
- 22 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Les chiffres
- Mises en situation
Quelques cartes du deck
Prédicat sargable : de quoi s'agit-il ?
Voir la réponse
Condition de WHERE écrite de façon que la base puisse s'appuyer sur un index : la colonne y apparaît seule d'un côté, sans fonction ni calcul qui la modifie.
WHERE EXTRACT(YEAR FROM date_commande) = 2024calcule une valeur pour chaque ligne et empêche l'index sur date_commande de servir.WHERE date_commande >= '2024-01-01' AND date_commande < '2025-01-01'le permet.Un index existe sur date_commande et la requête reste lente. Quelle réécriture du filtre permet de s'en servir ?
```sql
WHERE EXTRACT(YEAR FROM date_commande) = 2024`WHERE date_commande >= '2024-01-01' AND date_commande < '2025-01-01'WHERE TO_CHAR(date_commande, 'YYYY') = '2024' AND date_commande IS NOT NULLWHERE EXTRACT(YEAR FROM date_commande) IN (2024) AND date_commande IS NOT NULLWHERE date_commande + 0 >= '2024-01-01' AND date_commande + 0 < '2025-01-01'
Voir la réponse
WHERE date_commande >= '2024-01-01' AND date_commande < '2025-01-01'La bonne réécriture compare la colonne nue à des bornes : la base descend l'index au début de l'année et lit jusqu'à la fin. Les trois autres appliquent encore une fonction ou un calcul à la colonne.
Pour savoir si un remède marche, on ne change qu'… chose à la fois, puis on … la requête.
Voir la réponse
Pour savoir si un remède marche, on ne change qu'une seule chose à la fois, puis on remesure la requête.
Si on change trois choses d'un coup, on ne sait plus laquelle a aidé, ni laquelle a gêné. La mesure, avant et après, est la seule preuve.
Pagination par clé : de quoi s'agit-il ?
Voir la réponse
Pagination qui repart de la dernière clé vue avec
WHERE id > ? ORDER BY id LIMIT n, au lieu de sauter un nombre de lignes avec OFFSET.Avec un index sur la clé, la base descend directement à la bonne position : la page 5 000 coûte autant que la page 1, alors que OFFSET relit et jette toutes les lignes précédentes.