Le traitement de grandes quantités de données dans SQL nécessite une approche particulière pour éviter les débordements de mémoire, les blocages et garantir des performances stables. L'une des principales techniques consiste à diviser les opérations en lots : les données d'entrée sont traitées par petites portions, ce qui réduit la charge sur le serveur et permet de mieux contrôler les transactions et les annulations en cas d'erreurs.
Aspects clés :
ROWCOUNT ou LIMIT / TOP)COMMIT, pour alléger le journal des transactionsExemple (SQL Server) :
DECLARE @BatchSize INT = 1000; WHILE 1 = 1 BEGIN BEGIN TRANSACTION; DELETE TOP(@BatchSize) FROM BigLogTable WHERE CreatedDate < '2021-01-01'; IF @@ROWCOUNT = 0 BREAK; COMMIT TRANSACTION; END
Comment supprimer 100 millions d'enregistrements d'une grande table avec un impact minimal sur les performances ?
Réponse incorrecte : "Faire une grande suppression".
Réponse correcte : Supprimer par portions (par lots) avec contrôle de la taille des lots, effectuer un COMMIT après chaque bloc, réduire la charge sur le disque et les blocages si nécessaire à l'aide de pauses (WAITFOR DELAY ou équivalent).
Exemple (PostgreSQL) :
DO $$ BEGIN LOOP DELETE FROM big_table WHERE created_at < NOW() - interval '1 year' LIMIT 10000; EXIT WHEN NOT FOUND; COMMIT; END LOOP; END$$;
Histoire
Projet : Service bancaire à forte charge. Erreur : Un développeur a lancé la suppression de journaux obsolètes avec une seule grande requête sur 80 millions de lignes. Résultat — le journal des transactions a grimpé à plusieurs téraoctets, saturant tout l'espace disque disponible, le service a "planté".
Histoire
Projet : Boutique en ligne avec un système de gestion des stocks. Erreur : Lors de l'insertion massive, la taille de la transaction n'était pas limitée. Dans le processus d'importation de grands lots, des erreurs se sont produites, l'ensemble du travail précédent a dû être annulé et répété, prenant des heures au lieu de minutes.
Histoire
Projet : Détaillant, base de données de rapports sur les commandes. Erreur : Des lots ont été utilisés, mais le COMMIT entre les itérations a été oublié — le journal des transactions a grandi de manière exponentielle, le serveur a commencé à "ralentir", et une nettoyage d'urgence des journaux a été nécessaire avec les outils standard.