<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anshu Aditya</title>
    <description>The latest articles on DEV Community by Anshu Aditya (@anshuad14312398).</description>
    <link>https://dev.to/anshuad14312398</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1245596%2F2fc50034-99d0-4873-966c-9b8c018b14fb.png</url>
      <title>DEV Community: Anshu Aditya</title>
      <link>https://dev.to/anshuad14312398</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anshuad14312398"/>
    <language>en</language>
    <item>
      <title>I Built a Free PostgreSQL Internals Course — Here's What I Learned</title>
      <dc:creator>Anshu Aditya</dc:creator>
      <pubDate>Wed, 28 Jan 2026 20:38:14 +0000</pubDate>
      <link>https://dev.to/anshuad14312398/i-built-a-free-postgresql-internals-course-heres-what-i-learned-4871</link>
      <guid>https://dev.to/anshuad14312398/i-built-a-free-postgresql-internals-course-heres-what-i-learned-4871</guid>
      <description>&lt;p&gt;Ever wondered what &lt;em&gt;actually&lt;/em&gt; happens when you run &lt;code&gt;SELECT * FROM users&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;I did too. So I spent weeks diving into PostgreSQL's source code, documentation, and internals. Instead of keeping these learnings to myself, I documented everything into a comprehensive course.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result: 33 detailed lessons covering PostgreSQL from SQL parsing to disk I/O.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🐘 Why PostgreSQL Internals?
&lt;/h2&gt;

&lt;p&gt;Most developers treat databases as black boxes. You write SQL, and either it's fast or it's slow. If it's slow, you add an index and hope for the best.&lt;/p&gt;

&lt;p&gt;But understanding &lt;em&gt;how&lt;/em&gt; PostgreSQL works changes everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You'll know &lt;strong&gt;why&lt;/strong&gt; your query is slow, not just &lt;em&gt;that&lt;/em&gt; it's slow&lt;/li&gt;
&lt;li&gt;You'll make informed decisions about indexes, schema design, and configuration&lt;/li&gt;
&lt;li&gt;You'll debug production issues with confidence&lt;/li&gt;
&lt;li&gt;You'll read &lt;code&gt;EXPLAIN&lt;/code&gt; output like a pro&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 What's Inside
&lt;/h2&gt;

&lt;p&gt;The course covers the complete PostgreSQL architecture:&lt;/p&gt;

&lt;h3&gt;
  
  
  Query Processing Pipeline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parser&lt;/strong&gt; → Transforms SQL text into an AST&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzer&lt;/strong&gt; → Semantic analysis and name resolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rewriter&lt;/strong&gt; → View expansion and rule application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planner&lt;/strong&gt; → Cost-based query optimization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executor&lt;/strong&gt; → Actually runs the query plan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Storage Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Heap Storage&lt;/strong&gt; — How tables are stored on disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page Layout&lt;/strong&gt; — The 8KB building blocks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TOAST&lt;/strong&gt; — How PostgreSQL handles large values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HOT Updates&lt;/strong&gt; — Optimizing updates without index changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Concurrency &amp;amp; Transactions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MVCC&lt;/strong&gt; — How reads don't block writes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Isolation&lt;/strong&gt; — Read Committed vs Serializable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locking&lt;/strong&gt; — Table locks, row locks, advisory locks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VACUUM&lt;/strong&gt; — Why dead tuples accumulate and how to clean them&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;B-tree, GIN, GiST, BRIN Indexes&lt;/strong&gt; — When to use each&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join Algorithms&lt;/strong&gt; — Nested Loop, Hash, Merge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Query&lt;/strong&gt; — Using multiple cores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Model&lt;/strong&gt; — How the planner estimates query costs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming &amp;amp; Logical Replication&lt;/strong&gt; — High availability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partitioning&lt;/strong&gt; — Managing large tables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Pooling&lt;/strong&gt; — Scaling connections with PgBouncer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background Processes&lt;/strong&gt; — Autovacuum, checkpointer, WAL writer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Sample: How MVCC Works
&lt;/h2&gt;

&lt;p&gt;Here's a taste of what's in the course. Every row in PostgreSQL has hidden system columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- You can actually see these!&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xmin&lt;/code&gt;: Transaction ID that created this row&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xmax&lt;/code&gt;: Transaction ID that deleted/updated this row (0 if still live)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ctid&lt;/code&gt;: Physical location (page, offset)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you UPDATE a row, PostgreSQL doesn't modify it in place. It creates a NEW version:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old row: xmin=100, xmax=101, data="Alice"   ← Now dead
New row: xmin=101, xmax=0,   data="Alicia"  ← Current version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is MVCC — old versions are kept for concurrent readers. VACUUM cleans them up later.&lt;/p&gt;
&lt;h2&gt;
  
  
  💡 Key Insights
&lt;/h2&gt;

&lt;p&gt;After going through the internals, here are my biggest takeaways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Everything is a page&lt;/strong&gt;&lt;br&gt;
PostgreSQL stores everything in 8KB pages — heap data, indexes, even system catalogs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Updates are actually INSERT + DELETE&lt;/strong&gt;&lt;br&gt;
MVCC means updates create new row versions. That's why VACUUM exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The planner is cost-based&lt;/strong&gt;&lt;br&gt;
It estimates I/O and CPU costs based on statistics. Wrong statistics = wrong plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Index scans aren't always better&lt;/strong&gt;&lt;br&gt;
For queries returning &amp;gt;15% of rows, sequential scans often win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. HOT updates are magic&lt;/strong&gt;&lt;br&gt;
Updates to non-indexed columns skip index maintenance entirely.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔧 Each Lesson Includes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conceptual explanations with ASCII diagrams&lt;/li&gt;
&lt;li&gt;Real examples you can run&lt;/li&gt;
&lt;li&gt;Source code references to PostgreSQL internals&lt;/li&gt;
&lt;li&gt;Hands-on exercises&lt;/li&gt;
&lt;li&gt;Key takeaways&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  📊 Course Stats
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lessons&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modules&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of content&lt;/td&gt;
&lt;td&gt;22,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hands-on exercises&lt;/td&gt;
&lt;td&gt;150+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;FREE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  🔗 Get the Course
&lt;/h2&gt;

&lt;p&gt;The entire course is open source on GitHub:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Iamanshuaditya" rel="noopener noreferrer"&gt;
        Iamanshuaditya
      &lt;/a&gt; / &lt;a href="https://github.com/Iamanshuaditya/postgresql-deep-dive" rel="noopener noreferrer"&gt;
        postgresql-deep-dive
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Master PostgreSQL Internals: A comprehensive deep-dive from SQL parsing to disk I/O. Covers MVCC, WAL, VACUUM, Indexing, and Query Execution.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PostgreSQL Internals Course&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A comprehensive deep-dive into PostgreSQL's internal architecture, from SQL parsing to disk I/O.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 What You'll Learn&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This course takes you through PostgreSQL's source code and internal mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Query Processing Pipeline&lt;/strong&gt;: Parser → Analyzer → Rewriter → Planner → Executor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage Engine&lt;/strong&gt;: Heap storage, page layout, TOAST, tablespaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index Internals&lt;/strong&gt;: B-tree, GIN, GiST, BRIN, Hash indexes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Management&lt;/strong&gt;: Buffer pool, shared memory, work_mem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MVCC &amp;amp; Concurrency&lt;/strong&gt;: Transaction isolation, visibility, locking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WAL &amp;amp; Durability&lt;/strong&gt;: Write-ahead logging, checkpoints, recovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VACUUM &amp;amp; Maintenance&lt;/strong&gt;: Dead tuple cleanup, XID wraparound prevention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Optimization&lt;/strong&gt;: Join algorithms, parallel execution, cost model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replication&lt;/strong&gt;: Streaming and logical replication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Topics&lt;/strong&gt;: Partitioning, extensions, connection pooling&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📚 Course Structure&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Module 1: Foundation — From SQL to Execution&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Lesson&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://github.com/Iamanshuaditya/postgresql-deep-dive/lessons/module_01_foundation/lesson_01_query_journey.md" rel="noopener noreferrer"&gt;How PostgreSQL Processes a Query&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://github.com/Iamanshuaditya/postgresql-deep-dive/lessons/module_01_foundation/lesson_02_parser.md" rel="noopener noreferrer"&gt;The Parser — Transforming SQL Into Internal Structures&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://github.com/Iamanshuaditya/postgresql-deep-dive/lessons/module_01_foundation/lesson_03_analyzer.md" rel="noopener noreferrer"&gt;The Analyzer —&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Iamanshuaditya/postgresql-deep-dive" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;p&gt;Clone it, read it offline, contribute improvements, or just give it a ⭐!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have questions about PostgreSQL internals?&lt;/strong&gt; Drop them in the comments!&lt;/p&gt;

&lt;p&gt;What topic would you like me to cover next?&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>learning</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
