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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Les chiffres
  5. 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) = 2024 calcule 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 NULL
    • WHERE EXTRACT(YEAR FROM date_commande) IN (2024) AND date_commande IS NOT NULL
    • WHERE 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.