{"id":6190,"date":"2026-07-29T07:00:00","date_gmt":"2026-07-29T04:00:00","guid":{"rendered":"https:\/\/www.dataplatform.gr\/?p=6190"},"modified":"2026-08-28T15:03:26","modified_gmt":"2026-08-28T12:03:26","slug":"ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2","status":"publish","type":"post","link":"https:\/\/www.dataplatform.gr\/en\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/","title":{"rendered":"What is MVCC and Vacuum in PostgreSQL database and how do we avoid Bloat?"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In this article we will see how the <strong>PostgreSQL <\/strong>manages concurrent access through the <strong>MVCC<\/strong>, what is the <strong>Bloat<\/strong>, what is the <strong>Data Churn<\/strong>, what is the <strong>Vacuum <\/strong>and how do we set it up correctly with <strong>Autovacuum<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is MVCC (Multi-Version Concurrency Control)?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>MVCC <\/strong>is the mechanism that allows a database to serve multiple users simultaneously without blocking reads (<code>SELECT<\/code>) from writes (<code>INSERT<\/code>\/<code>UPDATE<\/code>\/<code>DELETE<\/code>) and vice versa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a <code>UPDATE<\/code> the <code>DELETE<\/code> In PostgreSQL, the old record is not immediately deleted or rewritten to memory or disk. Instead, it is marked as <em>dead tuple<\/em> (old version) and at the same time a new version of the record is created for the current state of the database.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is Data Churn and How Does Table Bloat Occur?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When we talk about <strong>Data Churn<\/strong>, we refer to the frequency with which they are performed <code>UPDATE<\/code> and <code>DELETE<\/code> in a table. Tables that are constantly changing have high churn. Because PostgreSQL, due to MVCC, does not overwrite data but creates new versions, high churn produces dead tuples incessantly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Table \/ Index Bloat<\/strong>  is the direct result of this phenomenon. It occurs when the physical space occupied by a table or index on disk is much larger than the space occupied by the actual, active data. If the <strong>Autovacuum <\/strong>does not have time to clean up these dead tuples, the database fills up with empty space, forcing queries to read many more data pages and delay unnecessarily.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MVCC Comparison: PostgreSQL vs Oracle vs SQL Server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Although all three databases achieve isolated reads without locks, their internal implementation differs significantly:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Oracle (UNDO Tablespace):<\/strong> Old versions of the data are written to the Undo Segment. The table always contains only the current version of the data.<\/li>\n\n\n\n<li><strong>SQL Server (Snapshot Isolation):<\/strong> It uses Row Versioning, where old versions of rows are kept in the <code>tempdb<\/code> (Version Store).<\/li>\n\n\n\n<li><strong>PostgreSQL (In-Place Versioning):<\/strong> It does not have a separate UNDO tablespace. All old versions of the rows (<em>dead tuples<\/em>) are stored within the table data files themselves. This creates table &amp; index bloat, making the Vacuum process absolutely mandatory.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">How do we find the boards that need cleaning?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To identify which tables we need to clean up, we use the view <code>pg_stat_user_tables<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The following query returns the percentage of dead tuples and automatically generates a ready-made query for it.<strong> <code>VACUUM ANALYSIS<\/code><\/strong> for immediate execution:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\" data-no-translation=\"\" data-no-auto-translation=\"\">SELECT \n    schemaname,\n    relname AS table_name,\n    n_live_tup AS live_tuples,\n    n_dead_tup AS dead_tuples,\n    -- Calculate dead tuples percentage over total rows\n    CASE \n        WHEN (n_live_tup + n_dead_tup) > 0 \n        THEN ROUND(100.0 * n_dead_tup \/ (n_live_tup + n_dead_tup), 2) \n        ELSE 0 \n    END AS dead_tuple_percent,\n    last_vacuum,\n    last_autovacuum,\n    \n    -- Ready-to-use Vacuum Analyze command for immediate execution\n    format('VACUUM ANALYZE %I.%I;', schemaname, relname) AS vacuum_cmd\n\nFROM pg_stat_user_tables\nWHERE n_dead_tup >= 0 -- Filter tables with dead tuples (change to > 1000 for stricter check)\nORDER BY dead_tuples DESC;<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01-1024x409.png\" alt=\"\" class=\"wp-image-6034\" srcset=\"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01-1024x409.png 1024w, https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01-300x120.png 300w, https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01-768x307.png 768w, https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01-18x7.png 18w, https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2026\/07\/pgmv-01.png 1231w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The query returns the following fields, each of which provides useful information:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>schema name<\/code><\/strong>: The schema to which the table belongs (e.g. <code>public<\/code>).<\/li>\n\n\n\n<li><strong><code>table_name<\/code><\/strong>: The name of the table.<\/li>\n\n\n\n<li><strong><code>live_tuples<\/code> (<code>n_live_tup<\/code>)<\/strong>: The number of active\/live recordings.<\/li>\n\n\n\n<li><strong><code>dead_tuples<\/code> (<code>n_dead_tup<\/code>)<\/strong>: The number of dead records awaiting cleanup.<\/li>\n\n\n\n<li><strong><code>dead_tuple_percent<\/code><\/strong>: The percentage of dead records out of the total table (bloat index).<\/li>\n\n\n\n<li><strong><code>last_vacuum<\/code><\/strong>: Date\/time last executed manually <code>VACUUM<\/code>.<\/li>\n\n\n\n<li><strong><code>last_autovacuum<\/code><\/strong>: Date\/time the automation was last run <code>autovacuum<\/code>.<\/li>\n\n\n\n<li><strong><code>vacuum_cmd<\/code><\/strong>: Ready-made SQL command generated dynamically for you to run directly <code>VACUUM ANALYSIS<\/code> in the specific table.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Autovacuum vs Manual Vacuum<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cleanup in PostgreSQL can be done either automatically or manually:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autovacuum<\/strong> It is a mechanism that runs continuously, monitors table statistics, and once it detects that the number of dead tuples has exceeded a certain threshold, it automatically starts the cleaning process. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the other hand, the <strong>Manual Vacuum (<code>VACUUM ANALYSIS<\/code>)<\/strong> we run it regularly or after mass <code>DELETE<\/code>\/<code>UPDATE<\/code>. Frees up dead tuple space within the table&#039;s data pages for future use. <code>INSERT<\/code>\/<code>UPDATE<\/code> and at the same time updates the query planner statistics. It is worth noting that simple Vacuum does not return the space to the operating system, so it is required <code>VACUUM FULL<\/code>, which however takes an exclusive lock on the table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, for manual cleaning we run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\" data-no-translation=\"\" data-no-auto-translation=\"\">VACUUM ANALYZE public.my_table;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tuning and Best Practices for Autovacuum<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The default settings for Autovacuum in PostgreSQL are designed for small environments. In production databases with high workloads, tuning is required either at the database level (<code>postgresql.conf<\/code>) or at the table level:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most important parameter is the <strong>autovacuum_vacuum_scale_factor <\/strong>(default: 0.20). Specifies that the 20% of a table&#039;s records must be changed to activate autovacuum. In large tables, 20% is a huge number. Therefore, the recommended tactic is to lower it to 0.05 (5%) globally in the database or locally in the tables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At the same time, the parameter <strong>autovacuum_max_workers <\/strong>(default: 3) determines how many parallel processes can vacuum different tables simultaneously. On servers with many CPU cores, it is a good idea to increase this to 6 or 8.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, the <strong>autovacuum_vacuum_cost_limit <\/strong>(default: 200) limits the I\/O consumed by autovacuum so that it does not affect the application. On fast disks, the value 200 is too conservative and delays cleanups. We can increase it to 1000 or 2000 so that cleanups complete very quickly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if we want to change the scale factor globally at the database level, we change to <code>postgresql.conf<\/code> the following parameter:<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-translation=\"\" data-no-auto-translation=\"\"><code>autovacuum_vacuum_scale_factor = 0.05<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">However, if we want to change it only in a specific table, we run the following:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\" data-no-translation=\"\" data-no-auto-translation=\"\">ALTER TABLE public.table\nSET (autovacuum_vacuum_scale_factor = 0.05);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.postgresql.org\/docs\/current\/\" data-type=\"link\" data-id=\"https:\/\/www.postgresql.org\/docs\/current\/\">PostgreSQL 18.4 Documentation<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>In this article we will see how PostgreSQL manages concurrent access through MVCC, what is Bloat, what is Data Churn, what is Vacuum and how to configure it correctly with Autovacuum. What is MVCC (Multi-Version Concurrency Control) MVCC is the mechanism that allows a database [\u2026]<\/p>","protected":false},"author":1,"featured_media":2376,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,123],"tags":[29,48,124,30],"class_list":["post-6190","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-databases","category-postgresql","tag-databases","tag-performance_tuning","tag-postgresql","tag-rdbms"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr<\/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:\/\/www.dataplatform.gr\/en\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr\" \/>\n<meta property=\"og:description\" content=\"\u03a3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03ac\u03c1\u03b8\u03c1\u03bf \u03b8\u03b1 \u03b4\u03bf\u03cd\u03bc\u03b5 \u03c0\u03ce\u03c2 \u03b7 PostgreSQL \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03c4\u03b7 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c7\u03c1\u03bf\u03bd\u03b7 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 MVCC, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Bloat, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Data Churn, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Vacuum \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03c4\u03bf \u03c1\u03c5\u03b8\u03bc\u03af\u03b6\u03bf\u03c5\u03bc\u03b5 \u03c3\u03c9\u03c3\u03c4\u03ac \u03bc\u03b5 \u03c4\u03bf Autovacuum. \u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC (Multi-Version Concurrency Control) \u03a4\u03bf MVCC \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf \u03bc\u03b7\u03c7\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dataplatform.gr\/en\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/\" \/>\n<meta property=\"og:site_name\" content=\"DataPlatform.gr\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/dataplatform.gr\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-29T04:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-28T12:03:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Stratos Matzouranis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Stratos Matzouranis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/\"},\"author\":{\"name\":\"Stratos Matzouranis\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#\\\/schema\\\/person\\\/e87bf4fd02b65cb6aa0942f87245bbaf\"},\"headline\":\"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat\",\"datePublished\":\"2026-07-29T04:00:00+00:00\",\"dateModified\":\"2026-08-28T12:03:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/\"},\"wordCount\":142,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/db_postgresql.png\",\"keywords\":[\"Databases\",\"Performance Tuning\",\"PostgreSQL\",\"RDBMS\"],\"articleSection\":[\"Databases\",\"PostgreSQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/\",\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/\",\"name\":\"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/db_postgresql.png\",\"datePublished\":\"2026-07-29T04:00:00+00:00\",\"dateModified\":\"2026-08-28T12:03:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/db_postgresql.png\",\"contentUrl\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/db_postgresql.png\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0391\u03c1\u03c7\u03b9\u03ba\u03ae\",\"item\":\"https:\\\/\\\/www.dataplatform.gr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Databases\",\"item\":\"https:\\\/\\\/www.dataplatform.gr\\\/category\\\/databases\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PostgreSQL\",\"item\":\"https:\\\/\\\/www.dataplatform.gr\\\/category\\\/databases\\\/postgresql\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#website\",\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/\",\"name\":\"dataplatform.gr - Sky is not the limit!\",\"description\":\"\u0398\u03b5\u03c9\u03c1\u03af\u03b1, \u03bf\u03b4\u03b7\u03b3\u03bf\u03af \u03ba\u03b1\u03b9 \u03c3\u03ba\u03ad\u03c8\u03b5\u03b9\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03bf\u03c5\u03bb\u03b5\u03b9\u03ac \u03c3\u03b1\u03c2 \u03c0\u03b9\u03bf \u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03b9\u03ba\u03ac \u03ba\u03b1\u03b9 \u03c0\u03b9\u03bf \u03b5\u03cd\u03ba\u03bf\u03bb\u03b1 \u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03b9\u03c2 \u03b2\u03ac\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd, \u03c3\u03c4\u03b7\u03bd SQL, \u03c3\u03c4\u03bf Business Intelligence \u03ba\u03b1\u03b9 \u03c3\u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b5\u03bd\u03b9\u03ba\u03cc\u03c4\u03b5\u03c1\u03b1.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dataplatform.gr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#organization\",\"name\":\"dataplatform.gr\",\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/dp_logo_wbacki.png\",\"contentUrl\":\"https:\\\/\\\/www.dataplatform.gr\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/dp_logo_wbacki.png\",\"width\":322,\"height\":139,\"caption\":\"dataplatform.gr\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/dataplatform.gr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/dataplatform-gr\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dataplatform.gr\\\/#\\\/schema\\\/person\\\/e87bf4fd02b65cb6aa0942f87245bbaf\",\"name\":\"Stratos Matzouranis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g\",\"caption\":\"Stratos Matzouranis\"},\"sameAs\":[\"https:\\\/\\\/www.dataplatform.gr\"],\"url\":\"https:\\\/\\\/www.dataplatform.gr\\\/en\\\/author\\\/stratos-matzouranis\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr","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:\/\/www.dataplatform.gr\/en\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/","og_locale":"en_US","og_type":"article","og_title":"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr","og_description":"\u03a3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03ac\u03c1\u03b8\u03c1\u03bf \u03b8\u03b1 \u03b4\u03bf\u03cd\u03bc\u03b5 \u03c0\u03ce\u03c2 \u03b7 PostgreSQL \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03c4\u03b7 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c7\u03c1\u03bf\u03bd\u03b7 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 MVCC, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Bloat, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Data Churn, \u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf Vacuum \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03c4\u03bf \u03c1\u03c5\u03b8\u03bc\u03af\u03b6\u03bf\u03c5\u03bc\u03b5 \u03c3\u03c9\u03c3\u03c4\u03ac \u03bc\u03b5 \u03c4\u03bf Autovacuum. \u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC (Multi-Version Concurrency Control) \u03a4\u03bf MVCC \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf \u03bc\u03b7\u03c7\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd [&hellip;]","og_url":"https:\/\/www.dataplatform.gr\/en\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/","og_site_name":"DataPlatform.gr","article_publisher":"https:\/\/www.facebook.com\/dataplatform.gr\/","article_published_time":"2026-07-29T04:00:00+00:00","article_modified_time":"2026-08-28T12:03:26+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png","type":"image\/png"}],"author":"Stratos Matzouranis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Stratos Matzouranis","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#article","isPartOf":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/"},"author":{"name":"Stratos Matzouranis","@id":"https:\/\/www.dataplatform.gr\/#\/schema\/person\/e87bf4fd02b65cb6aa0942f87245bbaf"},"headline":"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat","datePublished":"2026-07-29T04:00:00+00:00","dateModified":"2026-08-28T12:03:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/"},"wordCount":142,"commentCount":0,"publisher":{"@id":"https:\/\/www.dataplatform.gr\/#organization"},"image":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png","keywords":["Databases","Performance Tuning","PostgreSQL","RDBMS"],"articleSection":["Databases","PostgreSQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/","url":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/","name":"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat - DataPlatform.gr","isPartOf":{"@id":"https:\/\/www.dataplatform.gr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#primaryimage"},"image":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png","datePublished":"2026-07-29T04:00:00+00:00","dateModified":"2026-08-28T12:03:26+00:00","breadcrumb":{"@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#primaryimage","url":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png","contentUrl":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/10\/db_postgresql.png","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/www.dataplatform.gr\/ti-to-mvcc-to-vacuum-sti-vasi-dedomenon-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0391\u03c1\u03c7\u03b9\u03ba\u03ae","item":"https:\/\/www.dataplatform.gr\/"},{"@type":"ListItem","position":2,"name":"Databases","item":"https:\/\/www.dataplatform.gr\/category\/databases\/"},{"@type":"ListItem","position":3,"name":"PostgreSQL","item":"https:\/\/www.dataplatform.gr\/category\/databases\/postgresql\/"},{"@type":"ListItem","position":4,"name":"\u03a4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf MVCC \u03ba\u03b1\u03b9 \u03c4\u03bf Vacuum \u03c3\u03c4\u03b7 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 PostgreSQL \u03ba\u03b1\u03b9 \u03c0\u03ce\u03c2 \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03bf Bloat"}]},{"@type":"WebSite","@id":"https:\/\/www.dataplatform.gr\/#website","url":"https:\/\/www.dataplatform.gr\/","name":"dataplatform.gr - Sky is not the limit!","description":"\u0398\u03b5\u03c9\u03c1\u03af\u03b1, \u03bf\u03b4\u03b7\u03b3\u03bf\u03af \u03ba\u03b1\u03b9 \u03c3\u03ba\u03ad\u03c8\u03b5\u03b9\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03bf\u03c5\u03bb\u03b5\u03b9\u03ac \u03c3\u03b1\u03c2 \u03c0\u03b9\u03bf \u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03b9\u03ba\u03ac \u03ba\u03b1\u03b9 \u03c0\u03b9\u03bf \u03b5\u03cd\u03ba\u03bf\u03bb\u03b1 \u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03b9\u03c2 \u03b2\u03ac\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd, \u03c3\u03c4\u03b7\u03bd SQL, \u03c3\u03c4\u03bf Business Intelligence \u03ba\u03b1\u03b9 \u03c3\u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b5\u03bd\u03b9\u03ba\u03cc\u03c4\u03b5\u03c1\u03b1.","publisher":{"@id":"https:\/\/www.dataplatform.gr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dataplatform.gr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dataplatform.gr\/#organization","name":"dataplatform.gr","url":"https:\/\/www.dataplatform.gr\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dataplatform.gr\/#\/schema\/logo\/image\/","url":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/06\/dp_logo_wbacki.png","contentUrl":"https:\/\/www.dataplatform.gr\/wp-content\/uploads\/2020\/06\/dp_logo_wbacki.png","width":322,"height":139,"caption":"dataplatform.gr"},"image":{"@id":"https:\/\/www.dataplatform.gr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/dataplatform.gr\/","https:\/\/www.linkedin.com\/company\/dataplatform-gr\/"]},{"@type":"Person","@id":"https:\/\/www.dataplatform.gr\/#\/schema\/person\/e87bf4fd02b65cb6aa0942f87245bbaf","name":"Stratos Matzouranis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ab973bc4bd1673c43d45de5633a624d9ad13c06902dfdd5a6e3fd9885903865e?s=96&d=mm&r=g","caption":"Stratos Matzouranis"},"sameAs":["https:\/\/www.dataplatform.gr"],"url":"https:\/\/www.dataplatform.gr\/en\/author\/stratos-matzouranis\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/posts\/6190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/comments?post=6190"}],"version-history":[{"count":1,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/posts\/6190\/revisions"}],"predecessor-version":[{"id":6192,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/posts\/6190\/revisions\/6192"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/media\/2376"}],"wp:attachment":[{"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/media?parent=6190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/categories?post=6190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dataplatform.gr\/en\/wp-json\/wp\/v2\/tags?post=6190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}