CodeGym /Cours /SQL SELF /Optimisation des fonctions analytiques pour de gros volum...

Optimisation des fonctions analytiques pour de gros volumes de données : indexation et partitionnement

SQL SELF
Niveau 60 , Leçon 3
Disponible

Quand t'as beaucoup de données (genre comme les messages sur les deadlines dans les chats d'entreprise), les requêtes de sélection et de traitement commencent à ramer. Voilà les raisons principales :

  1. Absence d'index. Quand PostgreSQL doit scanner toute ta table pour exécuter une requête (ça s'appelle "Seq Scan" — scan séquentiel), la requête peut prendre beaucoup plus de temps.
  2. Requêtes SQL inefficaces. Si tes requêtes sont faites sans penser à l'optimisation, même avec des index tu peux galérer en prod. Par exemple, t'as oublié d'utiliser des conditions clés dans WHERE ? Prépare-toi à attendre longtemps.
  3. Gros volumes de données dans une seule table. Genre, si tu veux analyser les ventes de toutes les années d'un coup, même les index ne vont pas te sauver.

Mais t'inquiète, on a deux méthodes éprouvées pour gérer ça : l'indexation et le partitionnement.

Utiliser les index pour accélérer les requêtes

Voilà un exemple simple de création d'index :

CREATE INDEX idx_sales_date ON sales(transaction_date);
  • Ici idx_sales_date — c'est le nom de l'index (tu peux l'appeler comme tu veux, mais c'est mieux de choisir un nom parlant).
  • ON sales(transaction_date) — ça indique pour quelle table et quelle colonne tu crées l'index.

Cet index est super utile si tu filtres souvent tes requêtes sur le champ transaction_date.

Exemple de requête qui va profiter de cet index :

SELECT *
FROM sales
WHERE transaction_date BETWEEN '2023-01-01' AND '2023-12-31';

Indexation sur des clés composées

Si tes requêtes utilisent souvent une combinaison de plusieurs champs, genre region et product_id, pense à créer un index composé :

CREATE INDEX idx_sales_region_product ON sales(region, product_id);

Maintenant, les requêtes comme celle-ci vont beaucoup plus vite :

SELECT *
FROM sales
WHERE region = 'Amérique du Nord' AND product_id = 42;

Utiliser les index uniques

Les index uniques accélèrent non seulement la recherche, mais garantissent aussi l'unicité des valeurs dans une colonne. Par exemple :

CREATE UNIQUE INDEX idx_unique_customer_email ON customers(email);

Maintenant, tu ne pourras plus créer deux clients avec le même email par accident.

Indexation pour les fonctions analytiques

Certaines fonctions d'analyse de données, comme SUM, COUNT ou AVG, peuvent utiliser un index pour calculer plus vite. Exemple :

CREATE INDEX idx_sales_amount ON sales(amount);

La requête :

SELECT SUM(amount)
FROM sales 
WHERE transaction_date >= '2023-01-01';

va s'exécuter plus rapidement grâce à l'index.

Partitionnement des tables pour gérer de gros volumes de données

Le partitionnement de table, c'est le fait de découper une grosse table en parties logiques plus petites, qu'on appelle des partitions. Par exemple, tu peux découper la table sales en partitions par année : sales_2021, sales_2022, etc.

Tu penses que c'est compliqué ? En vrai, PostgreSQL rend ça plus simple que tu crois.

Types de partitionnement

  1. Partitionnement par plage (Range Partitioning). Les données sont séparées selon une plage, par exemple par date.
  2. Partitionnement par liste (List Partitioning). Les données sont séparées selon des valeurs précises, genre par régions.
  3. Partitionnement par hash (Hash Partitioning). Utilise une fonction de hash pour séparer les données (on l'utilise rarement à la main).

Créer une table partitionnée

On va créer une table des ventes partitionnée par année.

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    transaction_date DATE NOT NULL,
    amount NUMERIC,
    region TEXT
) PARTITION BY RANGE (transaction_date);

Maintenant, on crée les partitions pour différentes années :

CREATE TABLE sales_2021 PARTITION OF sales
FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');

CREATE TABLE sales_2022 PARTITION OF sales
FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');

Les requêtes qui filtrent par date vont automatiquement ne bosser qu'avec la partition qu'il faut. Tu peux vérifier ça facilement avec la commande EXPLAIN.

Exemple avec partitionnement

Voilà à quoi ressemblerait une requête pour sommer les ventes juste pour 2021 :

SELECT SUM(amount)
FROM sales
WHERE transaction_date BETWEEN '2021-01-01' AND '2021-12-31';

Comme tu vois, PostgreSQL ne bosse qu'avec la partition sales_2021 et ne scanne pas toute la table.

Exemple : optimisation du calcul des métriques par région

Imaginons que tu veux calculer le total des ventes par région. Sans index ni partitions, ça prend une éternité. D'abord, on crée un index sur la colonne region :

CREATE INDEX idx_sales_region ON sales(region);

Ta requête :

SELECT region, SUM(amount)
FROM sales
GROUP BY region;

Maintenant, le traitement est accéléré grâce à l'index.

Exemple : partitionnement des données temporelles

Pour les données temporelles, comme les transactions ou les logs, crée des partitions par mois. Par exemple :

CREATE TABLE sales_monthly PARTITION BY RANGE (transaction_date);

CREATE TABLE sales_jan_2023 PARTITION OF sales_monthly
FOR VALUES FROM ('2023-01-01') TO ('2023-02-01');

La requête :

SELECT SUM(amount)
FROM sales_monthly
WHERE transaction_date >= '2023-01-01' AND transaction_date < '2023-02-01';

va être plus rapide, car PostgreSQL ne lit que la partition sales_jan_2023.

Exemple : combiner indexation et partitionnement

Tu peux combiner indexation et partitionnement pour avoir un max de perf. Par exemple, tu peux créer des index dans chaque partition. Voilà comment faire :

CREATE INDEX idx_sales_amount_jan_2023 ON sales_jan_2023(amount);

Comment éviter les erreurs classiques

Plein d'erreurs de perf viennent d'une mauvaise utilisation des index et du partitionnement. Par exemple :

  • Avoir trop d'index peut ralentir les insertions.
  • Les partitions doivent être bien équilibrées ; des partitions trop petites ou trop grosses dégradent les perfs.
  • Oublier d'analyser les perfs (EXPLAIN ANALYZE) avant d'optimiser — c'est comme essayer de réparer une bagnole sans regarder sous le capot.

Teste toujours si tes optimisations apportent vraiment un gain de vitesse, et n'aie pas peur d'expérimenter.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION