{"id":1331,"date":"2026-04-01T18:56:36","date_gmt":"2026-04-01T21:56:36","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1331"},"modified":"2026-04-01T18:56:36","modified_gmt":"2026-04-01T21:56:36","slug":"como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/","title":{"rendered":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos"},"content":{"rendered":"\n<p>Si alguna vez te preguntaste por qu\u00e9 una query en PostgreSQL tarda m\u00e1s de lo esperado, <strong>EXPLAIN ANALYZE<\/strong> es tu mejor aliado. En este post vas a aprender a leer un plan de ejecuci\u00f3n de principio a fin, con ejemplos reales y sin vueltas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es EXPLAIN ANALYZE?<\/h2>\n\n\n\n<p><code>EXPLAIN<\/code> muestra el plan de ejecuci\u00f3n que el planner de PostgreSQL genera para una query. Cuando le agreg\u00e1s <code>ANALYZE<\/code>, la query se ejecuta de verdad y te devuelve estad\u00edsticas reales junto con las estimaciones del planner.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE SELECT * FROM productos WHERE categoria = 'Electr\u00f3nica';<\/code><\/pre>\n\n\n\n<p>&#x26a0;&#xfe0f; <strong>Importante:<\/strong> <code>EXPLAIN ANALYZE<\/code> ejecuta la query. Si es un <code>INSERT<\/code>, <code>UPDATE<\/code> o <code>DELETE<\/code>, envolvela en una transacci\u00f3n y hac\u00e9 rollback para evitar modificar datos reales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo leer el plan: estructura general<\/h2>\n\n\n\n<p>El plan es un \u00e1rbol invertido. Los nodos m\u00e1s internos (indentados) se ejecutan primero y alimentan a los nodos superiores. As\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Gather  (cost=10.00..45524.73 rows=949636 width=97) (actual time=0.673..173.017 rows=955000 loops=1)\n  Workers Planned: 4\n  Workers Launched: 4\n  ->  Parallel Seq Scan on test_table  (cost=0.00..44565.09 rows=237409 width=97) (actual time=0.039..51.941 rows=191000 loops=5)\nPlanning Time: 0.093 ms\nExecution Time: 209.745 ms<\/code><\/pre>\n\n\n\n<p>Le\u00e9 siempre de adentro hacia afuera: primero el <code>Parallel Seq Scan<\/code>, luego el <code>Gather<\/code> que agrupa los resultados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Los 5 n\u00fameros que ten\u00e9s que entender<\/h2>\n\n\n\n<p>Cada nodo tiene dos grupos de par\u00e9ntesis: estimaciones y valores reales.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Estimaciones del planner<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>cost=X..Y<\/strong> \u2014 Costo de arranque (X) y costo total (Y). Son unidades arbitrarias, no milisegundos. Sirven para comparar planes entre s\u00ed.<\/li>\n  <li><strong>rows=Z<\/strong> \u2014 Cantidad de filas que el planner estima que va a devolver ese nodo.<\/li>\n  <li><strong>width=W<\/strong> \u2014 Ancho promedio en bytes de cada fila de salida.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Valores reales (despu\u00e9s de ejecutar)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>actual time=A..B<\/strong> \u2014 Tiempo real en ms: A = primera fila devuelta, B = \u00faltima fila devuelta.<\/li>\n  <li><strong>rows=C<\/strong> \u2014 Filas realmente devueltas por ese nodo en cada ejecuci\u00f3n.<\/li>\n  <li><strong>loops=D<\/strong> \u2014 Cu\u00e1ntas veces se ejecut\u00f3 ese nodo. Multiplic\u00e1 rows \u00d7 loops para el total real.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">El truco del loops: el n\u00famero m\u00e1s malentendido<\/h2>\n\n\n\n<p>Cuando ves <code>rows=191000 loops=5<\/code>, <strong>no<\/strong> significa 191.000 filas totales. Significa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Total de filas = 191.000 \u00d7 5 = 955.000\nTiempo total de CPU = 52ms \u00d7 5 = 260ms  (pero en paralelo, el tiempo de pared es ~52ms)<\/code><\/pre>\n\n\n\n<p>Regla pr\u00e1ctica: <strong>filas \u00d7 loops = filas reales procesadas<\/strong>. Para tiempo paralelo, el reloj de pared es menor que el tiempo acumulado de CPU.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo 1: Seq Scan (sin \u00edndice)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Tabla de 100.000 productos, sin \u00edndice en \"categoria\"\nEXPLAIN ANALYZE SELECT * FROM productos WHERE categoria = 'Electr\u00f3nica';\n\n-- Resultado:\nSeq Scan on productos  (cost=0.00..2020.00 rows=33333 width=80)\n                       (actual time=0.035..18.577 rows=33333 loops=1)\n  Filter: (categoria = 'Electr\u00f3nica')\n  Rows Removed by Filter: 66667\nPlanning Time: 0.087 ms\nExecution Time: 18.730 ms<\/code><\/pre>\n\n\n\n<p><strong>Qu\u00e9 est\u00e1 pasando:<\/strong> PostgreSQL ley\u00f3 las 100.000 filas de la tabla de forma secuencial y descart\u00f3 66.667 que no cumpl\u00edan el filtro. Si <code>Rows Removed by Filter<\/code> es alto, es se\u00f1al de que un \u00edndice podr\u00eda ayudar mucho.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo 2: Bitmap Index Scan (con \u00edndice)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_productos_categoria ON productos (categoria);\n\nEXPLAIN ANALYZE SELECT * FROM productos WHERE categoria = 'Electr\u00f3nica';\n\n-- Resultado:\nBitmap Heap Scan on productos  (cost=5.07..1046.07 rows=33333 width=80)\n                                (actual time=0.076..3.456 rows=33333 loops=1)\n  Recheck Cond: (categoria = 'Electr\u00f3nica')\n  ->  Bitmap Index Scan on idx_productos_categoria  (cost=0.00..5.07 rows=33333 width=0)\n                                                     (actual time=0.040..0.040 rows=33333 loops=1)\n        Index Cond: (categoria = 'Electr\u00f3nica')\nPlanning Time: 0.112 ms\nExecution Time: 3.610 ms<\/code><\/pre>\n\n\n\n<p><strong>Resultado:<\/strong> De 18.730ms a 3.610ms \u2014 <strong>5x m\u00e1s r\u00e1pido<\/strong> solo con agregar un \u00edndice. El <code>Bitmap Index Scan<\/code> primero encuentra las posiciones de las filas en el \u00edndice y luego el <code>Bitmap Heap Scan<\/code> las recupera de la tabla.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo 3: Consulta con paralelismo<\/h2>\n\n\n\n<p>Para tablas grandes, PostgreSQL puede lanzar workers en paralelo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE SELECT * FROM tabla_grande;\n\nGather  (cost=10.00..45524.73 rows=949636 width=97) (actual time=0.673..173.017 rows=955000 loops=1)\n  Workers Planned: 4\n  Workers Launched: 4\n  ->  Parallel Seq Scan on tabla_grande  (cost=0.00..44565.09 rows=237409 width=97)\n                                          (actual time=0.039..51.941 rows=191000 loops=5)\nPlanning Time: 0.093 ms\nExecution Time: 209.745 ms<\/code><\/pre>\n\n\n\n<p>El nodo <code>Gather<\/code> es el \u00abmanager\u00bb: espera que los 4 workers terminen y combina los resultados. Fijate que <code>Workers Planned: 4<\/code> == <code>Workers Launched: 4<\/code> \u2014 si fueran distintos, el sistema estaba bajo presi\u00f3n de recursos.<\/p>\n\n\n\n<p>Overhead del Gather = Execution Time \u2212 (actual time del Seq Scan) = 209ms \u2212 173ms \u2248 37ms. Ese es el \u00abimpuesto\u00bb de la paralelizaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tipos de nodos m\u00e1s comunes<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Nodo<\/th><th>Qu\u00e9 hace<\/th><\/tr><\/thead><tbody><tr><td><strong>Seq Scan<\/strong><\/td><td>Lee toda la tabla secuencialmente<\/td><\/tr><tr><td><strong>Index Scan<\/strong><\/td><td>Usa un \u00edndice B-tree para acceder directamente a las filas<\/td><\/tr><tr><td><strong>Bitmap Heap Scan<\/strong><\/td><td>Lee filas usando un bitmap generado por un \u00edndice<\/td><\/tr><tr><td><strong>Nested Loop<\/strong><\/td><td>Para cada fila del outer, busca en el inner. Bueno para sets peque\u00f1os<\/td><\/tr><tr><td><strong>Hash Join<\/strong><\/td><td>Construye un hash de una tabla y lo usa para hacer join. Bueno para sets grandes<\/td><\/tr><tr><td><strong>Merge Join<\/strong><\/td><td>Join sobre dos tablas ya ordenadas<\/td><\/tr><tr><td><strong>Sort<\/strong><\/td><td>Ordena filas. Costo de startup alto<\/td><\/tr><tr><td><strong>Aggregate<\/strong><\/td><td>Ejecuta funciones como SUM, COUNT, etc.<\/td><\/tr><tr><td><strong>Gather<\/strong><\/td><td>Recolector de resultados paralelos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Checklist: qu\u00e9 buscar en cada plan<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n  <li>&#x2705; <strong>Estimated rows vs Actual rows<\/strong> \u2014 Si difieren por m\u00e1s de 10x, corr\u00e9 <code>ANALYZE<\/code> para actualizar estad\u00edsticas.<\/li>\n  <li>&#x2705; <strong>Rows Removed by Filter alto<\/strong> \u2014 Se\u00f1al de que falta un \u00edndice.<\/li>\n  <li>&#x2705; <strong>Seq Scan en tabla grande<\/strong> \u2014 Analiz\u00e1 si un \u00edndice lo convierte en Index Scan.<\/li>\n  <li>&#x2705; <strong>loops > 1<\/strong> \u2014 Multiplic\u00e1 rows \u00d7 loops para el total real.<\/li>\n  <li>&#x2705; <strong>Sort \/ Hash con costo alto<\/strong> \u2014 Puede que <code>work_mem<\/code> sea bajo y est\u00e9 spilling a disco.<\/li>\n  <li>&#x2705; <strong>Workers Planned \u2260 Workers Launched<\/strong> \u2014 El sistema estaba bajo presi\u00f3n de recursos.<\/li>\n  <li>&#x2705; <strong>Planning Time > 50ms<\/strong> \u2014 Demasiados joins o particiones en la query.<\/li>\n  <li>&#x2705; <strong>Execution Time<\/strong> \u2014 El n\u00famero final que compar\u00e1s contra tu SLA.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Opciones \u00fatiles de EXPLAIN<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Ver I\/O por nodo (cu\u00e1ntos bloques de 8kB lee\/escribe)\nEXPLAIN (ANALYZE, BUFFERS) SELECT ...;\n\n-- Salida en JSON para procesar con herramientas\nEXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;\n\n-- Todo junto: stats completas\nEXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT ...;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Herramientas para visualizar planes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><a href=\"https:\/\/explain.depesz.com\" target=\"_blank\" rel=\"noopener\">explain.depesz.com<\/a> \u2014 Peg\u00e1s el output y te lo colorea e interpreta<\/li>\n  <li><a href=\"https:\/\/explain.dalibo.com\" target=\"_blank\" rel=\"noopener\">explain.dalibo.com<\/a> \u2014 Visualizaci\u00f3n gr\u00e1fica del \u00e1rbol<\/li>\n  <li><strong>pgAdmin<\/strong> \u2014 Incluye visor visual de EXPLAIN integrado<\/li>\n  <li><strong>DataGrip \/ DBeaver<\/strong> \u2014 IDEs con soporte nativo para EXPLAIN visual<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Leer <code>EXPLAIN ANALYZE<\/code> es una habilidad que se construye con pr\u00e1ctica. Los conceptos clave son simples: comparar estimaciones vs. realidad, entender el loops, identificar scans costosos y actuar en consecuencia. Una vez que lo domin\u00e1s, ten\u00e9s una ventana directa a lo que PostgreSQL est\u00e1 pensando \u2014 y eso vale oro para optimizar performance.<\/p>\n\n\n\n<p><em>\u00bfTen\u00e9s alg\u00fan plan dif\u00edcil de interpretar? Dejalo en los comentarios y lo analizamos juntos.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprend\u00e9 a leer e interpretar EXPLAIN ANALYZE en PostgreSQL paso a paso: qu\u00e9 son los nodos, c\u00f3mo entender los 5 n\u00fameros clave, ejemplos reales de Seq Scan vs Index Scan y un checklist para detectar problemas de performance.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[229],"tags":[468,465,92,470,230,232,466,467,469],"class_list":["post-1331","post","type-post","status-publish","format-standard","hentry","category-postgres","tag-database-performance","tag-explain-analyze","tag-index","tag-performance-tuning","tag-postgres","tag-postgresql","tag-query-optimization","tag-query-plan","tag-seq-scan"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Aprend\u00e9 a leer e interpretar EXPLAIN ANALYZE en PostgreSQL paso a paso: qu\u00e9 son los nodos, c\u00f3mo entender los 5 n\u00fameros clave, ejemplos reales de Seq Scan vs Index Scan y un checklist para detectar problemas de performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-01T21:56:36+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos\",\"datePublished\":\"2026-04-01T21:56:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/\"},\"wordCount\":802,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"database performance\",\"EXPLAIN ANALYZE\",\"index\",\"performance tuning\",\"postgres\",\"postgresql\",\"query optimization\",\"query plan\",\"Seq Scan\"],\"articleSection\":[\"POSTGRES\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/\",\"name\":\"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-04-01T21:56:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal","og_description":"Aprend\u00e9 a leer e interpretar EXPLAIN ANALYZE en PostgreSQL paso a paso: qu\u00e9 son los nodos, c\u00f3mo entender los 5 n\u00fameros clave, ejemplos reales de Seq Scan vs Index Scan y un checklist para detectar problemas de performance.","og_url":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-04-01T21:56:36+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos","datePublished":"2026-04-01T21:56:36+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/"},"wordCount":802,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["database performance","EXPLAIN ANALYZE","index","performance tuning","postgres","postgresql","query optimization","query plan","Seq Scan"],"articleSection":["POSTGRES"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/","url":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/","name":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-04-01T21:56:36+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/como-leer-explain-analyze-en-postgresql-guia-practica-con-ejemplos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo leer EXPLAIN ANALYZE en PostgreSQL: gu\u00eda pr\u00e1ctica con ejemplos"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1331"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1331\/revisions"}],"predecessor-version":[{"id":1332,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1331\/revisions\/1332"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}