{"id":6501,"date":"2025-09-26T07:00:05","date_gmt":"2025-09-26T05:00:05","guid":{"rendered":"http:\/\/rootfan.com\/?p=6501"},"modified":"2025-09-30T21:58:09","modified_gmt":"2025-09-30T19:58:09","slug":"postgresql-sql-tuning","status":"publish","type":"post","link":"https:\/\/rootfan.com\/fr\/postgresql-sql-tuning\/","title":{"rendered":"Optimisation SQL de PostgreSQL : Comment trouver et r\u00e9parer les requ\u00eates lentes"},"content":{"rendered":"<p>M\u00eame le meilleur mat\u00e9riel ne peut pas vous sauver d'un code SQL mal \u00e9crit. <\/p>\n\n\n\n<p>PostgreSQL fournit des outils puissants pour analyser l'ex\u00e9cution des requ\u00eates et optimiser les performances.<\/p>\n\n\n\n<p>Dans cet article, nous allons explorer les principes fondamentaux de l'optimisation SQL afin que vous puissiez identifier les goulets d'\u00e9tranglement et acc\u00e9l\u00e9rer l'ex\u00e9cution de vos requ\u00eates.<\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">L'importance de l'optimisation de SQL<\/h2>\n\n\n\n<p>Un code SQL mal optimis\u00e9 conduit \u00e0 :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requ\u00eates interminables qui frustrent les utilisateurs.<\/li>\n\n\n\n<li>Consommation inutile d'unit\u00e9 centrale et d'E\/S.<\/li>\n\n\n\n<li>Verrous et contention ayant un impact sur d'autres sessions.<\/li>\n\n\n\n<li>Augmentation des co\u00fbts en cas d'\u00e9volution inutile du mat\u00e9riel.<\/li>\n<\/ul>\n\n\n\n<p>L'optimisation de SQL est l'un des moyens les plus rentables d'am\u00e9liorer les performances.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 1 : Identifier les requ\u00eates lentes<\/h2>\n\n\n\n<p>Vous pouvez suivre les requ\u00eates lentes en utilisant :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>d\u00e9claration_min_dur\u00e9e_log<\/strong> - Enregistre les requ\u00eates d\u00e9passant une dur\u00e9e d\u00e9termin\u00e9e.<\/li>\n\n\n\n<li><strong>pg_stat_statements<\/strong> - Capture les statistiques d'ex\u00e9cution de toutes les requ\u00eates.<\/li>\n\n\n\n<li><strong>PEM SQL Profiler<\/strong> - Fournit un tra\u00e7age et une analyse graphiques.<\/li>\n<\/ul>\n\n\n\n<p>Exemple :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Log queries longer than 5 seconds\nALTER SYSTEM SET log_min_duration_statement = 5000;\nSELECT pg_reload_conf();\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 2 : Examiner le plan d'ex\u00e9cution<\/h2>\n\n\n\n<p>Utiliser le <strong>EXPLIQUER<\/strong> pour voir comment PostgreSQL planifie l'ex\u00e9cution d'une requ\u00eate :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXPLAIN SELECT * FROM customers JOIN orders USING (customerid);\n<\/pre><\/div>\n\n\n<p>Ou courir <strong>EXPLIQUER ANALYSER<\/strong> pour ex\u00e9cuter la requ\u00eate et comparer les estimations avec la dur\u00e9e d'ex\u00e9cution r\u00e9elle :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXPLAIN ANALYZE SELECT * FROM customers JOIN orders USING (customerid);\n<\/pre><\/div>\n\n\n<p>Principaux points \u00e0 v\u00e9rifier :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Balayages s\u00e9quentiels<\/strong> sur les grandes tables (peut indiquer des index manquants).<\/li>\n\n\n\n<li><strong>M\u00e9thodes de jonction<\/strong> (jointure par hachage, boucle imbriqu\u00e9e, jointure par fusion).<\/li>\n\n\n\n<li><strong>Co\u00fbts de tri et d'agr\u00e9gation<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 3 : V\u00e9rification des statistiques<\/h2>\n\n\n\n<p>PostgreSQL s'appuie sur les statistiques des tables et des colonnes pour la planification des requ\u00eates. <\/p>\n\n\n\n<p>Des statistiques obsol\u00e8tes peuvent conduire \u00e0 de mauvais plans d'ex\u00e9cution.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ex\u00e9cuter <code>ANALYSER<\/code> pour actualiser les statistiques :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nANALYZE customers;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>Utilisation <strong>autovacuum<\/strong> pour que les statistiques soient automatiquement mises \u00e0 jour.<\/li>\n\n\n\n<li>Pour les donn\u00e9es asym\u00e9triques, ajuster les statistiques des colonnes :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nALTER TABLE orders ALTER COLUMN order_date SET STATISTICS 500;\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 4 : Restructurer les requ\u00eates<\/h2>\n\n\n\n<p>Parfois, c'est la requ\u00eate elle-m\u00eame qui pose probl\u00e8me. <\/p>\n\n\n\n<p>Meilleures pratiques :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00c9viter les conversions de type implicites.<\/li>\n\n\n\n<li>Utilisation <strong>\u00e9quijoins<\/strong> plut\u00f4t que des fonctions dans les clauses WHERE.<\/li>\n\n\n\n<li>Remplacer les sous-requ\u00eates corr\u00e9l\u00e9es par des jointures.<\/li>\n\n\n\n<li>Consid\u00e9rer <strong>vues mat\u00e9rialis\u00e9es<\/strong> pour les rapports complexes.<\/li>\n\n\n\n<li>Utilisation <strong>requ\u00eates parall\u00e8les<\/strong> dans la mesure du possible.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 5 : Strat\u00e9gies d'indexation<\/h2>\n\n\n\n<p>Les index sont l'\u00e9pine dorsale de l'optimisation des performances. <\/p>\n\n\n\n<p>Les options comprennent<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Arbre B (par d\u00e9faut)<\/strong> - Pour les requ\u00eates d'\u00e9galit\u00e9 et d'\u00e9tendue.<\/li>\n\n\n\n<li><strong>Hachures<\/strong> - Pour de simples recherches d'\u00e9galit\u00e9.<\/li>\n\n\n\n<li><strong>GIN<\/strong> - Pour les tableaux, JSONB et la recherche plein texte.<\/li>\n\n\n\n<li><strong>BRIN<\/strong> - Pour les donn\u00e9es s\u00e9quentielles volumineuses telles que les s\u00e9ries temporelles.<\/li>\n\n\n\n<li><strong>Index partiels<\/strong> - Indexer uniquement les lignes pertinentes.<\/li>\n\n\n\n<li><strong>Index fonctionnels<\/strong> - Les expressions d'index comme <code>LOWER(email)<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Exemple :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Partial index on active users only\nCREATE INDEX users_active_idx ON users (last_login)\nWHERE active = true;\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 6 : Examen du plan final<\/h2>\n\n\n\n<p>Apr\u00e8s la restructuration et l'indexation, r\u00e9ex\u00e9cutez <strong>EXPLIQUER ANALYSER<\/strong> pour confirmer les am\u00e9liorations. Rechercher :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>R\u00e9duction du temps d'ex\u00e9cution.<\/li>\n\n\n\n<li>Diminution des co\u00fbts estim\u00e9s et r\u00e9els.<\/li>\n\n\n\n<li>Utilisation correcte de l'index.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Liste de contr\u00f4le des r\u00e9glages rapides<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Activer la journalisation des requ\u00eates pour les requ\u00eates lentes.<\/li>\n\n\n\n<li>Utilisez EXPLAIN\/EXPLAIN ANALYZE pour comprendre les plans d'ex\u00e9cution.<\/li>\n\n\n\n<li>\u2705 Maintenir les statistiques \u00e0 jour avec ANALYZE\/autovacuum.<\/li>\n\n\n\n<li>\u2705 Restructurer les requ\u00eates inefficaces.<\/li>\n\n\n\n<li>\u2705 Appliquer le bon type d'indice.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9flexions finales<\/h2>\n\n\n\n<p>L'optimisation du langage SQL rel\u00e8ve \u00e0 la fois de la science et de l'art. <\/p>\n\n\n\n<p>PostgreSQL vous donne les outils n\u00e9cessaires pour identifier les probl\u00e8mes de performance et les r\u00e9soudre efficacement.<\/p>\n\n\n\n<p>Commencez par l'enregistrement et les plans d'ex\u00e9cution, puis it\u00e9rez avec des statistiques, des r\u00e9\u00e9critures de requ\u00eates et des strat\u00e9gies d'indexation.<\/p>\n\n\n\n<p>J'esp\u00e8re que cela vous a \u00e9t\u00e9 utile.<\/p>","protected":false},"excerpt":{"rendered":"<p>M\u00eame le meilleur mat\u00e9riel ne peut pas vous sauver d'une mauvaise \u00e9criture SQL. PostgreSQL fournit des outils puissants pour analyser l'ex\u00e9cution des requ\u00eates et optimiser les performances. Dans cet article, nous allons explorer les principes fondamentaux de l'optimisation SQL afin que vous puissiez identifier les goulots d'\u00e9tranglement et acc\u00e9l\u00e9rer l'ex\u00e9cution de vos requ\u00eates.<\/p>","protected":false},"author":1,"featured_media":6503,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_focus_keyword":"","rank_math_title":"","rank_math_description":"Find and fix slow queries in PostgreSQL 16 with SQL tuning techniques. Learn how to analyze query execution, identify bottlenecks, and optimize SQL queries for faster performance.","rank_math_robots":"","rank_math_og_title":"","rank_math_og_description":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[126],"tags":[135,109,134,133],"class_list":["post-6501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-fundamentals","tag-performance","tag-slow-queries","tag-sql-tuning"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/rootfan.com\/wp-content\/uploads\/czNmcy1wcml2YXRlL3Jhd3BpeGVsX2ltYWdlcy93ZWJzaXRlX2NvbnRlbnQvbHIvZmw0NzI2MzczMzgyMS1pbWFnZS1reWJlang5eC5qcGc.webp?fit=1024%2C684&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/posts\/6501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/comments?post=6501"}],"version-history":[{"count":6,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/posts\/6501\/revisions"}],"predecessor-version":[{"id":6564,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/posts\/6501\/revisions\/6564"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/media\/6503"}],"wp:attachment":[{"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/media?parent=6501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/categories?post=6501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rootfan.com\/fr\/wp-json\/wp\/v2\/tags?post=6501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}