Module J3
Dalibo SCOP
24.09
29 août 2024
Formation | Module J3 |
Titre | Optimisation SQL |
Révision | 24.09 |
https://dali.bo/j3_pdf | |
EPUB | https://dali.bo/j3_epub |
HTML | https://dali.bo/j3_html |
Slides | https://dali.bo/j3_slides |
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.
L’optimisation doit porter sur :
postgresql.conf
& co« 80% des effets sont produits par 20% des causes. » (Principe de Pareto)
Seul un certain nombre de requêtes sont critiques
Quelques profilers :
Le SQL :
Les opérateurs purement relationnels :
SELECT
WHERE
FROM/JOIN
Les autres opérateurs sont non-relationnels :
ORDER BY
GROUP BY/DISTINCT
HAVING
Le volume de données récupéré a un impact sur les performances.
SQL : langage ensembliste
Un Semi Join peut être très efficace (il ne lit pas tout)
EXISTS
(si index
disponible)Ces sous-requêtes sont strictement équivalentes (Semi-join) :
SELECT * FROM t1
WHERE fk IN ( SELECT pk FROM t2 WHERE … )
SELECT * FROM t1
WHERE EXISTS ( SELECT 1 FROM t2 WHERE t2.pk = t1.fk AND … )
SELECT t1.*
FROM t1 LEFT JOIN t2 ON (t1.fk=t2.pk)
WHERE
t2.id IS NULL
(Et Anti-join pour les variantes avec NOT
)
NOT IN
: préférer
NOT EXISTS
Une vue est une requête pré-déclarée en base.
DISTINCT
, GROUP BY
etc.
L’accès aux données est coûteux.
gram.y
de 19000 lignesSe connecter coûte cher :
→ Maintenir les connexions côté applicatif, ou utiliser un pooler.
WITH
)Le schéma est la modélisation des données
Les moteurs SQL sont très efficaces, et évoluent en permanence
CASE
, etc.--
et /* */
Prendre de la distance vis-à-vis des spécifications fonctionnelles (bis) :
COUNT(*)
COMMIT
ROLLBACK
COMMIT
synchronous_commit = off
(…si perte
possible)« Verrous mortels » : comment les éviter ?
Écrire sur plusieurs nœuds ?