<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Microsoft Blog for PostgreSQL articles</title>
    <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/bg-p/ADforPostgreSQL</link>
    <description>Microsoft Blog for PostgreSQL articles</description>
    <pubDate>Wed, 17 Jun 2026 07:15:18 GMT</pubDate>
    <dc:creator>ADforPostgreSQL</dc:creator>
    <dc:date>2026-06-17T07:15:18Z</dc:date>
    <item>
      <title>Build a Knowledge Graph in Azure HorizonDB with AI Functions and Apache AGE</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/build-a-knowledge-graph-in-azure-horizondb-with-ai-functions-and/ba-p/4523394</link>
      <description>&lt;P&gt;Knowledge graphs appear in every AI architecture diagram, every conference keynote and every AI strategy deck. Yet the most common question we hear from customers and engineers alike is: &lt;EM&gt;"&lt;/EM&gt;What does a knowledge graph actually do for me?"&lt;/P&gt;
&lt;P&gt;That is a fair question, and one worth answering clearly, because most teams already have a knowledge graph problem and do not realize it.&lt;/P&gt;
&lt;H4&gt;The connections your relational tables cannot surface&lt;/H4&gt;
&lt;P&gt;Picture this: five incident tickets land over a week. One says the auth service returned 503s after an API gateway update, which broke checkout. Another says the payment service lost connectivity to fraud detection through a DNS failure. A third says auth got rate-limited by that same API gateway after a config change.&lt;/P&gt;
&lt;P&gt;Each ticket makes sense on its own. But no one in your postmortem can answer: "What upstream services most commonly trigger failures that reach checkout?" That question requires tracing relationships across tickets, teams, services, and root causes. Your relational tables store the facts. They do not store the connections between them. That is a knowledge graph problem.&lt;/P&gt;
&lt;H4&gt;What becomes queryable once you have a knowledge graph&lt;/H4&gt;
&lt;P&gt;Once you build a graph from those tickets, every node is an entity (a service, a team, an incident) and every edge is a relationship (CAUSED_FAILURE_IN, OPERATES_ON, INVOLVES). The graph does not just store data differently. It makes&lt;STRONG&gt; &lt;/STRONG&gt;a new class of questions answerable:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;What is the most common upstream cause of checkout failures?&lt;/LI&gt;
&lt;LI&gt;Which team resolves the most cross-service incidents?&lt;/LI&gt;
&lt;LI&gt;Show me every cascading failure chain that touched the payment service in the last 90 days.&lt;/LI&gt;
&lt;LI&gt;What is the timeline of incidents involving the same shared service?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Each of these questions can be answered with a single Cypher query, without nested subqueries, recursive CTEs, or manually correlating data across spreadsheets.&lt;/P&gt;
&lt;H4&gt;Why graph-augmented RAG needs a knowledge graph first&lt;/H4&gt;
&lt;P&gt;Traditional RAG retrieves chunks of text by vector similarity. It works well when the answer lives in a single document. It falls apart when the answer requires&lt;STRONG&gt; &lt;/STRONG&gt;connecting facts across multiple documents. Ask "does this contract conflict with existing obligations?" and vector search returns a relevant clause. But it cannot follow links across regions, obligation types, and counterparties to prove a real conflict.&lt;/P&gt;
&lt;P&gt;Graph-augmented RAG combines vector search, semantic ranking, and graph traversal into one retrieval pipeline. The graph provides the structural context that vector search alone cannot: the actual chain of cause and effect, not just the five most similar paragraphs.&lt;/P&gt;
&lt;P&gt;But here is the catch most people miss: you cannot run graph-augmented RAG without a knowledge graph. And building the graph has always been the hard part. That is exactly what the new tutorial solves.&lt;/P&gt;
&lt;H4&gt;Building a knowledge graph in five steps inside Azure HorizonDB&lt;/H4&gt;
&lt;P&gt;We published a &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/horizondb/ai/build-knowledge-graph" target="_blank"&gt;hands-on tutorial&lt;/A&gt; on Microsoft Learn that takes you from raw incident tickets to a connected, queryable knowledge graph. No external NLP pipelines. No separate graph database. Just SQL.&lt;/P&gt;
&lt;P&gt;Here is the pipeline:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Extract entities and relationships&lt;/STRONG&gt; from unstructured text with azure_ai.extract(). The LLM parses services, teams, root causes, and relationship triples in one SQL call.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deduplicate entities&lt;/STRONG&gt; with azure_ai.generate() using structured JSON output. "API gateway," "api-gateway," and "the gateway service" collapse into one canonical node.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Load into an Apache AGE graph&lt;/STRONG&gt; using Cypher MERGE in PL/pgSQL loops. The tutorial builds service nodes, team nodes, incident hub nodes, all six relationship types, and a timeline chain linking incidents chronologically.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Query with Cypher traversals.&lt;/STRONG&gt; Variable-length path patterns like *1..3 trace cascading failure chains up to three hops deep.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Visualize results&lt;/STRONG&gt; in the PostgreSQL extension for VS Code, which renders Cypher output as an interactive node-edge graph.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The tutorial walks through every SQL statement, explains the tricky parts (like why EXECUTE format() is needed for parameterized Cypher, and how CROSS JOIN LATERAL expands team-service pairs correctly), and shows the exact output at each step.&lt;/P&gt;
&lt;H4&gt;The same pipeline applied to any domain&lt;/H4&gt;
&lt;P&gt;The tutorial uses incident tickets to keep things concrete. But the pipeline applies to any domain:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1008px; height: 989.334px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 38.6667px;"&gt;&lt;td style="height: 38.6667px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Domain&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.6667px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Key Entities&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.6667px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Question It Answers&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Contract intelligence&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Parties, clauses, obligations&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Does this new vendor contract conflict with existing obligations?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;E-commerce product catalog&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Products, categories, customers, orders&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;What do customers who bought X typically buy next?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 94.6667px;"&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Fraud detection&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Accounts, transactions, devices, IP addresses&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Which accounts are connected through shared devices and circular transfers?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Healthcare clinical data&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Patients, medications, conditions, providers&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Does this new prescription conflict with existing medications?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 94.6667px;"&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Codebase dependency analysis&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Tables, functions, views, triggers&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;If I alter this table, which downstream views and functions break?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Supply chain&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Suppliers, components, facilities&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Which tier-2 suppliers are single points of failure?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Research knowledge base&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Papers, authors, concepts&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;What evidence chain supports this treatment for condition X?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Data lineage and ETL&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Sources, transformations, dashboards&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;If this source schema changes, which dashboards break?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 94.6667px;"&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Identity and access management&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;Users, groups, roles, resources&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 94.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Which users have transitive access to production through nested groups?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Regulatory compliance&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Regulations, controls, systems&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;If this regulation changes, which controls need updating?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Customer 360&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Customers, interactions, campaigns&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;What sequence of touchpoints leads to churn for enterprise accounts?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Insurance claims&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Claimants, policies, events, providers&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;Which claims share overlapping parties or event timelines?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 66.6667px;"&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;M&amp;amp;A due diligence&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;Companies, IP assets, contracts, liabilities&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 66.6667px;"&gt;
&lt;P&gt;&lt;EM&gt;What hidden liabilities are linked to this acquisition target?&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;In every case, the shape is the same: azure_ai.extract() discovers the entities, azure_ai.generate() deduplicates them, and AGE stores and traverses the graph.&lt;/P&gt;
&lt;H4&gt;Get started&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;Tutorial: &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/horizondb/ai/build-knowledge-graph" target="_blank"&gt;Build a knowledge graph from unstructured text using AI Functions and Apache AGE&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Knowledge graph enhanced search:&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/horizondb/ai/graph-rag" target="_blank"&gt;Graph-augmented RAG patterns for Azure HorizonDB&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Solution accelerators:&lt;STRONG&gt; &lt;/STRONG&gt;&lt;A class="lia-external-url" href="https://github.com/Azure-Samples/graphrag-legalcases-postgres" target="_blank"&gt;GraphRAG Legal Research Copilot&lt;/A&gt;, &lt;A class="lia-external-url" href="https://github.com/Azure-Samples/postgreSQL-graphRAG-docker" target="_blank"&gt;GraphRAG with Docker and AI Agents&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;We would love to hear what you build. Share your feedback on the &lt;A class="lia-external-url" href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Faka.ms%2Fpostgres-hub-developer-forum&amp;amp;data=05%7C02%7CAditi.Gupta%40microsoft.com%7C5fb0d21296f449b0241a08debd5ec488%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C639156412747925051%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=pRV4mHamkdLHcnw2AL1g%2B%2F56CUioLbHCta0E2AekBlY%3D&amp;amp;reserved=0" target="_blank"&gt;PostgreSQL Hub developer forum&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Thank you!&lt;/P&gt;</description>
      <pubDate>Thu, 11 Jun 2026 17:42:46 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/build-a-knowledge-graph-in-azure-horizondb-with-ai-functions-and/ba-p/4523394</guid>
      <dc:creator>Aditi_Gupta</dc:creator>
      <dc:date>2026-06-11T17:42:46Z</dc:date>
    </item>
    <item>
      <title>Last Call: Join Live the PostgreSQL Community at POSETTE: An Event for Postgres 2026 (T‑1 week)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/last-call-join-live-the-postgresql-community-at-posette-an-event/ba-p/4527424</link>
      <description>&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In just one week, the PostgreSQL community gathers again for one of the most anticipated global moments of the year:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;POSETTE: An Event for Postgres 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. From June 16–18, this free and fully virtual event brings together PostgreSQL contributors, engineers, architects, and practitioners across 4 livestreams, 44 talks, and 50 speakers.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;But you might be wondering, why should I participate in POSETTE during the livestreams? Why join it live?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Explore the schedule and choose your livestreams on the official site:&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;A href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Join POSETTE: An Event for Postgres 2026&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Why joining live makes all the difference&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Yes, every talk will be available afterward. But the real value of POSETTE: An Event for Postgres 2026 happens while it is unfolding live.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Be part of the virtual hallway track&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Participating live gives you access to the #posetteconf &lt;A class="lia-external-url" href="https://discord.com/channels/723347736853741589/1197937060737187951" target="_blank" rel="noopener"&gt;Discord channel,&lt;/A&gt; where attendees and speakers interact in real time, asking questions, sharing perspectives, and comparing approaches.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is where conversations extend beyond the talks and where ideas are challenged and refined collectively.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Learn and &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;validate&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; your thinking in real time&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;POSETTE is not just about listening. It is about sharpening how you think about PostgreSQL:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Are you partitioning effectively?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Are you approaching replication with the right mental model?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Are your performance strategies aligned with how PostgreSQL actually behaves?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Joining live means you can test those ideas immediately with people who build and run PostgreSQL systems at scale.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Connect with practitioners solving the same problems&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;A recurring insight from POSETTE participants is how often they discover others facing the same challenges, whether around scaling, performance, or operability.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That shared experience often leads to the most valuable takeaways: not just what works, but why.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What makes this year’s speakers worth your time&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;POSETTE: An Event for Postgres 2026 brings together a diverse set of voices:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;PostgreSQL core contributors&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Engineers and architects working on production systems&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Specialists in performance, replication, and security&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Developers shaping how PostgreSQL is used in modern applications&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Azure Database for PostgreSQL and Azure HorizonDB engineers and experts&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;These are practitioners who have built, debugged, and scaled real systems, and who are ready to share what they learned.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Learn directly from the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;POSETTE speakers who are&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="heading 2"&gt;shaping PostgreSQL&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Bruce Momjian&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; understanding PostgreSQL from the inside out&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/bruce-momjian/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Bruce Momjian’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Bruce Momjian, a co-founder and core member of the PostgreSQL Global Development Group, has spent decades helping people understand how PostgreSQL really works. His session on the write-ahead log (WAL) reflects that same focus: taking something fundamental but often misunderstood and making it approachable.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you want to move beyond “using” PostgreSQL and start truly understanding its internals, how durability, recovery, and replication actually function, this is a rare opportunity to learn directly from someone who has helped build the system.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Chris Ellis&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; making PostgreSQL practical for developers&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/chris-ellis/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Chris Ellis’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Chris Ellis focuses on how to turn PostgreSQL’s extensive feature set into practical design choices. His session on design patterns highlights a reality many developers face: PostgreSQL offers powerful primitives, but knowing how to combine them effectively is what makes the difference.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;His work consistently centers on simplifying application architecture by using the database well, rather than pushing complexity into application code.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Chun Lin Goh&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; understanding performance in real environments&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/chun-lin-goh/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Chun Lin Goh’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Chun Lin Goh brings a cloud architecture and observability perspective to PostgreSQL performance. His session on performance degradation in burstable environments shows how the database behaves under real-world infrastructure constraints.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is especially relevant if you run PostgreSQL in cloud environments, where system behaviour, not just query design,can have a major impact.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Derk van Veen&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; lessons from real-world partitioning&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/derk-van-veen/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Derk van Veen’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Derk van Veen’s work is grounded in hands-on experience operating PostgreSQL at scale. His partitioning session focuses not just on how to do things right, but also on what can go wrong,and why.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Partitioning decisions often look simple early on but have long-term consequences. Learning from real mistakes and trade-offs is what makes these sessions so valuable.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Hari Kiran&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; thinking deeply about replication&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/hari-kiran/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Hari Kiran’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Hari Kiran’s session explores logical decoding and replication, two foundational aspects of how PostgreSQL systems scale and integrate with other systems.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If your work involves distributed systems, data pipelines, or event-driven architectures, understanding these mechanics is essential.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Jimmy Angelakos&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;uncovering subtle behavior&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/jimmy-angelakos/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Jimmy Angelakos’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Jimmy Angelakos focuses on practical, often overlooked aspects of PostgreSQL behavior. His session on NOTIFY highlights how features that seem simple on the surface can introduce complexity in real systems.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;These are exactly the kinds of nuances that can save hours or days of debugging in production.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Sakshi Nasha&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;securing PostgreSQL for production&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/sakshi-nasha/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Sakshi Nasha’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Sakshi Nasha’s work emphasizes security and production readiness. Her session on securing PostgreSQL reflects a broader shift: as PostgreSQL becomes central to more systems, security needs to be built in from the start.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Her perspective is especially relevant for teams moving from development environments into production systems.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Taiob Ali&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;connecting community and real-world usage&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/taiob-ali/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Taiob Ali’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Taiob Ali brings a strong community-driven perspective to PostgreSQL, shaped by experience as both a practitioner and an advocate.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Sessions like his often help bridge the gap between concepts and how PostgreSQL is actually used across different teams and environments.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Xuneng Zhou&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; an independent perspective from the ecosystem&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:246,&amp;quot;335559739&amp;quot;:246,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/speakers/xuneng-zhou/#interview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Read Xuneng Zhou’s interview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;As an independent PostgreSQL hacker, Xuneng Zhou represents a perspective deeply rooted in the open source ecosystem itself.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That viewpoint often brings a focus on fundamentals, experimentation, and how PostgreSQL evolves over time, valuable context for anyone who wants to understand not just where PostgreSQL is today, but where it is heading.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;This is more than a conference&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;POSETTE: An Event for Postgres 2026 is a shared moment for the PostgreSQL community.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;It is an opportunity to:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Learn from practitioners and contributors&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Challenge assumptions and refine your thinking&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Understand where PostgreSQL is heading next&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Stepping into the livestream is not just about attending talks, it is about participating in that moment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Your next step: join live&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If PostgreSQL is part of your work, or becoming central to it, the best way to experience POSETTE: An Event for Postgres 2026 is live.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Pick the sessions that matter to you.&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Add the livestreams to your calendar.&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Join the discussion as it happens.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Start here:&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;A href="https://posetteconf.com/2026/schedule/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Check out the POSETTE schedule to figure out which livestreams &amp;amp; which talks are for you.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For any other answer you may still have, don't forget to take a look at the&lt;/SPAN&gt; &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/ultimate-guide-to-posette-an-event-for-postgres-2026-edition/4520246" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Ultimate Guide to POSETTE: An Event &lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;f&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;or &lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Postgres 2026&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;See you live at POSETTE&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:261,&amp;quot;335559739&amp;quot;:261,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Whether you are exploring PostgreSQL internals, building modern applications, or scaling production systems, POSETTE: An Event for Postgres 2026 is where those conversations come together.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;See you at POSETTE on 16-18 June 2026.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:210,&amp;quot;335559739&amp;quot;:210,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Jun 2026 09:09:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/last-call-join-live-the-postgresql-community-at-posette-an-event/ba-p/4527424</guid>
      <dc:creator>scoriani</dc:creator>
      <dc:date>2026-06-11T09:09:00Z</dc:date>
    </item>
    <item>
      <title>What's new with Postgres at Microsoft, 2026 edition</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/what-s-new-with-postgres-at-microsoft-2026-edition/ba-p/4526963</link>
      <description>&lt;P&gt;A lot has happened with Postgres at Microsoft over the past year. This is the 2026 edition of our annual “what’s new” blog post, with highlights from the past 12–13 months—across both our managed services on Azure and our work in the upstream open source project.&lt;/P&gt;
&lt;P&gt;The infographic below pulls it all together—feature updates, new capabilities, and ongoing investments across our Postgres workstreams. You might notice it looks a bit different &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/whats-new-with-postgres-at-microsoft-2025-edition/4410710" target="_blank" rel="noopener"&gt;compared to last year&lt;/A&gt;: we redesigned the infographic to make space for two new sections—Azure HorizonDB (Preview) and Developer Tools.&lt;/P&gt;
&lt;P&gt;The table of contents follows the structure of the hand-made infographic, with each bullet linking to that section. Jump to what you care about, or settle in ☕️ and read the whole thing.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-azure-database-for-postgresql" target="_blank" rel="noopener" data-lia-auto-title="Azure Database for PostgreSQL flexible server" data-lia-auto-title-active="0"&gt;Azure Database for PostgreSQL flexible server&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-horizondb" target="_blank" rel="noopener" data-lia-auto-title="Azure HorizonDB" data-lia-auto-title-active="0"&gt;Azure HorizonDB&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-dev-tools" target="_blank" rel="noopener" data-lia-auto-title="Developer Tools" data-lia-auto-title-active="0"&gt;Developer Tools&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-postgres-core" target="_blank" rel="noopener" data-lia-auto-title="PostgreSQL core" data-lia-auto-title-active="0"&gt;PostgreSQL core&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-citus" target="_blank" rel="noopener" data-lia-auto-title="Citus open source" data-lia-auto-title-active="0"&gt;Citus open source&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-community" target="_blank" rel="noopener" data-lia-auto-title="Postgres Community" data-lia-auto-title-active="0"&gt;Postgres Community&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;&lt;STRONG&gt;Figure 1:&lt;/STRONG&gt; This infographic maps out the major workstreams across Microsoft’s Postgres efforts as of June 2026—from the managed database services on Azure, to VS Code and Cursor, to upstream contributions to the Postgres open source project. For much of the open source work, our contributions to PostgreSQL involve collaboration with people across the global PostgreSQL community, both inside and outside Microsoft.&lt;/P&gt;
&lt;/img&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-azure-database-for-postgresql" class="lia-anchor"&gt;&lt;/a&gt;Azure Database for PostgreSQL flexible server&lt;/H2&gt;
&lt;P&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;Azure Database for PostgreSQL flexible server is a managed database service on Azure that meets the needs of large enterprises, small to medium-sized businesses, and early-stage startups. Flexible Server continues to grow in capability month over month, as evident in the monthly “feature recap” blog posts on Microsoft Tech Community (props to Gauri Kasar for publishing these) in &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://review.learn.microsoft.com/en-us/product-style-guide-msft-internal/a_z_names_terms/a/azure-database-for-postgresql?branch=main" target="_blank" rel="noopener"&gt;June 2025&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/july-2025-recap-azure-database-for-postgresql/4439578" target="_blank" rel="noopener"&gt;July&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/august-2025-recap-azure-database-for-postgresql/4450527" target="_blank" rel="noopener"&gt;August&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/september-2025-recap-azure-database-for-postgresql/4459848" target="_blank" rel="noopener"&gt;September&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/october-2025-recap-azure-database-for-postgresql/4468818" target="_blank" rel="noopener"&gt;October&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/november-2025-recap-postgresql-on-azure/4477020" target="_blank" rel="noopener"&gt;November&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/january-2026-recap-azure-database-for-postgresql/4492408" target="_blank" rel="noopener"&gt;January 2026&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/february-2026-recap-azure-database-for-postgresql/4501093" target="_blank" rel="noopener"&gt;February&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/march-2026-recap-azure-database-for-postgresql/4511432" target="_blank" rel="noopener"&gt;March&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/april-2026-recap-azure-database-for-postgresql/4519772" target="_blank" rel="noopener"&gt;April&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TIP ON NAMING&lt;/STRONG&gt;: Throughout this post, we sometimes use the full name—Azure Database for PostgreSQL flexible server—and sometimes we just say “Flexible Server” for short. They mean the same thing. You might notice we use the two names interchangeably, so am flagging it here to avoid any confusion.&lt;/P&gt;
&lt;H3&gt;Performance &amp;amp; Scalability&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Premium SSDv2 storage: &lt;/STRONG&gt;With the general availability of Premium SSDv2 storage, significant performance and cost-efficiency improvements are now available for IO-intensive workloads. With SSDv2, storage and performance can be scaled independently so you only pay for what you use. Premium SSDv2 adds flexible server storage scaling up to 64TB, with up to 80,000 IOPS and 1,200 MiB/s throughput. (&lt;A href="https://learn.microsoft.com/azure/postgresql/compute-storage/concepts-storage-premium-ssd-v2" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Elastic Clusters support for Terraform, Bicep, &amp;amp; Ansible:&lt;/STRONG&gt; With the general availability of Elastic clusters, flexible server added built-in support for row-level and schema-level sharding of data across a cluster of servers. Built-on Citus open-source technology, elastic clusters provides horizontal scaling of workloads with all the enterprise features of flexible server. We’ve added infra-as-code support to deploy elastic clusters from Terraform, Bicep, and Ansible. (&lt;A href="https://learn.microsoft.com/azure/postgresql/elastic-clusters/concepts-elastic-clusters" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cascading read replicas: &lt;/STRONG&gt;With the general availability of cascading read replicas, you can not only create read replicas from the primary, but from other replicas too—enabling up to 30 replicas, more efficient distribution of read traffic, and more flexibility for complex deployment topologies. (&lt;A href="https://learn.microsoft.com/azure/postgresql/read-replica/concepts-read-replicas#create-cascading-read-replicas" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Intel &amp;amp; AMD v6 series SKUs: &lt;/STRONG&gt;The Intel &amp;amp; AMD v6 General Purpose and Memory Optimized SKUs deliver high-performance, massive scale and better price performance. Powered by 5th Gen Intel® Xeon® processor and AMD's fourth Generation EPYC™ 9004 processors you can scale up to 192 vCores and 1.8 TiB of memory. Using the NVMe protocol for data disk access you can leverage the maximum IOPS and throughput from high performance IO options like SSDv2.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/postgresql/compute-storage/concepts-compute" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;New Azure Advisor performance recommendations:&lt;/STRONG&gt; Azure Advisor provides proactive performance, resiliency, and security recommendations for your workloads. We added Index scan insights to improve query efficiency, audit logging review to identify excessive logging, statistics monitoring with alerts on statistics resets, storage optimization recommendations, and connection management guidance.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/advisor/advisor-reference-performance-recommendations#azure-database-for-postgresql" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PgBouncer upgrades: &lt;/STRONG&gt;PgBouncer is the built-in connection pooling feature for flexible server, providing the ability to scale to thousands of connections. Upgrading to 1.25.1 added enhanced protocol handling and important stability and security fixes. (&lt;A href="https://learn.microsoft.com/azure/postgresql/connectivity/concepts-pgbouncer" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;pg_duckdb extension (Preview):&lt;/STRONG&gt; The &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_duckdb&lt;/CODE&gt; extension combines PostgreSQL’s transactional performance and reliability with DuckDB’s analytical speed for large datasets. This makes a great combination for hybrid OLTP and OLAP environments where you need to run analytical queries directly in PostgreSQL without compromising on performance.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://aka.ms/pg_duckdb" target="_blank" rel="noopener"&gt;link to demo video&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;pg_ivm extension:&lt;/STRONG&gt; The &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_ivm&lt;/CODE&gt; extension implements Incremental View Maintenance (IVM), allowing materialized views to by updated more efficiently by only applying incremental changes when the underlying data changes—resulting in improved performance for large datasets where only a small subset of the data is modified. (&lt;A href="https://github.com/sraoss/pg_ivm" target="_blank" rel="noopener"&gt;link to repo&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Manageability&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Built-in Grafana monitoring dashboard: &lt;/STRONG&gt;Grafana dashboards for your flexible server instances are now readily available from the Azure Portal in your Azure Database for PostgreSQL view. You can now visualize metrics and logs, correlate events by timestamp, and rapidly gain insights into performance, query behavior, and availability with built-in dashboards.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/dashboards-with-grafana---now-in-azure-portal-for-postgresql/4497607" target="_blank" rel="noopener"&gt;link to blog&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maintenance payload visibility:&lt;/STRONG&gt; Maintenance updates to flexible server can include PostgreSQL minor version updates, security fixes, bug fixes and new functionality. It’s important to know what’s changing so you know what to expect, what improvements you can take advantage of, and whether to flag any concerns. You can now access the release notes for maintenance updates. (&lt;A href="https://learn.microsoft.com/azure/postgresql/release-notes-maintenance/release-notes-maintenance-index" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Defer maintenance &amp;amp; Maintenance on demand:&lt;/STRONG&gt; Using Custom Maintenance Windows (CMW) and System-managed Maintenance Windows (SMW) gives you control over when to apply flexible server maintenance updates. We’ve expanded that control with the ability to defer an upcoming maintenance update by up to 2 weeks, or to apply one on demand. These new options are available in the Azure Portal, with CLI and API support coming soon. (&lt;A href="https://learn.microsoft.com/azure/postgresql/configure-maintain/concepts-maintenance#system-managed-windows-smw-vs-custom-maintenance-windows-cmw" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL 18 (w/MVU &amp;amp; Terraform support): &lt;/STRONG&gt;PostgreSQL 18 was made available on Azure on the same day as the community release, with a host of performance and security improvements . PG18 general availability added support for all Azure public regions, Major Version Upgrade, Entra ID authentication, and Terraform support. (&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/postgresql-18-now-ga-on-azure-postgres-flexible-server/4469802" target="_blank" rel="noopener"&gt;link to blog&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;5 new regions added: Austria East, Denmark East, Indonesia Central, Malaysia West, Chile Central: &lt;/STRONG&gt;New Azure regions for flexible server are continually being added in response to customer demand. You can check out the region availability list to stay up to date with supported regions. (&lt;A href="https://learn.microsoft.com/azure/postgresql/overview#azure-regions" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;HA expansion: Japan West: &lt;/STRONG&gt;Existing regions are also being retrofitted to add availability zones which support zone-redundant High Availability. In this timeframe, we’ve added support for multi-zone deployment in Japan West. (&lt;A href="https://learn.microsoft.com/azure/postgresql/overview#azure-regions" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Resiliency&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Zonal resiliency HA setting:&lt;/STRONG&gt; Zone-redundant high Availability (HA) is the recommended and default HA configuration for maximum resiliency. The Azure Portal now includes a Zonal Resiliency setting that lets you select same-zone HA if a region doesn’t support zone-redundant HA—with automatic migration once capacity becomes available. (&lt;A href="https://learn.microsoft.com/azure/postgresql/high-availability/how-to-configure-high-availability" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Near-zero downtime scaling for HA-enabled servers:&lt;/STRONG&gt; This feature minimizes downtime when you modify the storage and compute tiers. Scaling operations such as vCore or Compute tier operations can now HA failovers to maintain the connection string, reducing downtime to typically under 30 seconds. You don’t need to take any action to use this feature. (&lt;A href="https://learn.microsoft.com/azure/postgresql/flexible-server/concepts-scaling-resources#near-zero-downtime-scaling" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Long term backups:&lt;/STRONG&gt; Backups with Long Term Retention (LTR) enable you to keep backups for up to 10 years, enabling you to meet regulatory and audit-driven requirements for long-term data retention.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/postgresql/backup-restore/concepts-backup-restore#long-term-retention" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Logical replication slot synchronization metric: &lt;/STRONG&gt;A new metric called &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;logical_replication_slot_sync_status&lt;/CODE&gt; provides a binary signal to indicate whether logical replication slots are synchronized across High Availability (HA) primary and standby nodes. This adds a clear signal for failover readiness to help with scenarios where data continuity during failover is critical.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/monitor/concepts-monitoring#logical-replication" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Security and networking&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure Confidential Computing:&lt;/STRONG&gt; PostgreSQL flexible server instances can now run on Confidential Virtual Machines (CVMs) inside a Trusted Execution Environment (TEE)—a secure, isolated enclave with encrypted memory, enabling end-to-end security and enhanced privacy to meet the strictest security standards for regulated workloads. (&lt;A href="https://learn.microsoft.com/azure/postgresql/security/security-confidential-computing" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Entra ID group login using user credentials: &lt;/STRONG&gt;You can authenticate to Azure Database for PostgreSQL with your Entra ID as a member of a Microsoft Entra group by creating a group principal. Managed identities and service principals are also supported as group members.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/postgresql/security/security-entra-configure#authenticate-with-microsoft-entra-id-as-a-group-member" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Entra ID token refresh libraries for .NET, Python, Java:&lt;/STRONG&gt; Using Entra ID for authentication throughout your application supports an identity-based security perimeter, simplifying how applications authenticate with Azure Database for PostgreSQL, but it also means your application needs to handle additional complexities like Entra token refresh. These libraries take care of the token refresh logic, making it easy to add token refresh support to your applications with minimal code changes.&lt;STRONG&gt; &lt;/STRONG&gt;(link to libraries &lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt;, &lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;JavaScript&lt;/A&gt;, and &lt;A href="https://pypi.org/project/azure-postgresql-auth/" target="_blank" rel="noopener"&gt;Python&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Credcheck, anon, ip4r extensions:&lt;/STRONG&gt; We onboarded several extensions over the last year that help with compliance and regulatory requirements, including:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;anon&lt;/STRONG&gt;: GA of the upgraded&amp;nbsp;&lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;anon&lt;/CODE&gt; extension, adding support for dynamic and static masking, anonymized exports, randonmization, and other advanced masking techniques.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;credcheck&lt;/STRONG&gt;: The&amp;nbsp;&lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;credcheck&lt;/CODE&gt; extension adds credential checks for usernames and password complexity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ip4r&lt;/STRONG&gt;: The&amp;nbsp;&lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;ip4r&lt;/CODE&gt; extension provides a set of data types for Ipv4 and Ipv6 network addresses which are useful for auditing, compliance, and intrusion detection.&lt;STRONG&gt; &lt;/STRONG&gt;(link to docs: &lt;A href="https://postgresql-anonymizer.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;anon&lt;/A&gt;, &lt;A href="https://github.com/HexaCluster/credcheck" target="_blank" rel="noopener"&gt;credcheck&lt;/A&gt;, &lt;A href="https://github.com/RhodiumToad/ip4r" target="_blank" rel="noopener"&gt;IP4R&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Priority connectivity for azure_pg_admin users: &lt;/STRONG&gt;The &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;azure_pg_admin&lt;/CODE&gt; role provides a way to perform privileged administrator operations without access to the superuser role, reducing the risk of privilege escalation. This role was updated to work with PG16’s stricter role hierarchy, allowing management of objects owned by any non-restricted role. It also ensures that at least one database connection is always available to admin users—even when the client connection pool is full—helping prevent lockout situations and making troubleshooting easier.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/migration-service/concepts-required-user-permissions#online-migration-using-pgoutput---required-publication-permissions" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Defender security assessments (Preview): &lt;/STRONG&gt;Two new Microsoft Defender for Cloud CSPM security recommendations for flexible server are now availability:
&lt;UL&gt;
&lt;LI&gt;Geo-redundant backups should be enabled for PostgreSQL Servers, and&lt;/LI&gt;
&lt;LI&gt;&lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;require_secure_transport&lt;/CODE&gt; should be set to "on" for PostgreSQL Servers&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;BR /&gt;These assessments evaluate database configuration settings against recommended security practices, helping you manage risk and align with internal and industry standards. Additional security assessments will be added over time. &lt;STRONG style="color: rgb(30, 30, 30);"&gt; &lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;(&lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://learn.microsoft.com/azure/defender-for-cloud/release-notes-recommendations-alerts#recommendations-alerts-and-incidents-updates" target="_blank" rel="noopener"&gt;link to new recommendations&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;VNET to Private Link migration (Preview):&lt;/STRONG&gt; Previously, it wasn’t possible to migrate servers deployed inside a VNET to an updated secure network configuration based on Private Endpoint connectivity, which is simpler and more scalable. With the VNET to Private endpoint migration preview, you can use the Azure CLI, API or SDK to migrate your server without needing to recreate it. (&lt;A href="https://learn.microsoft.com/azure/postgresql/network/how-to-migrate-vnet-private-endpoint-capable-server?tabs=portal-migrate" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Extended CVE support for PG11, 12, 13: &lt;/STRONG&gt;If you’re running a PostgreSQL version in flexible server that is no longer community supported like PG11, 12, or 13, it will continue to be patched with high priority CVEs for 3 years after the community retirement data as part of Azure Database for PostgreSQL extended support.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/azure/postgresql/configure-maintain/extended-support" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Integration&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Mirroring data to Microsoft Fabric:&lt;/STRONG&gt; The general availability of Fabric mirroring in flexible server opens up near real-time replication of data from Azure Database for PostgreSQL to Microsoft Fabric—enabling the advanced analytics and reporting capabilities of Fabric without the need for extensive ETL. It also means your PostgreSQL server is free to run mission-critical transactional workloads without being affected by spikes in analytical reporting.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://learn.microsoft.com/fabric/mirroring/azure-database-postgresql" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Ansible module update: &lt;/STRONG&gt;A new version of the Ansible collection for flexible server was released, adding support for support for Elastic clusters, PG18, virtual endpoints, on-demand backups, system-assigned identity, storage auto-grow, read replica switchover and more.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://docs.ansible.com/projects/ansible/latest/collections/azure/azcollection/azure_rm_postgresqldatabase_module.html" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Updated Go, Java, JavaScript, .NET &amp;amp; Python SDKs:&lt;/STRONG&gt; The udpated SDKs for performance flexible server operations add PG18 support, improved Elastic cluster features and improved response codes.&lt;STRONG&gt; &lt;/STRONG&gt;(link to SDKs: &lt;A href="https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql/#versions-body-tab" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt;, &lt;A href="https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v5@v5.0.0" target="_blank" rel="noopener"&gt;Go&lt;/A&gt;, &lt;A href="https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresqlflexibleserver/2.0.0" target="_blank" rel="noopener"&gt;Java&lt;/A&gt;, &lt;A href="https://www.npmjs.com/package/@azure/arm-postgresql-flexible/v/9.0.0" target="_blank" rel="noopener"&gt;Javascript&lt;/A&gt;, &lt;A href="https://pypi.org/project/azure-mgmt-postgresqlflexibleservers/2.0.0/" target="_blank" rel="noopener"&gt;Python&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Upsert and Script activity in ADF and Azure Synapse:&lt;/STRONG&gt; New capabilities were provided to make merging data into existing tables easier with the Upsert method, and to run custom SQL scripts as part of workflows enabled more streamlined ETL processes with Azure Data Factory and Azure Synapse. (link to &lt;A href="https://learn.microsoft.com/azure/postgresql/flexible-server/how-to-data-factory-copy-activity-azure?tabs=copy-command" target="_blank" rel="noopener"&gt;Upsert Method&lt;/A&gt;and &lt;A href="https://learn.microsoft.com/azure/postgresql/flexible-server/how-to-data-factory-script-activity-azure?tabs=query" target="_blank" rel="noopener"&gt;script activity&lt;/A&gt; docs)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Stable REST API release for 2025:&lt;/STRONG&gt; The 2025-08-01 stable REST API release for Azure Database for PostgreSQL added support for the latest PostgreSQL major versions, Elastic Cluster and CMK enhancements.&lt;STRONG&gt; &lt;/STRONG&gt;(&lt;A href="https://github.com/Azure/azure-rest-api-specs/tree/main/specification/postgresql/resource-manager/Microsoft.DBforPostgreSQL/stable" target="_blank" rel="noopener"&gt;link to released APIs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure Storage extension Parquet support:&lt;/STRONG&gt; Parquet is a popular columnar storage format that is widely used in big data and analytics environments.&lt;STRONG&gt; &lt;/STRONG&gt;With Parquet support in &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;azure_storage&lt;/CODE&gt;, you can now perform direct SQL-based reads and writes to Parquet files in &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;azure_storage&lt;/CODE&gt;, making it easy to import and export data to and from PostgreSQL without needing external tools or scripts. (&lt;A href="https://learn.microsoft.com/azure/postgresql/flexible-server/concepts-storage-extension" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Migration service in Azure Database for PostgreSQL&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AI-assisted Oracle to PostgreSQL migration tool&lt;/STRONG&gt;: Migration from one database type to another has traditionally been a complex, time-consuming and costly project. The emergence of AI-assisted migration tooling has dramatically reduced this cost. The AI-assisted migration tooling available with the VS Code PostgreSQL extension converts Oracle schema and application code to Azure Database for PostgreSQL flexible server. This tooling leverages GitHub Copilot, Microsoft Foundry, and custom Language Model tools to convert Oracle schema, database code and client applications into PostgreSQL-compatible formats and validates every change against a running flexible server instance. (&lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/oracle-schema-conversions/schema-conversions-overview" target="_blank" rel="noopener"&gt;Link to schema conversion docs&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/oracle-application-conversions/app-conversions-overview" target="_blank" rel="noopener"&gt;link to app conversion docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure Migrate discovery &amp;amp; assessment:&lt;/STRONG&gt; The first step in a database migration process is Discovery: understanding what you’re running and the state of migration readiness. Azure Migrate now provides PostgreSQL discovery and assessment to report on your on-prem PostgreSQL landscape, identify potential migration blockers, and learn tailored SKU and cost insights with a streamlined migration assessment. (&lt;A href="https://learn.microsoft.com/azure/migrate/tutorial-assess-postgresql?view=migrate" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Migration with pgoutput plugin&lt;/STRONG&gt;: Online migration to flexible server became generally available last June and we’ve continued to improve it. You can now leverage &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pgoutput&lt;/CODE&gt; (used by PostgreSQL’s logical replication framework) for online migration with improved reliability and performance. The update provides improved compatibility with modern PostgreSQL deployments and reduces dependency on legacy decoding mechanisms, enabling functionality like fine-grained filtering using Publications, allowing migration of specific tables and filtering by operations. (&lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/migrate/migration-service/overview-migration-service-postgresql" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AlloyDB &amp;amp; EDB migration sources:&lt;/STRONG&gt; You can now migrate directly from AlloyDB and EDB Extended Server to PostgreSQL using the Azure Database for PostgreSQL Migration Service, with both online and offline migration support. (link to docs: &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/migration-service/tutorial-migration-service-alloy-db-online?tabs=portal" target="_blank" rel="noopener"&gt;AlloyDB&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/migration-service/tutorial-migration-service-enterprise-db-extended-server-online?tabs=portal" target="_blank" rel="noopener"&gt;EDB&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;AI capabilities in Flexible Server&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AI Functions (Preview): &lt;/STRONG&gt;AI Functions add extraction, generation, classification, and re-ranking directly into SQL through the &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;azure_ai&lt;/CODE&gt; extension using an Azure OpenAI or Microsoft Foundry model. It replaces hundreds of lines of Python glue with a one-line SQL call. (&lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/azure-ai/generative-ai-azure-overview" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;pgvector 0.8.2 support: &lt;/STRONG&gt;pgvector 0.8.2, focuses on stabilizing parallel HNSW index builds, fixing correctness issues and improving reliability, all important steps toward production-grade vector search. (&lt;A href="https://learn.microsoft.com/azure/postgresql/flexible-server/concepts-extensions#vector" target="_blank" rel="noopener"&gt;link to docs)&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Microsoft Foundry integration (Preview):&lt;/STRONG&gt; We've shipped a PostgreSQL connector for Microsoft Foundry built on the Model Context Protocol (MCP). Foundry agents can now explore your Postgres schema, retrieve records, run analytical queries, and perform vector similarity searches in natural language, secured by Microsoft Entra ID (&lt;A href="https://learn.microsoft.com/azure/postgresql/azure-ai/generative-ai-foundry-integration" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;LangGraph/LangChain connector&lt;/STRONG&gt;: The new native Azure Database for PostgreSQL connector for both frameworks gives agents first-class vector retrieval, checkpointing, and conversational memory backed by your Postgres instance with Entra ID authentication and production-grade reliability out of the box. (&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/build-enterprise-ready-ai-agents-with-the-new-azure-postgres-langchain--langgrap/4453420" target="_blank" rel="noopener"&gt;link to blog&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apache AGE extension support&lt;/STRONG&gt;: Apache AGE is now supported on Azure Database for PostgreSQL, bringing graph queries to the same database that already holds your relational tables, JSON, vectors, and full-text indexes. (&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/postgresql-as-your-graph-database-in-the-ai-era/4516323" target="_blank" rel="noopener"&gt;link to blog&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Try it out: Quickstart for Azure Database for PostgreSQL&lt;/H3&gt;
&lt;P&gt;The&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/postgresql/configure-maintain/quickstart-create-server" target="_blank" rel="noopener"&gt;Quickstart: Create an Azure Database for PostgreSQL flexible server&lt;/A&gt;&amp;nbsp;docs page walks you through how to get started deploying your own flexible server instance, including a link to a free Azure trial account.&lt;/P&gt;
&lt;H2&gt;Our Postgres team is hiring!&lt;/H2&gt;
&lt;P&gt;If you’re a deep Postgres expert—or a strong Linux systems engineer—this might be your moment. We’re continuing to grow the Postgres team at Microsoft. (&lt;A href="https://apply.careers.microsoft.com/careers/job/1970393556744853" target="_blank" rel="noopener"&gt;link to Principal Software Engineer role&lt;/A&gt;; and &lt;A href="https://apply.careers.microsoft.com/careers/job/1970393556744851" target="_blank" rel="noopener"&gt;link to Software Engineer II role&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;As Affan Dar, the VP of Engineering for Postgres at Microsoft says all the time:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;“We are &lt;EM&gt;always&lt;/EM&gt; looking for strong Linux systems engineers and PostgreSQL experts to help us build the future of Postgres at Microsoft.”&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-horizondb" class="lia-anchor"&gt;&lt;/a&gt;Azure HorizonDB (Preview)&lt;/H2&gt;
&lt;P&gt;Azure HorizonDB launched in private preview last November, and at Microsoft Build in May 2026 we&amp;nbsp;&lt;A href="https://news.microsoft.com/build-2026-live-blog/microsoft-build-2026-live/?live-feed-entry-id=4977" target="_blank" rel="noopener"&gt;announced the public preview&lt;/A&gt;. If you want a quick overview, the excerpt below from the &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/azure-horizondb-enterprise-ready-postgres-engineered-for-the-ai-era/4524094" target="_blank" rel="noopener"&gt;announcement blog post&lt;/A&gt; is a good place to start—or you can dive straight into some of the key HorizonDB features further down. &lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;"Azure HorizonDB is built to meet the demands of security, resilience, scale, and performance—combining the flexibility developers expect from Postgres with the operational rigor enterprises require.&lt;BR /&gt;&lt;BR /&gt;It extends the core Postgres engine with cloud-native capabilities such as integrated identity, fine-grained network and security controls, and seamless lifecycle management, while preserving full compatibility with the open ecosystem of extensions.&lt;/P&gt;
&lt;P&gt;HorizonDB introduces advanced, natively integrated capabilities like vector data support and AI model management, enabling new classes of intelligent applications without sacrificing transactional integrity or developer productivity." &lt;BR /&gt;&lt;BR /&gt;—Excerpted from "Azure HorizonDB: Enterprise-Ready Postgres, Engineered for the AI Era" announcement blog post&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Low latency commits&lt;/STRONG&gt;:&lt;STRONG&gt; &lt;/STRONG&gt;The architecture of Azure HorizonDB (Preview) separates compute and storage, so storage is shared by all compute nodes. This shared storage architecture enables low-latency, millisecond commits within region providing critical support for tier-1, performance-sensitive workloads. (&lt;A href="https://learn.microsoft.com/azure/horizondb/overview" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Scale up to 192 Cores&lt;/STRONG&gt;: Azure HorizonDB supports compute scaling up to 192 cores for both primary and replica instances, enabling the capacity needed to handle workload spikes. (&lt;A href="https://learn.microsoft.com/azure/horizondb/configure-maintain/how-to-scale-compute" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Read scale-out with 15 replicas&lt;/STRONG&gt;: Support for up to 15 read replicas, with read connections automatically load-balanced across them to efficiently scale out read workloads. (&lt;A href="https://learn.microsoft.com/azure/horizondb/configure-maintain/how-to-add-remove-replica" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Autoscaling storage up to 128 TB&lt;/STRONG&gt;: Support for storage auto-scaling up to 128 TB, eliminating the need to pre-provision storage size. Storage automatically shrinks as your data footprint decreases. (&lt;A href="https://learn.microsoft.com/azure/horizondb/overview#storage" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Zone resilient storage&lt;/STRONG&gt;: Azure HorizonDB leverages Azure Blob Storage, which is zone-resilient by default, to ensure zero data loss. (&lt;A href="https://learn.microsoft.com/azure/horizondb/overview#storage" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Entra ID Authentication&lt;/STRONG&gt;: Azure HorizonDB provides native integration with Microsoft Entra ID, enabling centralized identity and access management for PostgreSQL workloads. This integration supports secure, token-based authentication while allowing organizations to enforce enterprise security policies such as multi-factor authentication and conditional access.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Private Endpoints &lt;/STRONG&gt;: Azure HorizonDB supports Azure Private Endpoints, ensuring that database connectivity remains entirely within a customer’s private Azure VNET boundary. This capability minimizes exposure to the public internet and helps organizations satisfy stringent security, compliance, and regulatory requirements.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Mirroring to Microsoft Fabric&lt;/STRONG&gt;: Azure HorizonDB includes native mirroring to Microsoft Fabric, enabling near real-time replication of operational PostgreSQL data into analytics-ready OneLake storage. This capability simplifies modern analytics architectures by reducing dependency on complex ETL pipelines while supporting scalable BI, AI, and data engineering workloads. &lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;~75 popular Postgres extensions&lt;/STRONG&gt;: Azure HorizonDB is fully PostgreSQL-compatible and supports approximately ~75 popular extensions such as &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_stat_statements&lt;/CODE&gt;, &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;auto_explain&lt;/CODE&gt;, &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_duckdb&lt;/CODE&gt;, &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_diskann&lt;/CODE&gt;. It will continue to expand support for additional extensions, including both PostgreSQL and Azure-specific offerings such as AI extensions. (&lt;A href="https://learn.microsoft.com/azure/horizondb/extensions/concepts-extensions-versions" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Full-text search with BM25 ranking (pg_textsearch)&lt;/STRONG&gt;: &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_textsearch&lt;/CODE&gt; brings BM25 the same relevance algorithm behind every major search engine directly into HorizonDB as a native extension. BM25 offers better relevance than PostgreSQL's built-in &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;ts_rank&lt;/CODE&gt;, and you can combine it with vector search in one SQL query for true hybrid retrieval. (&lt;A href="https://learn.microsoft.com/azure/horizondb/ai/full-text-search" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;DiskANN Advanced filtering&lt;/STRONG&gt;: DiskANN Advanced Filtering offers lower latency on filtered vector search compared to traditional approaches, so a query like "find the most similar products under $50 in the Electronics category" runs at full DiskANN speed. (&lt;A href="https://learn.microsoft.com/azure/horizondb/ai/vector-index-diskann#use-advanced-filtering" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI model management&lt;/STRONG&gt;: AI Model Management in Azure HorizonDB simplifies how you bring AI into your database. With a single step, it provisions fully managed AI models for embeddings, semantic ranking, and generation through Microsoft Foundry—and installs and configures the &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;azure_ai&lt;/CODE&gt; extension to enable AI functions like &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;generate()&lt;/CODE&gt;, &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;extract()&lt;/CODE&gt;, &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;create_embeddings()&lt;/CODE&gt;, and &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;rank()&lt;/CODE&gt; for immediate use directly in SQL. This removes the need for manual setup and context switching, with model provisioning, management, monitoring, and billing handled seamlessly within HorizonDB. (&lt;A href="https://learn.microsoft.com/azure/horizondb/ai/ai-model-management" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI pipelines&lt;/STRONG&gt;: AI Pipelines let you describe an AI workflow (chunking, embedding, extraction, generation, ranking, human approval) declaratively in SQL, and run it as a fault-tolerant pipeline that lives inside the database built on pg_durable. (&lt;A href="https://learn.microsoft.com/azure/horizondb/ai/ai-pipelines" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Durable functions (pg_durable):&lt;/STRONG&gt; &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_durable&lt;/CODE&gt; is an open source extension that lets you describe long-running workflows such as sequential steps, parallel fan-out, scheduled jobs, human-in-the-loop, and retries declaratively in SQL. And then you can run them as fault-tolerant durable functions that live inside the database. (&lt;A href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;link to GitHub Repo&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;BACKSTORY&lt;/STRONG&gt;: Beyond features, if you want to learn more about the story behind Azure HorizonDB, listen to the &lt;A href="https://talkingpostgres.com/episodes/from-memsql-to-horizondb-an-engineers-journey-with-adam-prout" target="_blank" rel="noopener"&gt;Talking Postgres podcast episode with guest Adam Prout&lt;/A&gt;, one of the founding architects of Azure HorizonDB.&lt;/P&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-dev-tools" class="lia-anchor"&gt;&lt;/a&gt;Developer Tools&lt;/H2&gt;
&lt;P&gt;We &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/announcing-a-new-ide-for-postgresql-in-vs-code-from-microsoft/4414648" target="_blank" rel="noopener"&gt;launched a new IDE for PostgreSQL in VS Code&lt;/A&gt; in May 2025—and the response was strong, including a day at the top of Hacker News and over 170K views of the original blog post. One year later, the extension has &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql" target="_blank" rel="noopener"&gt;more than 560K+ installs&lt;/A&gt;, we’ve kept building and adding more capabilities. Below are some of the highlights. We also recently &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/your-postgresql-workflow-just-found-its-new-home-in-cursor/4524081" target="_blank" rel="noopener"&gt;added support for Cursor&lt;/A&gt;, available via the Open VSX Registry.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;VS Code extension to connect to any Postgres, anywhere&lt;/STRONG&gt;: You can connect to any PostgreSQL database directly from the VS Code extension for PostgreSQL—whether it’s running locally, in a container, on-prem, or in any cloud. Connection profiles let you switch between environments without leaving the editor. (&lt;A href="https://learn.microsoft.com/azure/postgresql/developer/vs-code-extension/vs-code-connect" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;One-click Dockerized Postgres + integrated psql&lt;/STRONG&gt;: Local development is streamlined through the PostgreSQL extension in VS Code, including quick setup of a PostgreSQL environment and support for familiar tools like psql. This reduces the amount of manual setup needed to start querying. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#create-a-docker-postgresql" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Object Explorer with cross-database search&lt;/STRONG&gt;: Within VS Code, the PostgreSQL extension provides an Object Explorer for browsing tables, views, and functions across databases. You can also search across schemas and databases without manually navigating the full tree. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#object-explorer-search" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema visualization&lt;/STRONG&gt;: Schema visualization is built into the VS Code extension for PostgreSQL, making it easier to understand relationships between tables. This can be especially useful when working with unfamiliar or complex data models (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#schema-visualization" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Intellisense query editor with CSV/JSON&lt;/STRONG&gt;: The VS Code extension for PostgreSQL includes a query editor with IntelliSense that is schema aware. Query results are returned in a grid and can be exported to formats like CSV or JSON for further analysis. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#query" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Query plan visualizer &amp;amp; Copilot analysis&lt;/STRONG&gt;: Query plans can be visualized directly in VS Code using the PostgreSQL extension, helping surface bottlenecks and execution details. With GitHub Copilot, you can also get explanations and suggestions for improving query performance. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#query-plan-visualization" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apache AGE Cypher graph visualization&lt;/STRONG&gt;: Support for Apache AGE allows graph queries to be run and visualized as node-edge diagrams directly in VS Code. This enables exploration of graph data without requiring a separate visualization tool. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#apache-age-graph-visualization" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Copilot Agent Mode tools (run SQL, design schemas, import CSV):&lt;/STRONG&gt; When used with the VS Code extension for PostgreSQL, GitHub Copilot can operate in agent mode to assist with multi-step workflows such as running queries, designing schemas, or importing data. These actions are suggested in natural language while still requiring user confirmation. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#copilot-pgsql-agent" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Copilot metrics intelligence in Server dashboard&lt;/STRONG&gt;: The VS Code extension for PostgreSQL includes server dashboards that surface database performance metrics. GitHub Copilot can help interpret these signals and guide troubleshooting or optimization efforts. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#metrics-intelligence-with-github-copilot" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Entra authentication for Azure Database for PostgreSQL&lt;/STRONG&gt;: Connections from the VS Code extension for PostgreSQL to Azure Database for PostgreSQL support Microsoft Entra ID authentication. This enables secure, passwordless access directly from the editor. (&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql#connect-to-postgresql" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure server browse, create, &amp;amp; manage in-IDE&lt;/STRONG&gt;: Azure Database for PostgreSQL resources can be discovered, created, and managed directly within VS Code through the PostgreSQL extension. This reduces the need to switch to the Azure portal for common workflows. (&lt;A href="https://learn.microsoft.com/azure/postgresql/developer/vs-code-extension/vs-code-connect" target="_blank" rel="noopener"&gt;link to docs&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cursor extension for PostgreSQL&lt;/STRONG&gt;: An extension for PostgreSQL is also available in Cursor and other Open VSX-compatible editors, bringing the same database tooling into those environments. In Cursor, these workflows integrate with Cursor’s native AI experience while preserving the core Postgres capabilities. (&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/your-postgresql-workflow-just-found-its-new-home-in-cursor/4524081" target="_blank" rel="noopener"&gt;link to blog post&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-postgres-core" class="lia-anchor"&gt;&lt;/a&gt;Contributing to PostgreSQL core&lt;/H2&gt;
&lt;P&gt;Microsoft continues to invest in our open-source PostgreSQL contributors team and reaffirms its commitment to open source. The team continues to drive large and ambitious projects in upstream PostgreSQL and make all those features available to all Postgres users.&lt;/P&gt;
&lt;P&gt;The team has a broad range of expertise, and our contributions to Postgres span almost all areas in Postgres, including the Query Planner, Executor, Storage/IO subsystems, Security, Operational and Manageability improvements, new SQL features and much more.&lt;/P&gt;
&lt;P&gt;Our commitment to supporting Postgres development hasn’t changed since &lt;A href="https://techcommunity.microsoft.com/t5/azure-database-for-postgresql/what-s-new-with-postgres-at-microsoft-august-2023/ba-p/3914506#postgres-open-source" target="_blank" rel="noopener"&gt;Claire Giordano first wrote this back in August 2023&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;In order to thrive, an open source ecosystem needs commercial support as well as volunteer efforts. Even open source developers need to eat! For the Postgres open source ecosystem to flourish, companies like Microsoft need to support the project by funding development in the Postgres core. Which we do.&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;PostgreSQL is a complex piece of software that runs mission-critical workloads across the globe. To provide the best possible experience on Azure, it follows that we need to thoroughly understand how it works. By having PostgreSQL committers and contributors on our team, they can share knowledge internally across different orgs, or directly answer internal questions regarding incidents or extension development.&lt;BR /&gt;&lt;BR /&gt;Because today's cloud operates at a scale most on-prem solutions never encountered, unique cloud data center problems, often relating to performance, now require special attention. Our in-house team of deep Postgres experts are focused on tackling these cloud-scale issues upstream, in the Postgres core. Another benefit: our team's Postgres expertise gives Azure customers confidence in our cloud database services, too.&lt;BR /&gt;&lt;BR /&gt;Commercial funding of PostgreSQL developers has another benefit: it gives developers the long-term stability to pursue the big things, the groundbreaking changes that are super important to the future. In particular, the Postgres contributor team at Microsoft is focused on some big architectural changes (example: Asynchronous IO) that you wouldn’t be able to do without the funding for a full-time, multi-year effort.&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;Highlights of our team’s Postgres 19 code contributions (so far!)&lt;/H3&gt;
&lt;P&gt;Big news: &lt;A href="https://www.postgresql.org/about/news/postgresql-19-beta-1-released-3313/" target="_blank" rel="noopener"&gt;Postgres 19 Beta 1 just released&lt;/A&gt;, and PG 19 is expected to GA later this year, likely in September 2026.&lt;/P&gt;
&lt;P&gt;Below are highlights from ~440 commits our Microsoft team authored or co-authored (so far) in Postgres 19.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;And because attribution matters in open source, it must be said: the Postgres 19 work you’ll see below was done in collaboration with Postgres developers and contributors from around the world—including many outside Microsoft. That’s how the Postgres open source project works. We’re grateful to be part of it.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Figure 2: Team members at Microsoft that contribute to the upstream Postgres open source project.&lt;/img&gt;
&lt;H3&gt;Performance&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Faster Tuple Deformation&lt;/STRONG&gt;: This work accelerates scans of tables with many fixed-width columns. The patches add a dedicated fast loop for columns at pre-calculated offsets and a smaller Attribute struct for reduced memory footprint. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=c456e39113809376f6604e720910ccd24e18e034" target="_blank" rel="noopener"&gt;link to optimize tuple deformation commit&lt;/A&gt;; &lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=d8a859d22b1accd8ea749394a488e4de014b2396" target="_blank" rel="noopener"&gt;link to CompactAttribute commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fast path for Foreign Key checks: &lt;/STRONG&gt;A committed patch series that adds a faster path for foreign key checks. It avoids SPI by probing the referenced index directly, reuses execution state across trigger batches, and uses array-based index probes to reduce setup overhead. In the common case of bulk inserts into single-column, non-partitioned primary-key tables, it delivers about a 2.9x speedup. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git&amp;amp;a=search&amp;amp;h=HEAD&amp;amp;st=commit&amp;amp;s=b7b27eb" target="_blank" rel="noopener"&gt;link to commit series&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Faster COPY using SIMD for &lt;/STRONG&gt;&lt;STRONG&gt;delimiter matching&lt;/STRONG&gt;: The &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;COPY FROM&lt;/CODE&gt; text/CSV parsing was optimized by using SIMD instructions to process input data a chunk at a time, quickly skipping over bytes that don't contain special characters (delimiters, newlines, escapes) rather than checking byte-by-byte in the state machine. The performance speedups can be up to 60% in certain cases, with no regressions. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Parallel TID range scan: &lt;/STRONG&gt;The change allows for queries that filter on &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;ctid&lt;/CODE&gt; ranges to be executed by multiple parallel workers. This is particularly useful for logical replication initializers, data migration, and custom ETL scripts. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0ca3b1697" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Improved TS counter for low-overhead EXPLAIN&lt;/STRONG&gt;&lt;STRONG&gt;: &lt;/STRONG&gt;The commit reduces the overhead of &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;EXPLAIN ANALYZE&lt;/CODE&gt; timing by using the x86 RDTSC instruction directly. This reduces pipeline stalls which dominated the timing cost and makes &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;EXPLAIN ANALYZE&lt;/CODE&gt; much faster. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;On-access Visib&lt;/STRONG&gt;&lt;STRONG&gt;ility Map updates: &lt;/STRONG&gt;The change allows us to mark pages all-visible during SELECT queries. This leads to more index-only scans, which previously had to wait for a Vacuum to run, and additionally also results in less I/O needed by Vacuum. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b46e1e54d" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reduce Vacuum WAL generation: &lt;/STRONG&gt;A series of changes to reduce WAL generation by Vacuum and &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;COPY FREEZE&lt;/CODE&gt;. After these commits, we no longer emit separate heap visible WAL records and instead include that information in other existing WAL records, halving the number of WAL records emitted per heap block for both heap vacuuming and &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;COPY FREEZE&lt;/CODE&gt;. This makes vacuum and &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;COPY FREEZE&lt;/CODE&gt; faster and decreases disk space usage. (links to commits: &lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=d96f87332b3786abd23cba47459546799c562b8c" target="_blank" rel="noopener"&gt;d96f87332b3&lt;/A&gt;, &lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=add323da40a6bf9e01cdda510e32ea924c89cd1a" target="_blank" rel="noopener"&gt;add323da40a&lt;/A&gt;, &lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1252a4ee28636734d68f1acd33be45399c83dc53" target="_blank" rel="noopener"&gt;1252a4ee286&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;New SQL Features:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;SQL/PGQ: &lt;/STRONG&gt;SQL Property Graph Queries is Part 16 of the SQL:2023 ISO standard which lets you define graph structures on top of your existing relational tables and query them with a dedicated pattern matching syntax. This is a major new feature, led by Peter Eisentraut along with Ashutosh Bapat from our team. In practical terms, for PostgreSQL, this means you can now express things like social network traversals, dependency graphs, fraud detection paths, or supply chain analysis using concise graph syntax without leaving Postgres, without extensions, and without duplicating your data into a separate graph store. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Operational Improvements:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Automated resizing of AIO worker&lt;/STRONG&gt;&lt;STRONG&gt;s: &lt;/STRONG&gt;The patch automatically adjusts the I/O worker pool size for PostgreSQL's async I/O subsystem, replacing the old fixed &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;io_workers&lt;/CODE&gt; setting with dynamic scaling that grows the pool under load and shrinks it back down after an idle timeout—so you no longer have to guess the right static worker count. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;New EXPLAIN (IO) for better IO visibility: &lt;/STRONG&gt;The change introduces a new &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;IO&lt;/CODE&gt; option to &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;EXPLAIN&lt;/CODE&gt;, which adds per-scan-node I/O instrumentation to &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;EXPLAIN ANALYZE&lt;/CODE&gt; output. These apply to nodes backed by the ReadStream API’s and reports prefetch queue metrics (average and maximum distance, capacity) and I/O request stats. This gives you direct visibility into how the ReadStream/AIO layer is performing underneath each scan, instead of having to guess from BUFFERS alone. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=681daed93" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Security and Reliability:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;CVE-2026-2006: &lt;/STRONG&gt;The change modified an internal string length function to report ERROR if the input string ends in an incomplete multibyte character. The general philosophy was to raise encoding errors on a &lt;STRONG&gt;just-in-time basis&lt;/STRONG&gt;—that is, the low-level multibyte string length functions now actively detect and reject truncated/incomplete characters rather than silently ignoring them. This hardens PostgreSQL's multibyte encoding handling, Incomplete characters in stored data are a sign of corruption or encoding bugs and surfacing them as errors is safer than silently computing wrong character counts. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1e7fe06c10c0a8da9dd6261a6be8d405dc17c728" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Online checksum enablement: &lt;/STRONG&gt;Enabling checksums to detect data corruption was only available during initdb, or having to shut down the entire cluster and calculating the checksums on all the files. For larger production databases, that downtime is often unacceptable. This change allows you to enable this in a running cluster, and the checksums are calculated in the background. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0ecca" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Server Side SNI support:&lt;/STRONG&gt; PostgreSQL 19 &lt;A href="https://postgr.es/c/4f433025f" target="_blank" rel="noopener"&gt;adds server-side support&lt;/A&gt; for SNI, with a new configuration file $datadir/pg_hosts.conf that specifies the hostname/certificate/key pairs. The server inspects the hostname TLS extension in the SSL handshake and selects the right SSL certificate, key, and CA certificate to use for that connection. This means a single PostgreSQL instance can present different certificates depending on which hostname the client is connecting to. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4f433025f" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Groundwork/Futures:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Buffer Mgr Locking improvements&lt;/STRONG&gt;: Andres Freund has been working on several improvements in the way buffer management and locking has been done, paving the way to use AIO for writes. The change also now performs buffer page un-lock and un-pin in a single atomic operation, showing some pgbench runs to see up to 25% improvement.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Index Pre-fetching groundwork: &lt;/STRONG&gt;Index pre-fetching did not make it for PG19, but a lot of the groundwork has been done in this cycle, including all the major design pieces, preliminary improvements in the AIO infrastructure and mitigation of any performance regressions. The feature is in good shape to land in PG19.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Shared Buffer Elasticity groundwork: &lt;/STRONG&gt;Ashutosh and Heikki have worked on improving shared memory management in PG 19. This would help support changing shared-buffers without server restart in a future release. In PG19, extensions using small shared memory structures can be created/loaded after startup without going through &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;shared_preload_libraries&lt;/CODE&gt; and without restarting the server. (&lt;A href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=283e823f9" target="_blank" rel="noopener"&gt;link to commit&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The features above capture some highlights of the work done by the team at Microsoft for open-source PostgreSQL, but it’s not a comprehensive list—and certainly doesn’t reflect all the engineering work to review patches and mentor contributors across the project. Let’s look at some numbers:&lt;/P&gt;
&lt;H3&gt;Microsoft’s code contributions to Postgres 19 (to date) as of 31st May 2026&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 25%" /&gt;&lt;col style="width: 25%" /&gt;&lt;col style="width: 25%" /&gt;&lt;col style="width: 25%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-align-right"&gt;&lt;STRONG&gt;Code contributions in Postgres 19&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;440&lt;/STRONG&gt;&lt;BR /&gt;Commits with Microsoft authors or co-authors&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;3,088&lt;/STRONG&gt;&lt;BR /&gt;total commits to PG19 to date (from everyone)&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;14.2%&lt;/STRONG&gt;&lt;BR /&gt;of commits have code authors from Microsoft&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-align-right"&gt;&lt;STRONG&gt;Patch Reviews in Postgres 19&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;907&lt;/STRONG&gt;&lt;BR /&gt;Commits with reviews from the Microsoft Team&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;5,603&lt;/STRONG&gt;&lt;BR /&gt;total commits to PG18 to date (from everyone)&lt;/td&gt;&lt;td class="lia-align-center"&gt;&lt;STRONG&gt;16.2%&lt;/STRONG&gt;&lt;BR /&gt;of commits had reviews from team @ Microsoft&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To interpret the numbers, here are 3 things to keep in mind:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Not all commits are created equal&lt;/STRONG&gt;. Some commits are small; others are complex and high-impact. So while commits are a useful signal, they’re not a perfect measure of effort or impact. Still, it’s a metric many people care about, so we’re sharing it.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Many commits have multiple authors (and reviewers)&lt;/STRONG&gt;: The 440 commits with Microsoft authors in Postgres 19 (as of May 31 2026) were authored by 19 different people on our team. But those commits were often co-authored by other contributors—both inside and outside Microsoft. That’s one of the things I love about the Postgres community: developers collaborating across companies, countries, and continents.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Code is just one part of the story&lt;/STRONG&gt;: Code and review contributions are essential to the Postgres project—but they’re not the whole picture. As you’ll see later in this post, our team also contributes in other ways: to extensions like &lt;A class="lia-internal-link" href="#community--1-citus" target="_blank" rel="noopener" data-lia-auto-title="Citus" data-lia-auto-title-active="0"&gt;Citus&lt;/A&gt;, and to the &lt;A class="lia-internal-link" href="#community--1-community" target="_blank" rel="noopener" data-lia-auto-title="Postgres Community" data-lia-auto-title-active="0"&gt;Postgres Community&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-citus" class="lia-anchor"&gt;&lt;/a&gt;Citus Open Source&lt;/H2&gt;
&lt;P&gt;The &lt;A href="https://github.com/citusdata/citus" target="_blank" rel="noopener"&gt;Citus open source extension&lt;/A&gt; to Postgres is a good fit for data-intensive applications that need more compute, memory, or scale than a single Postgres node can handle.&lt;/P&gt;
&lt;P&gt;With over 12.5K stars on GitHub, Citus is a popular extension that gives Postgres the superpower of distributed tables. You can download Citus open source, or you can use Citus on Azure via the &lt;A href="https://learn.microsoft.com/azure/postgresql/elastic-clusters/concepts-elastic-clusters" target="_blank" rel="noopener"&gt;Elastic Clusters feature&lt;/A&gt; in Azure Database for PostgreSQL.&lt;/P&gt;
&lt;H3&gt;New Citus open source features in last 13 months&lt;/H3&gt;
&lt;P&gt;The Citus open source extension scales out Postgres horizontally, using either row-based sharding or schema-based sharding, or both.&lt;/P&gt;
&lt;P&gt;The &lt;A href="https://www.citusdata.com/updates/" target="_blank" rel="noopener"&gt;Release Notes pages for Citus&lt;/A&gt; are online—and for Citus major releases you can often find a dedicated blog post as well:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Mehmet Yilmaz’s release blog post titled, &lt;A href="https://www.citusdata.com/blog/2026/02/17/distribute-postgresql-18-with-citus-14/" target="_blank" rel="noopener"&gt;Distribute PostgreSQL 18 with Citus 14&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Check out the &lt;A href="https://www.citusdata.com/updates/v14-0/" target="_blank" rel="noopener"&gt;Citus 14.0 release notes&lt;/A&gt; that added PG18 support&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Here are highlights of new Citus open source capabilities added in the last 13 months:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Citus 13.2, 14.0, and 14.1 releases&lt;/STRONG&gt;: You can find the release notes online for &lt;A href="https://www.citusdata.com/updates/v13-2/" target="_blank" rel="noopener"&gt;Citus 13.2&lt;/A&gt;, &lt;A href="https://www.citusdata.com/updates/v14-0/" target="_blank" rel="noopener"&gt;Citus 14.0&lt;/A&gt;, and for the latest release which is actually two paired minor releases, &lt;A href="https://www.citusdata.com/updates/v14-1/" target="_blank" rel="noopener"&gt;Citus 14.1/13.3&lt;/A&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Postgres 18 support in Citus&lt;/STRONG&gt; &lt;STRONG&gt;14&lt;/STRONG&gt;: Citus 14 primarily about PG18 compatibility, with upstream benefits like faster scans and maintenance via AIO; better index usage with skip-scan; uuidv7() for time-ordered UUIDs; OAuth authentication support; and temporal constraints flowing through once compatibility lands. (&lt;A href="https://www.citusdata.com/updates/v14-0/#pg18-highlights" target="_blank" rel="noopener"&gt;link to Citus 14.0 release notes&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Snapshot-based node split / faster scale-out&lt;/STRONG&gt;: From the release notes, “the snapshot based node-addition feature enables faster scale-out operations by adding a new worker node using a clone of an existing worker node. This significantly reduces rebalance times when adding new nodes to the cluster.” Why? Because the cloned work already contains a copy of the data. (&lt;A href="https://www.citusdata.com/updates/v13-2/#snapshot_based_node_addition" target="_blank" rel="noopener"&gt;link to release notes&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Faster parallel shard rebalancing&lt;/STRONG&gt;: Citus 13.2 explicitly improved rebalancer performance by parallelizing moves and removing logical-replication bottlenecks. (&lt;A href="https://www.citusdata.com/updates/v13-2/#shard_rebalancing_performance" target="_blank" rel="noopener"&gt;link to release notes&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;New Citus observability views/stats&lt;/STRONG&gt;: Citus added new observability views and user-defined functions (UDFs) for distributed clusters. Citus 13.1 introduced &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;citus_stat_counters&lt;/CODE&gt; to expose Citus-specific counters collected when &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;citus.enable_stat_counters&lt;/CODE&gt; is enabled; and 13.1 also introduced &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;citus_nodes&lt;/CODE&gt; to show node name, port, role, and active status, as well as supporting UDFs to query/reset counters and identify whether the current node is primary. &lt;BR /&gt;&lt;BR /&gt;Citus 13.2 added &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;citus_stats()&lt;/CODE&gt;, which retrieves distributed &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;pg_stats&lt;/CODE&gt; for a Citus table, giving users more cluster-level visibility into statistics and node state. (&lt;A href="https://www.citusdata.com/updates/v13-1/#css_section" target="_blank" rel="noopener"&gt;link to citus stat counters&lt;/A&gt; in release notes; &lt;A href="https://www.citusdata.com/updates/v13-1/#citus_nodes_section" target="_blank" rel="noopener"&gt;link to citus nodes view&lt;/A&gt; in release notes; &lt;A href="https://www.citusdata.com/updates/v13-2/#citus_stats" target="_blank" rel="noopener"&gt;link to citus_stats view&lt;/A&gt; in release notes)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Expanded DDL/role propagation&lt;/STRONG&gt;: Citus 13.1 adds support for propagating more DDLS from the coordinator to ease role and database management in a Citus cluster, including support for: GRANT/REVOKE rights on table columns; REASSIGN OWNED BY commands; CREATE/DROP database commands; SECURITY LABEL on tables and columns; ALTER USER RENAME commands; ALTER DATABASE .. SET .. commands; and role management from worker nodes. (&lt;A href="https://www.citusdata.com/updates/v13-1/#propagation_of_more_ddls_section" target="_blank" rel="noopener"&gt;link to Citus 13.1 release notes&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Planner/query performance improvements&lt;/STRONG&gt;: Citus 13.2 includes outer join pushdown and local fast-path query optimization. (link to &lt;A href="https://www.citusdata.com/updates/v13-2/#outer_join_pushdown" target="_blank" rel="noopener"&gt;outer join pushdown&lt;/A&gt; in release notes; &lt;A href="https://www.citusdata.com/updates/v13-2/#delayed_fast_path_planning" target="_blank" rel="noopener"&gt;link to fast-path query optimization&lt;/A&gt; in release notes)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-community" class="lia-anchor"&gt;&lt;/a&gt;Postgres Community work&lt;/H2&gt;
&lt;P&gt;Given my role as head of Postgres open source community initiatives at Microsoft, it’s not a surprise: contributing to Postgres is something I care deeply about. &lt;BR /&gt;&lt;BR /&gt;Last year, I gave a talk at &lt;A href="https://speakerdeck.com/clairegiordano/behind-postgres-18-the-people-the-code-and-the-invisible-work-claire-giordano-pgconfeu-2025" target="_blank" rel="noopener"&gt;PGConf EU that shared an analysis of contributions&lt;/A&gt; to Postgres v18, based on research I did with Daniel Gustafsson. And if you’ve ever raced sailboats, you know: &lt;EM&gt;every role matters&lt;/EM&gt;. &lt;BR /&gt;&lt;BR /&gt;One thing I’m quite proud of are the different ways the team at Microsoft contributes to the Postgres ecosystem. This Postgres Contributions infographic—inspired by a hand-drawn sketch by Cornelia Biacsics—shines a light on the ways we’re contributing to this ecosystem.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;&lt;STRONG&gt;Figure 3&lt;/STRONG&gt;: Infographic of the 8 different ways the team at Microsoft contributes to the Postgres ecosystem, from our Azure managed services to Postgres open-source community contributions.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;Highlights from the Postgres community work done by our team at Microsoft&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Serve on organizing &amp;amp; talk selection teams for multiple Postgres events&lt;/STRONG&gt;: The in-person Postgres community conferences are a great way to learn, share your expertise, and connect with other Postgres people. And if you lean into the “hallway track”, you might be surprised by the doors it can open. &lt;BR /&gt;&lt;BR /&gt;Over the past 13 months, members of our Postgres team at Microsoft have served on the organizing committees or talk selection teams for these 9 Postgres community conferences, in time-order (oldest to most recent):&lt;BR /&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf.dev 2025 &lt;/STRONG&gt;(Melanie Plageman)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf NYC 2025 &lt;/STRONG&gt;(Daniel Gustafsson)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL Down Under (PGDU) 2025 &lt;/STRONG&gt;(Thomas Munro)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Prague PostgreSQL Developers Day (P2D2) 2026 &lt;/STRONG&gt;(Tomas Vondra)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;FOSSASIA PGDay 2026 &lt;/STRONG&gt;(Amit Langote)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf India 2026 &lt;/STRONG&gt;(Thomas Munro)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Nordic PGDay 2026 &lt;/STRONG&gt;(Daniel Gustafsson)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL Conference Germany 2026 &lt;/STRONG&gt;(Cornelia Biacsics)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf.dev 2026 &lt;/STRONG&gt;(Melanie Plageman, Claire Giordano)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Co-organize PGConf.dev annual PostgreSQL development conference&lt;/STRONG&gt;: Special shout-out to Melanie Plageman, who is part of the team that organizes PGconf.dev, which in the last 3 years has become a “go to” event. This annual gathering (the successor to PGCon) is unique in how it brings together current and future PostgreSQL hackers from around the world to collaborate in person. (&lt;A href="https://2026.pgconf.dev/schedule/tuesday" target="_blank" rel="noopener"&gt;link to PGConfdev 2026 schedule&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Sponsor 16 Postgres conferences around the world&lt;/STRONG&gt;: Postgres community conferences don’t just happen—they rely on financial support to bring people together. Over the past 13 months, our team at Microsoft has sponsored these 16 in-person Postgres events:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf.dev 2025 – &lt;/STRONG&gt;Gold&lt;BR /&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Hyderabad PG Days 2025 –&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; Sponsor&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGDay Austria 2025 &lt;/STRONG&gt;- Silver&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGDay UK 2025&lt;/STRONG&gt; – Benefactor&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGDay Lowlands 2025&lt;/STRONG&gt; – Supporter&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGDay Napoli 2025 &lt;/STRONG&gt;– Supporter&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf NYC 2025 &lt;/STRONG&gt;– Platinum&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf EU 2025 in Riga &lt;/STRONG&gt;– Gold&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PG Down Under 2025 &lt;/STRONG&gt;– Silver&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Prague PostgreSQL Developers Day (P2D2) 2026 &lt;/STRONG&gt;– Bronze&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;FOSSASIA PGDay 2026 &lt;/STRONG&gt;- Silver&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf India 2026 &lt;/STRONG&gt;– Diamond&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Nordic PGDay 2026 &lt;/STRONG&gt;– Supporter&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL Conference Germany 2026&lt;/STRONG&gt; – Silver&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGConf.dev 2026&lt;/STRONG&gt; – Gold&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PG DATA 2026 (formerly PGDay Chicago) &lt;/STRONG&gt;– Gold&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PGDay Boston 2026&lt;/STRONG&gt; – Silver&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Figure 4: Logos of the PostgreSQL community conferences our Microsoft team is proud to have sponsored over the last 12 months—along with thanks and gratitude to the conference organizers for making these events happen.&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;POSETTE: An Event for Postgres&lt;/STRONG&gt;: POSETTE is a free &amp;amp; virtual developer conference organized by our Postgres team at Microsoft. Now in its 5&lt;SUP&gt;th&lt;/SUP&gt; year, and aided by the fact that it’s virtual, it’s safe to say POSETTE is the largest Postgres event in the world—bringing together developers, users, contributors, and experts from across the globe to share their knowledge. (&lt;A href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;link to PosetteConf.com&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;Last year’s event in June 2025 was a hit—and you can still watch all of last year’s talks on the &lt;A href="https://aka.ms/posette-playlist-2025" target="_blank" rel="noopener"&gt;POSETTE 2025 playlist&lt;/A&gt; on YouTube. &lt;BR /&gt;&lt;BR /&gt;Special thanks to my teammates on the 2026 talk selection team—Daniel Gustafsson, Divya Bhargov, and Melanie Plageman—for reviewing all 238 of this year’s talk proposals. And of course POSETTE 2026 would not be happening without the full &lt;A href="https://posetteconf.com/2026/about/#organizing-team" target="_blank" rel="noopener"&gt;organizing team behind POSETTE 2026&lt;/A&gt;, nor without the partnership and financial support from AMD.&lt;BR /&gt;&lt;BR /&gt;Looking ahead, POSETTE 2026 is coming up soon: 16-18 Jun, online. With 4 livestreams, 2 keynotes, 44 talks, and &lt;A href="https://posetteconf.com/2026/speakers/" target="_blank" rel="noopener"&gt;50 speakers&lt;/A&gt;, there’s something for everyone.
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Check out the schedule &lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;on the &lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;&lt;A href="https://posetteconf.com/2026/schedule/" target="_blank" rel="noopener"&gt;PosetteConf website&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Register&lt;/STRONG&gt;: To make sure you don’t get doublebooked, register for the POSETTE 2026 livestream(s) that works for you:
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://developer.microsoft.com/reactor/events/26853/" target="_blank" rel="noopener"&gt;Livestream 1&lt;/A&gt; / &lt;A href="https://developer.microsoft.com/reactor/events/26854/" target="_blank" rel="noopener"&gt;Livestream 2&lt;/A&gt; / &lt;A href="https://developer.microsoft.com/reactor/events/26855/" target="_blank" rel="noopener"&gt;Livestream 3&lt;/A&gt; / &lt;A href="https://developer.microsoft.com/reactor/events/26856/" target="_blank" rel="noopener"&gt;Livestream 4&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If you attend live, the benefit is:&lt;/STRONG&gt; you’ll be able to ask the speakers questions &lt;A href="https://aka.ms/open-source-discord" target="_blank" rel="noopener"&gt;in the text chat on Discord&lt;/A&gt; while the talks are being livestreamed—and be part of the conversation. It’s a good way to connect with the speakers and the community.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Can’t make it live? No problem&lt;/STRONG&gt;, you can always catch the 2026 talks later on YouTube.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;&lt;STRONG&gt;Figure 5:&lt;/STRONG&gt; POSETTE: An Event for Postgres 2026 is a free and virtual developer event, organized by our Postgres team at Microsoft and now in its 5&lt;SUP&gt;th&lt;/SUP&gt; year. This graphic gives you a map of the 44 talks in POSETTE 2026, from the keynotes to the Postgres core talks, Postgres ecosystem talks, and Azure Database talks too.&lt;/P&gt;
&lt;/img&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Talking Postgres podcast: &lt;/STRONG&gt;Hard to believe, but our monthly podcast is now over 3 years old—with 39 episodes published as of the date of writing. Focused on the human side of Postgres, the conversations dig into why people who work with Postgres do what they do—and how they got to where they are. (&lt;A href="https://talkingpostgres.com/" target="_blank" rel="noopener"&gt;link to podcast&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;In the past year alone, I’ve had the chance to talk with these amazing people: Adam Prout, Andres Freund, Boriss Mejías, Charles Feddersen, Gwen Shapira, Melanie Plageman, Rob Emanuele, Shireesh Thota, Simon Willison, Tomas Vondra, Luigi Nardi, Peter Cooper, and Peter Farkas.&lt;BR /&gt;&lt;BR /&gt;You can find all episodes at &lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://talkingpostgres.com/" target="_blank" rel="noopener"&gt;Talking Postgres.com&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, on the &lt;/SPAN&gt;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://aka.ms/TalkingPostgres-playlist" target="_blank" rel="noopener"&gt;YouTube playlist&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;, or wherever you get your podcasts. Bonus: we record episodes &lt;/SPAN&gt;&lt;EM style="color: rgb(30, 30, 30);"&gt;live&lt;/EM&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; on the Microsoft Open Source Discord, where you can join the parallel live text chat during the show. It’s a fun way to connect with the community in real time.&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deliver 63 conference talks at Postgres events&lt;/STRONG&gt;: Both in-person and virtually, our Postgres teams have been sharing their expertise with the user and developer community on the conference circuit—delivering 63 talks in the last 13 months.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Organize Postgres user groups &amp;amp; meetups&lt;/STRONG&gt;: User groups and meetups are a great way to learn and meet other Postgres users and contributors—but it takes work to make it all happen: to find locations, line up speakers, organize food and drink, and get the word out. &lt;BR /&gt;&lt;BR /&gt;+1 to those on our team at Microsoft—and to everyone—who volunteer their time and partner with others in the Postgres community to help organize local Postgres user groups, including:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Malmö PostgreSQL User Group (M-PUG)&lt;/STRONG&gt;: Daniel Gustafsson (&lt;A href="https://www.meetup.com/malmo-postgresql-user-group-m-pug/" target="_blank" rel="noopener"&gt;link to meetup&lt;/A&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Prague PostgreSQL Meetup:&lt;/STRONG&gt; Tomas Vondra (&lt;A href="https://www.meetup.com/prague-postgresql-meetup/" target="_blank" rel="noopener"&gt;link to meetup&lt;/A&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL User Group Vienna&lt;/STRONG&gt;: Cornelia Biacsics (&lt;A href="https://www.meetup.com/postgresql-user-group-vienna/" target="_blank" rel="noopener"&gt;link to meetup&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Hosting local meetups at Microsoft&lt;/STRONG&gt;: Shout-out to the people involved in making Microsoft offices available as venues for local Postgres meetups, including:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Postgres Bangalore (PGBLR) Meetup&lt;/STRONG&gt;: hosted at the Microsoft office in Feb 2026 (&lt;A href="https://www.linkedin.com/posts/nitin-jadhav-b4807950_what-an-incredible-postgres-bangalore-ugcPost-7427227964427182081-FTzs/" target="_blank" rel="noopener"&gt;post by Nitin Jadhav about the meetup&lt;/A&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Barcelona (+Valencia) PostgreSQL User Group&lt;/STRONG&gt;: hosted at the Microsoft office in Oct 2025 (&lt;A href="https://www.meetup.com/barcelona-postgresql-meetup-group/events/311165188/" target="_blank" rel="noopener"&gt;link to meeting #4 at Microsoft&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Serve on Postgres core team, project committees, &amp;amp; PGCA Board of Directors&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;: Every open source project needs governance, and there are many teams and efforts that comprise the project beyond code. Shout-out to:&lt;BR /&gt;&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;Andres Freund from Microsoft serves on the &lt;STRONG&gt;PostgreSQL Core Team.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Melanie Plageman serves on the &lt;STRONG&gt;PostgreSQL Contributors committee&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Noah Misch and Andres Freund serve on the &lt;STRONG&gt;PostgreSQL Security team&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Claire Giordano serves on the board of directors for the &lt;STRONG&gt;PostgreSQL Community Association (PGCA) non-profit&lt;/STRONG&gt;, an organization that stewards the PostgreSQL brand assets including trademarks and domain names. (&lt;A href="https://www.postgresql.org/about/governance/" target="_blank" rel="noopener"&gt;link to PostgreSQL governance&lt;/A&gt; / &lt;A href="https://www.postgres.ca/" target="_blank" rel="noopener"&gt;link to PGCA non-profit&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Benefactor sponsor of PostgreSQL Community Association (PGCA) non-profit: &lt;/STRONG&gt;As of May 2026, Microsoft is a Benefactor sponsor of the PGCA non-profit and the PostgreSQL project, providing financial support to protect the PostgreSQL project’s trademarks and brand assets. (&lt;A href="https://www.postgres.ca/" target="_blank" rel="noopener"&gt;link to PGCA non-profit website&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL developer meetings&lt;/STRONG&gt;: Twice a year the developer community hosts invitation-only summits—typically coinciding with FOSDEM PGDay and PGConf.dev—to discuss “wicked problems”, technical issues, or development processes that are not easily addressed over email. Members of our Postgres contributor team have a seat at this table.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Blogging&lt;/STRONG&gt;: The blog platform where our Postgres team has been publishing the most in the last year—with 99 new posts—is on Microsoft Tech Community. Blogging continues to be a super useful way to share information—and when I’m researching something at 2AM, I’m definitely appreciative of all the Postgres people who take time to share information via blog! (link to the &lt;A href="https://aka.ms/microsoft-blog-postgres" target="_blank" rel="noopener"&gt;Microsoft Blog for PostgreSQL&lt;/A&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Contribute to Patroni 4.0.x and 4.1.x&lt;/STRONG&gt;: Patroni is a popular High Availability (HA) solution for Postgres. It helps you deploy, manage, and monitor HA clusters using streaming replication—and it’s open source. Alexander Kukushkin from our team is the technical lead and collaborates with engineers from different companies on Patroni. &lt;BR /&gt;&lt;BR /&gt;In the last 13 months, Patroni added Postgres 18 support as well as support for &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;patronictl demote-cluster&lt;/CODE&gt; and &lt;CODE style="color: #000; background: #f1f1f1; border-radius: 2px; padding: 1px 3px; display: inline-block;"&gt;patronictl promote-cluster&lt;/CODE&gt; which automate switching of a Patroni cluster between primary and standby cluster roles. &lt;BR /&gt;&lt;BR /&gt;I started to include individual release notes links for the last 13 months but there were too many to list: 5 minor releases and 1 new major release. (&lt;A href="https://patroni.readthedocs.io/en/latest/releases.html#release-notes" target="_blank" rel="noopener"&gt;link to Patroni release notes&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Microsoft ❤️ Postgres&lt;/H2&gt;
&lt;P&gt;For the 4&lt;SUP&gt;th&lt;/SUP&gt; year in a row, this blog post is a snapshot of the work our Postgres team at Microsoft has done over the last year. There are too many contributors to name—but without their efforts, this post would not exist.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;As I wrap-up, I’m struck by just how many ways the team at Microsoft shows up for Postgres. We run a managed Postgres service on Azure—and in the past year, we’ve launched a new Postgres extension for VS Code as well as a new Postgres database service called Azure HorizonDB (in Preview). We contribute upstream to the PostgreSQL project with code, architecture, reviews, testing, extensions, volunteering in the community, organizing user groups, and more. We maintain open source projects like Citus and Patroni. To share expertise, we write blog posts and give talks. We sponsor and help organize conferences—including POSETTE, the world’s largest virtual event for Postgres. And yes, we even produce a monthly podcast.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;And the infographic that pulls it all together? I think it's a work of art.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P class="lia-align-center"&gt;********************&lt;/P&gt;
&lt;H3&gt;Acknowledgements&lt;/H3&gt;
&lt;P&gt;In addition to significant contributions by this blog post’s co-authors Guy Bowerman (Azure Database for PostgreSQL chapter) and Sumedh Pathak (PostgreSQL core chapter), many thanks to people who contributed to this year’s blog post: Abe Omorogbe, Brian Holt, Denzil Ribeiro, Dingding Lu, Isaac Alves, My Nguyen, Shreya Aithal, and Silvano Coriani. I could not have pulled this together alone: thank you!&lt;/P&gt;</description>
      <pubDate>Thu, 11 Jun 2026 08:29:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/what-s-new-with-postgres-at-microsoft-2026-edition/ba-p/4526963</guid>
      <dc:creator>clairegiordano</dc:creator>
      <dc:date>2026-06-11T08:29:30Z</dc:date>
    </item>
    <item>
      <title>Introducing Durable Functions in PostgreSQL</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/introducing-durable-functions-in-postgresql/ba-p/4526821</link>
      <description>&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph" data-ccp-parastyle-defn="{&amp;quot;ObjectId&amp;quot;:&amp;quot;276295ed-5df2-5456-988c-5fdbab071054|1&amp;quot;,&amp;quot;ClassId&amp;quot;:1073872969,&amp;quot;Properties&amp;quot;:[201342446,&amp;quot;1&amp;quot;,201342447,&amp;quot;5&amp;quot;,201342448,&amp;quot;3&amp;quot;,201342449,&amp;quot;1&amp;quot;,469777841,&amp;quot;Aptos&amp;quot;,469777842,&amp;quot;Arial&amp;quot;,469777843,&amp;quot;游明朝&amp;quot;,469777844,&amp;quot;Aptos&amp;quot;,201341986,&amp;quot;1&amp;quot;,469769226,&amp;quot;Aptos,Arial,游明朝&amp;quot;,268442635,&amp;quot;24&amp;quot;,335559739,&amp;quot;180&amp;quot;,335559738,&amp;quot;180&amp;quot;,469775450,&amp;quot;First Paragraph&amp;quot;,201340122,&amp;quot;2&amp;quot;,134234082,&amp;quot;true&amp;quot;,134233614,&amp;quot;true&amp;quot;,469778129,&amp;quot;FirstParagraph&amp;quot;,335572020,&amp;quot;1&amp;quot;,469775498,&amp;quot;Body Text&amp;quot;,469778324,&amp;quot;Body Text&amp;quot;]}"&gt;By Abe Omorogbe, Senior PM |&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;&amp;nbsp;Pino De Can&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;dia, Principal Software Engineer | TJ Green, Principal Software Engineer&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Postgres will happily store your data, run your queries, and scale with you for years. But the moment you need to do more with that data, such as running multi-step transformation, scheduling nightly rollups, generating embeddings or waiting on an approval&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; you hit a wall. Postgres has no built-in way to run long-lived, fault-tolerant work.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;That's&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; why we built&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;a&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt; new &lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;open-source PostgreSQL extension&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;that brings &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; execution&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; directly into the database.&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;With &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, Postgres &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;doesn’t&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; just &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;store your &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;data,&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;it runs long-lived, fault-tolerant workflows on it, with built-in retries, parallelism, scheduling, and recovery. Instead of stitching together PL/&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pgSQL&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; functions or building external &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;orchestration&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; systems, you can now define and&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;run resilient workflows entirely in your database&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, backed by Postgres' durability and high availability.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;And on&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;A href="https://aka.ms/AzureHorizonDB" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Azure HorizonDB&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;,&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;also &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;powers &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;AI pipelines&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;enabling &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;production-ready &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;data and &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;AI&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;w&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;orkflows&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;end-to-end&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; right inside the database.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;In this post, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;we'll&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; cover:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact" data-ccp-parastyle-defn="{&amp;quot;ObjectId&amp;quot;:&amp;quot;eafb41c0-47a4-52dc-ac6b-3b5a7536b560|1&amp;quot;,&amp;quot;ClassId&amp;quot;:1073872969,&amp;quot;Properties&amp;quot;:[201342446,&amp;quot;1&amp;quot;,201342447,&amp;quot;5&amp;quot;,201342448,&amp;quot;3&amp;quot;,201342449,&amp;quot;1&amp;quot;,469777841,&amp;quot;Aptos&amp;quot;,469777842,&amp;quot;Arial&amp;quot;,469777843,&amp;quot;游明朝&amp;quot;,469777844,&amp;quot;Aptos&amp;quot;,201341986,&amp;quot;1&amp;quot;,469769226,&amp;quot;Aptos,Arial,游明朝&amp;quot;,268442635,&amp;quot;24&amp;quot;,335559739,&amp;quot;36&amp;quot;,335559738,&amp;quot;36&amp;quot;,469775450,&amp;quot;Compact&amp;quot;,201340122,&amp;quot;2&amp;quot;,134234082,&amp;quot;true&amp;quot;,134233614,&amp;quot;true&amp;quot;,469778129,&amp;quot;Compact&amp;quot;,335572020,&amp;quot;1&amp;quot;,469778324,&amp;quot;Body Text&amp;quot;]}"&gt;The hidden trap: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;blocking background work&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;What&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; is &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;and&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;DSL&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; that drives it&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;How&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;this &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;engine powers &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;AI &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;p&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;ipelines&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; on &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;HorizonDB&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Sample patterns worth exploring&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Getting started on&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;, on your laptop, and in VS Code&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;🚀 &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;&lt;STRONG&gt;Want to try it out?&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt; ships in &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;Azure &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;HorizonDB&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;,&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt; Microsoft's new PostgreSQL cloud service. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;The &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt; Preview is the fastest way to try&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;pg_durable&lt;/SPAN&gt;&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;&lt;STRONG&gt;AI pipelines&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;together&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Block Text"&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;A href="https://learn.microsoft.com/en-us/azure/horizondb/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Get started in HorizonDB →&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:0,&amp;quot;335559737&amp;quot;:480,&amp;quot;335559738&amp;quot;:100,&amp;quot;335559739&amp;quot;:100}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Figure 1: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; visualization&lt;/SPAN&gt;&lt;/img&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;The &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;hidden &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;trap: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;blocking background work&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Most Postgres teams eventually reach a point where &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;they need to run &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;critical tasks &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;on&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; their data: transformations, nightly aggregations,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; database maintenance workflows,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;&amp;nbsp;embedding jobs, or multi-step business processes. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;So,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; they do the natural thing and try to keep that work inside Postgres.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Th&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;ey&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; end up on a journey of increasing complexity and maintenance burden&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;First,&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;just run the task as a function in your database&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;You cram the whole workflow into one PL/&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pgSQL&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; function: loop, transform, call APIs, write results, return. It looks &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;simple&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; until you &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;have to&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; run it in production. One connection &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;stays&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; tied up the whole time. Everything runs inside one big transaction, with long locks and no visibility into partial progress. If the connection drops or the database restarts, the whole run is gone. No per-step retries. No parallelism. No scheduling. No clean way to &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pause for&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; human input.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;When it fails,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; you move it outside&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;You push the workflow into an external service: a job queue, polling workers, state tables, step coordination, retry logic, crash-recovery sweeps, and cleanup jobs. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;What started as a few background tasks turns into a full distributed system. Before &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;you’ve&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; even touched the business logic, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;you’re&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; building and operating infrastructure just to coordinate work &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;that’s&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; still fundamentally tied to your data.&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Both &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;paths &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;are workarounds for the same missing primitive&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;: &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;durable,&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;asynchronous &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;background work&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; that lives where your data lives.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;That's&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; the gap &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; fills.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;pg_durable&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="heading 2"&gt;actually is&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph" data-ccp-parastyle-defn="{&amp;quot;ObjectId&amp;quot;:&amp;quot;276295ed-5df2-5456-988c-5fdbab071054|1&amp;quot;,&amp;quot;ClassId&amp;quot;:1073872969,&amp;quot;Properties&amp;quot;:[201342446,&amp;quot;1&amp;quot;,201342447,&amp;quot;5&amp;quot;,201342448,&amp;quot;3&amp;quot;,201342449,&amp;quot;1&amp;quot;,469777841,&amp;quot;Aptos&amp;quot;,469777842,&amp;quot;Arial&amp;quot;,469777843,&amp;quot;游明朝&amp;quot;,469777844,&amp;quot;Aptos&amp;quot;,201341986,&amp;quot;1&amp;quot;,469769226,&amp;quot;Aptos,Arial,游明朝&amp;quot;,268442635,&amp;quot;24&amp;quot;,335559739,&amp;quot;180&amp;quot;,335559738,&amp;quot;180&amp;quot;,469775450,&amp;quot;First Paragraph&amp;quot;,201340122,&amp;quot;2&amp;quot;,134234082,&amp;quot;true&amp;quot;,134233614,&amp;quot;true&amp;quot;,469778129,&amp;quot;FirstParagraph&amp;quot;,335572020,&amp;quot;1&amp;quot;,469775498,&amp;quot;Body Text&amp;quot;,469778324,&amp;quot;Body Text&amp;quot;]}"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; is a&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; Postgres extension that consists of a DSL (Domain specific language) and the &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/duroxide" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;duroxide runtime&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; hosted in a &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Postgres&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; background worker&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;.&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; You describe a workflow as a small SQL expression, call &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;df.start&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;(...)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, and get an instance ID back &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;immediately&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;. The work runs off to the side in a background worker, so it never blocks your connection or transaction, and you can check progress later with &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;df.status&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;df.result&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;. The execution state lives in Postgres, which means it &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;benefits&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; from the database’s durability, HA, backups, and recovery&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;. Additionally, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;the workflow definition does not have to live in the database&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;:&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="First Paragraph"&gt;your application can send it to &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;df.start&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;(...)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; over a regular Postgres connection.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Figure &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;2&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; orch&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;estra&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;tion of worker and schema&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/img&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Because execution is asynchronous, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; automatically breaks a workflow into discrete steps. Each step runs in its own session and transaction, commits its progress, and hands off to the next instead of keeping one giant transaction open. Steps are checkpointed in Postgres and recovered by deterministic replay, so workflows survive crashes, restarts, and failovers and resume where they left off. If a step fails, only &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;that&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; step retries.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;The whole thing is expressed through a tiny DSL of composable operators:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 89.2593%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Operator&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Meaning&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char" data-ccp-charstyle-defn="{&amp;quot;ObjectId&amp;quot;:&amp;quot;a31b87fc-7929-525d-a968-aa0f568a0536|1&amp;quot;,&amp;quot;ClassId&amp;quot;:1073872969,&amp;quot;Properties&amp;quot;:[201342446,&amp;quot;1&amp;quot;,201342447,&amp;quot;5&amp;quot;,201342448,&amp;quot;3&amp;quot;,201342449,&amp;quot;1&amp;quot;,469777841,&amp;quot;Consolas&amp;quot;,469777842,&amp;quot;Arial&amp;quot;,469777843,&amp;quot;游明朝&amp;quot;,469777844,&amp;quot;Consolas&amp;quot;,201341986,&amp;quot;1&amp;quot;,469769226,&amp;quot;Consolas&amp;quot;,268442635,&amp;quot;22&amp;quot;,469775450,&amp;quot;Verbatim Char&amp;quot;,201340122,&amp;quot;1&amp;quot;,134233614,&amp;quot;true&amp;quot;,469778129,&amp;quot;VerbatimChar&amp;quot;,335572020,&amp;quot;1&amp;quot;,134231262,&amp;quot;true&amp;quot;,469777929,&amp;quot;Source Code&amp;quot;,469778324,&amp;quot;Caption Char&amp;quot;]}" data-ccp-charstyle-linked-defn="{&amp;quot;ObjectId&amp;quot;:&amp;quot;94116779-72d8-55e3-836f-dfb3e4f6a90b|1&amp;quot;,&amp;quot;ClassId&amp;quot;:1073872969,&amp;quot;Properties&amp;quot;:[201342446,&amp;quot;1&amp;quot;,201342447,&amp;quot;5&amp;quot;,201342448,&amp;quot;3&amp;quot;,201342449,&amp;quot;1&amp;quot;,469777841,&amp;quot;Aptos&amp;quot;,469777842,&amp;quot;Arial&amp;quot;,469777843,&amp;quot;游明朝&amp;quot;,469777844,&amp;quot;Aptos&amp;quot;,201341986,&amp;quot;1&amp;quot;,469769226,&amp;quot;Aptos,Arial,游明朝&amp;quot;,268442635,&amp;quot;24&amp;quot;,469775450,&amp;quot;Source Code&amp;quot;,201340122,&amp;quot;2&amp;quot;,134233614,&amp;quot;true&amp;quot;,469778129,&amp;quot;SourceCode&amp;quot;,335572020,&amp;quot;1&amp;quot;,335557856,&amp;quot;16316664&amp;quot;,469777929,&amp;quot;Verbatim Char&amp;quot;,469778324,&amp;quot;Normal&amp;quot;]}"&gt;~&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Sequential&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;run this, then that&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;&amp;amp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Parallel&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;fan out, wait for &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;all&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;|&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Race&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;fan out, take the &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;first&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; to finish&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;?&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; / &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;!&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Conditional&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;.&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Compact"&gt;if / else&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;@&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Loop. repeat durably, survive restarts&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;|=&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Capture a step's result into a variable (reuse with &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;$&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Advanced Functions&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.if&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Conditional branch&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.loop&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Repeat &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;statements&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.join&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Execute in parallel, wait for all&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.http&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;To call an allowlisted endpoint&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.wait_for_schedule&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;For &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;cron&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;-style timing&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;df.wait_for_signal&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Pause for an external event&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Read more about &lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/blob/main/USER_GUIDE.md#key-features" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;all operators and functions in pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt; &lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 32px;" data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Without&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; vs. with &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 32px;" data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;The hand-rolled version of &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;"run three aggregations in parallel, then refresh a dashboard with retries and crash recovery"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; usually means 300+ lines of queue tables, polling workers, state-machine rows, per-step retry logic, crash-recovery sweeps, and cleanup jobs. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Plus,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; the runbook &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;to operate&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; it.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;The &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; version&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT df.start( 
    'SELECT count(*) FROM users' 
  &amp;amp; 'SELECT count(*) FROM orders' 
  &amp;amp; 'SELECT sum(amount) FROM orders' 
  ~&amp;gt; 'REFRESH MATERIALIZED VIEW metrics', 
    'refresh-dashboard' 
); &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;You write&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;the SQL&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; owns the queue, the state, the coordination, the retries, and the crash recovery.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Two ways to use &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;pg_&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;1&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;:&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="heading 3"&gt;Use &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; directly (works on &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Azure &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; or &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;any Postgres 17)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Enable it and start orchestrating:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CREATE EXTENSION pg_durable; 
 
SELECT df.start($$ SELECT 'Hello, durable world!' AS message $$); 
-- returns an instance ID immediately; the worker runs it asynchronously &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;From there you compose: sequential pipelines, conditional branches, races for timeout-or-result, variable passing between steps, human-in-the-loop approvals, scheduled maintenance all in SQL, close to the data, with no new infrastructure. This is the "just use Postgres" answer to a problem teams usually solve by&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;leaving&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; Postgres.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Because &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;it's&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; open source under the permissive PostgreSQL License, you can clone the repo and run it on your laptop, your server, or any cloud.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;2&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;: &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;AI pipelines (&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt; capability&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;On &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; becomes the foundation for something even more approachable: a managed, declarative&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; &lt;STRONG&gt;AI pipeline&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;surface in the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;azure_ai&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; extension. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; gives you the durable execution engine, while the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;ai.*&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; API gives you an AI-shaped model of sources, steps, sinks, and triggers that compile &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;into a &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;durable graph.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Traditional app-tier embedding pipelines fail in predictable ways: a transient API error mid-batch with no shared checkpoint&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;a worker that crashes after writing chunks but before marking the parent row processed&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; no clean way to re-embed just the rows that changed.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Move that logic into &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; and the source, the steps, the sink, and the run history are all SQL&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;protected by the same transactions, backups, and PITR&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; (point-in-time recovery) &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;your data already has.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;A complete chunk → embed &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;AI &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pipeline is one definition:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT ai.create_pipeline( 
    name   =&amp;gt; 'ai_pipeline', 
    source =&amp;gt; ai.table_source(table_name =&amp;gt; 'documents_ai_pipeline'), 
    steps  =&amp;gt; ARRAY[ 
        ai.chunk(input =&amp;gt; 'content'), 
        ai.embed(model =&amp;gt; 'default-embedding', input =&amp;gt; 'chunk_text', dimensions =&amp;gt; 1536) 
    ], 
    trigger =&amp;gt; 'on_change', 
    sink    =&amp;gt; ai.table_sink('documents_ai_pipeline_output') 
); 
 
SELECT ai.run('ai_pipeline'); &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Each AI step becomes a durable node, so if &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;ai.embed&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; fails, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;ai.chunk&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; &lt;SPAN data-ccp-parastyle="First Paragraph"&gt;doesn’t&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; run again. And with &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;trigger =&amp;gt; '&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;on_change&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;'&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, the pipeline runs automatically as rows change, embedding only &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;what’s&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; new.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Add a &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/horizondb/ai/vector-index-diskann" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;DiskANN&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt; index&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; on the resulting table, and you have &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;production-ready &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;vector search end to end, entirely inside the database.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Where &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt; fits and where it &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;doesn't&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;If &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;you've&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; used&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; external &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;orchestrators&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; such as&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; Temporal or Airflow, your first reaction is probably: &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;why would I put control flow in my database?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;&lt;EM&gt; &lt;/EM&gt;Fair question. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;pg_durable&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="First Paragraph"&gt;isn't&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; trying to be a universal orchestrator.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Reach for &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; when&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; the workflow is &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;tightly coupled to Postgres state&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; T&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;he rows it reads and writes live in the same &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;database,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; it &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;benefits&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; from the database's own durability, backups, and PITR, and &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;you'd&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; rather not stand up a separate system to coordinate work that never leaves the data tier. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Think: e&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;mbedding pipelines, ETL &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;job&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;s, scheduled &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;maintenance,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; and &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;queue-style background jobs.&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Reach for a dedicated orchestrator&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;&lt;STRONG&gt; &lt;/STRONG&gt;when the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;workflow's&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; center of gravity is &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;outside&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; Postgres&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; fanning across heterogeneous services, or &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;running&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;arbitrary application logic that does not map cleanly to SQL steps, branching, loops, or HTTP calls.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Get started&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt; &lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 28px;" data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;On Azure &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;HorizonDB&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 28px;" data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;LI-CODE lang="sql"&gt;CREATE EXTENSION IF NOT EXISTS pg_durable; 
 
-- Execute a simple SQL query as a durable function 
SELECT df.start($$ SELECT 'Hello, durable world!' AS message $$); 
-- Returns: a1b2c3d4 (8-character instance ID) 
 
-- Get result of a specific instance 
SELECT df.result(&amp;lt;ID&amp;gt;); 

That's it: submit, walk away, inspect. &lt;/LI-CODE&gt;
&lt;P&gt;Read the &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/horizondb/development/durable-functions" target="_blank" rel="noopener"&gt;documentation for more details.&lt;/A&gt;&lt;BR /&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 28px;" data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;In VS Code, with the PostgreSQL extension&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(30, 30, 30); font-size: 28px;" data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;A dense one-liner of &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;~&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;&amp;amp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;|=&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; is precise once it clicks, but the learning curve is real so &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;flatten&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; it with tooling. Install the &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/horizondb/development/vs-code-extension/vs-code-overview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;PostgreSQL extension for VS Code&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; from the Marketplace:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;Figure 3: AI pipelines and pg_durable in VSCode extension&lt;/img&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Connect to &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; or your local Postgres&lt;/SPAN&gt;&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;directly from the extension&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Let Copilot write the SQL.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;The&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/tree/main/.agents/skills/pg-durable-sql" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;pg-durable-sql skill&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; turns a plain-English description ("every night, archive orders older than &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;90 days&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;") into correct pg_durable syntax.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Run it and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;watch&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; it.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; The extension renders &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;pg_durable&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;&lt;EM&gt; &lt;/EM&gt;workflows and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;azure_ai&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; pipelines as live graphs&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;definition&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;and&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt; each run&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;so you can see every step, its timing, and exactly where a failure happened.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Authoring, execution, run visualization, and inspection in one window and the same tooling works against any Postgres, not just &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;HorizonDB&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;On your laptop&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Prefer to run it yourself? Clone &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-charstyle="Verbatim Char"&gt;microsoft/pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, use the &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Codespace&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; prebuild or VS Code Dev Container, and add the extension&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;&amp;nbsp;on any Postgres 17.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Sample &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;pattern&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;s worth exploring&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;The &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/blob/main/docs/SCENARIOS.md" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;scenario guide&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; &lt;SPAN data-ccp-parastyle="First Paragraph"&gt;has &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;a&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; full catalog&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; of scenarios; &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;however, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;these are the three &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;I would&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; start with.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;&lt;STRONG&gt;ETL Pipeline:&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;a multi-step data transformation&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; where each step must &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;be completed&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; before the next begins. Failures should stop the pipeline.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT df.start( 
    'DELETE FROM target WHERE loaded_at &amp;lt; now() - interval ''7 days'''        -- Step 1: Cleanup old 
    ~&amp;gt; 'UPDATE staging SET processed_at = now() WHERE processed_at IS NULL'   -- Step 2: Mark staging 
    ~&amp;gt; 'INSERT INTO target (data, source_id) 
        SELECT data, source_id FROM staging WHERE processed_at IS NOT NULL',  -- Step 3: Load 
    'etl-pipeline'  -- Label for easy identification 
); &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;If the database restarts mid-backfill, it picks up from the last checkpointed batch&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;, &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;not row zero&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/blob/main/docs/SCENARIOS.md#scenario-2-etl-pipeline" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;See full example&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;Scheduled Data Sync&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;poll an external API or run a job on a schedule (hourly, daily, every 30 minutes). The job should run forever and survive restarts.&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; (&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/blob/main/docs/SCENARIOS.md#scenario-5-scheduled-data-sync" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;See full example&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;)&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Scheduled sync: fetch data every 30 minutes (runs forever) 
SELECT df.start( 
    @&amp;gt; (  -- @&amp;gt; creates an eternal loop 
        -- Fetch from external API 
        (df.http( 
            'https://httpbingo.org/json', 
            'GET' 
        ) |=&amp;gt; 'response') 
         
        -- Store the response 
        ~&amp;gt; 'INSERT INTO external_data_sync (data)  
            VALUES ($response::jsonb)' 
         
        -- Wait for next scheduled run 
        ~&amp;gt; df.wait_for_schedule('*/30 * * * *')  -- Cron: every 30 minutes 
    ), 
    'scheduled-data-sync' 
); &lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;Human-in-the-loop approval&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;&lt;STRONG&gt; &lt;/STRONG&gt;auto-apply routine changes, pause the risky ones until a person signals approval&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; (&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable/tree/main/examples/invoice-approval" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;See full example&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;)&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT df.start( 
    'SELECT amount &amp;gt; 10000 AS needs_review FROM invoices WHERE id = 42' |=&amp;gt; 'risky' 
    ?&amp;gt; ( df.wait_for_signal('invoice-42') ~&amp;gt; 'UPDATE invoices SET status = ''paid'' WHERE id = 42' ) 
    !&amp;gt; 'UPDATE invoices SET status = ''paid'' WHERE id = 42', 
    'invoice-approval' 
); &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;The workflow simply waits minutes or days until a reviewer releases it with the matching signal, then resumes.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;The community is already running with it&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;pg_durable&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; launched as open &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;source&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; and the community is already kicking the tires. &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;The project &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;was&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="Body Text"&gt;a top&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; article&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;A href="https://news.ycombinator.com/item?id=48414367" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;on Hacker News&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; on launch day&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; and &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;1.7K stars on GitHub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; within &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;its &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;first&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; few&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; days of &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;initial&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; launch&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; Also&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://franckpachot.medium.com/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Franck Pachot&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; (PostgreSQL community veteran) published an independent walkthrough&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://dev.to/franckpachot/getting-started-with-pgdurable-durable-workflows-inside-postgresql-3980" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Getting Started with pg_durable: durable workflows inside PostgreSQL&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; within days of release.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;The repo is actively &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;developed,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; and the maintainers are reading every issue and PR.&lt;/SPAN&gt; &lt;SPAN data-ccp-parastyle="First Paragraph"&gt;If &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;you want improvements in our&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; DSL ergonomics, say so. If you want an operator that &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;doesn't&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; exist yet, open an issue. If &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;you've&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; got a scenario we &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;haven't&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; covered, send a PR. The syntax, the docs, and the rough edges all get better when people who &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt;run&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="First Paragraph"&gt; Postgres in production push back.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;So,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; clone it,&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; and&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; build something real. If you find rough edges, open an issue or send a PR at &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;A href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;microsoft/pg_durable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;. We think &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt;you'll&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Body Text"&gt; be surprised by how much it can take.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Learn more&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;A class="lia-external-url" href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;pg_durable&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;&lt;A class="lia-external-url" href="https://github.com/microsoft/pg_durable" target="_blank" rel="noopener"&gt; on GitHub&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;A class="lia-external-url" style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://learn.microsoft.com/en-us/azure/horizondb/development/durable-functions" target="_blank" rel="noopener"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;Durable Functions on&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;HorizonDB&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;A class="lia-external-url" style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://learn.microsoft.com/en-us/azure/horizondb/ai/ai-pipelines" target="_blank" rel="noopener"&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;AI&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;p&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;ipelines on &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="Compact"&gt;HorizonDB&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Tue, 09 Jun 2026 17:28:31 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/introducing-durable-functions-in-postgresql/ba-p/4526821</guid>
      <dc:creator>abeomor-msft</dc:creator>
      <dc:date>2026-06-09T17:28:31Z</dc:date>
    </item>
    <item>
      <title>Make upgrades predictable with Pre-Upgrade Validation Checks</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/make-upgrades-predictable-with-pre-upgrade-validation-checks/ba-p/4522593</link>
      <description>&lt;P style="font-size: 18px;"&gt;Major version upgrades are an important part of keeping PostgreSQL environments current with the latest features, security updates, and performance improvements. But for production workloads, the hardest part is often not the upgrade itself - it is knowing whether the server is ready before the upgrade window begins.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Today, we’re announcing the Public Preview of &lt;STRONG&gt;Pre-Upgrade Validation Checks&lt;/STRONG&gt; for &lt;A class="lia-external-url" href="https://azure.microsoft.com/products/postgresql" target="_blank" rel="noopener"&gt;Azure Database for PostgreSQL&lt;/A&gt;. This new capability lets you validate upgrade readiness before starting the actual major version upgrade, helping you identify and resolve blockers early.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;With Pre-Upgrade Validation Checks, you can run upgrade checks independently, review actionable results, fix issues, and re-run validation until your server is ready. This shifts upgrade troubleshooting from the upgrade window to a proactive pre-flight step.&lt;/P&gt;
&lt;H1&gt;Why this matters&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;Azure Database for PostgreSQL flexible server already supports in-place &lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/concepts-major-version-upgrade" target="_blank" rel="noopener"&gt;major version upgrades&lt;/A&gt; using PostgreSQL &lt;A href="https://www.postgresql.org/docs/current/pgupgrade.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;pg_upgrade&lt;/CODE&gt;&lt;/A&gt;. The service preserves the server name and connection settings, runs upgrade prechecks, takes an implicit backup when checks pass, and then performs the engine upgrade.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Pre-Upgrade Validation Checks extend this model by &lt;STRONG&gt;decoupling validation from upgrade execution&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Instead of: &lt;STRONG&gt;Upgrade → Discover issue → Troubleshoot → Retry&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;You can now follow: &lt;STRONG&gt;Validate → Fix → Re-Validate → Upgrade&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;This helps reduce failed upgrade attempts, improves planning, and gives teams more confidence before entering a production change window.&lt;/P&gt;
&lt;H1&gt;What Pre-Upgrade Validation Checks validate&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;Pre-Upgrade Validation Checks evaluate both Azure-specific upgrade requirements and PostgreSQL compatibility checks, including &lt;CODE&gt;pg_upgrade --check&lt;/CODE&gt;.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;At a high level, the validation covers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuration and platform prerequisites&lt;/STRONG&gt;, such as server state, target version support, storage headroom, and upgrade readiness.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Extension compatibility&lt;/STRONG&gt;, including unsupported or version-sensitive extensions.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Database dependencies and objects&lt;/STRONG&gt;, such as read replicas, logical replication slots, event triggers, &lt;CODE&gt;PostGIS search_path&lt;/CODE&gt;, and upgrade-sensitive objects.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Engine compatibility&lt;/STRONG&gt;, using PostgreSQL &lt;CODE&gt;pg_upgrade --check&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="font-size: 18px;"&gt;If a blocking issue is found, the result includes details to help you understand what needs to be fixed before retrying validation or starting the upgrade.&lt;/P&gt;
&lt;H1&gt;How to run Pre-Upgrade Validation Checks from the Azure portal&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;You can run Pre-Upgrade Validation Checks directly from the existing &lt;STRONG&gt;Upgrade&lt;/STRONG&gt; experience in the Azure portal.&lt;/P&gt;
&lt;H2 style="font-size: 18px;"&gt;&lt;STRONG&gt;Step 1: Select &lt;CODE&gt;Validate only&lt;/CODE&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P style="font-size: 18px;"&gt;From your Azure Database for PostgreSQL flexible server, select &lt;STRONG&gt;Upgrade&lt;/STRONG&gt;. Choose the target PostgreSQL version, then select &lt;STRONG&gt;&lt;CODE&gt;Validate only&lt;/CODE&gt;&lt;/STRONG&gt; as the action. This runs validation checks without starting the actual upgrade.&lt;/P&gt;
&lt;img&gt;Figure 1: Select &lt;CODE&gt;Validate only&lt;/CODE&gt; before starting upgrade&lt;/img&gt;
&lt;H2 style="font-size: 18px;"&gt;&lt;STRONG&gt;Step 2: Review successful validation results&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P style="font-size: 18px;"&gt;If all validation checks pass, the result shows a successful status. At this point, the server is ready to proceed with the major version upgrade.&lt;/P&gt;
&lt;img&gt;Figure 2: Successful validation results&lt;/img&gt;
&lt;P style="font-size: 18px;"&gt;In this example, all pre-upgrade validation checks completed successfully, and no blocking issues were detected for the selected target PostgreSQL version.&lt;/P&gt;
&lt;H2 style="font-size: 18px;"&gt;&lt;STRONG&gt;Step 3: Review and fix validation errors&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P style="font-size: 18px;"&gt;If validation detects issues, the results page shows failed checks with details and remediation guidance. You can fix the reported issues and run validation again.&lt;/P&gt;
&lt;img&gt;Figure 3: Failed validation with remediation details&lt;/img&gt;
&lt;P style="font-size: 18px;"&gt;In this example, validation found an event trigger issue before the upgrade was started. The upgrade action remains blocked until the issue is resolved and validation passes.&lt;/P&gt;
&lt;H2 style="font-size: 18px;"&gt;&lt;STRONG&gt;Step 4: Download validation results&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P style="font-size: 18px;"&gt;You can also download the validation results as a CSV file. This makes it easier to share findings with DBA, application, platform, or support teams before the actual upgrade window.&lt;/P&gt;
&lt;img&gt;Figure 4: Download validation results as CSV&lt;/img&gt;
&lt;P style="font-size: 18px;"&gt;The CSV output is useful for offline review, internal tracking, and support collaboration.&lt;/P&gt;
&lt;H1&gt;Recommended workflow&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;Use Pre-Upgrade Validation Checks as part of your upgrade planning process: run validation early, review the results, fix any reported blockers, re-run validation until all checks pass, and then proceed with the major version upgrade.&lt;/P&gt;
&lt;H1&gt;What happens after validation passes?&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;Once validation succeeds, you can proceed with the &lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/how-to-perform-major-version-upgrade?tabs=portal-major-version-upgrade" target="_blank" rel="noopener"&gt;major version upgrade&lt;/A&gt; using the existing Azure PostgreSQL upgrade workflow. The actual upgrade remains a separate operation and still includes the managed backup and &lt;CODE&gt;pg_upgrade&lt;/CODE&gt; execution steps.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Pre-Upgrade Validation Checks do not remove the upgrade downtime window. Instead, they help ensure that known blockers are resolved before that window begins.&lt;/P&gt;
&lt;H1&gt;Frequently asked questions&lt;/H1&gt;
&lt;P style="font-size: 18px;"&gt;&lt;STRONG&gt;Does &lt;CODE&gt;Validate only&lt;/CODE&gt; perform the upgrade?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;No. The &lt;STRONG&gt;&lt;CODE&gt;Validate only&lt;/CODE&gt;&lt;/STRONG&gt; option runs readiness checks without upgrading the server. The actual major version upgrade remains a separate action.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;&lt;STRONG&gt;Does this remove downtime?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;No. Major version upgrades still require an execution window. The benefit is that compatibility issues can be discovered and resolved before downtime begins.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;&lt;STRONG&gt;Can I re-run validation?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Yes. Validation is designed to be repeatable. You can fix reported issues and re-run checks until all validations pass.&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;&lt;STRONG&gt;What types of blockers can be detected?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="font-size: 18px;"&gt;Common examples include unsupported extensions, logical replication slots, event triggers, insufficient storage headroom, configuration issues, and PostgreSQL compatibility findings from &lt;CODE&gt;pg_upgrade --check&lt;/CODE&gt;.&lt;/P&gt;
&lt;H2&gt;Get started&lt;/H2&gt;
&lt;P&gt;Pre-Upgrade Validation Checks are now available in Public Preview for Azure Database for PostgreSQL flexible server.&lt;/P&gt;
&lt;P&gt;To try it, open your flexible server in the Azure portal, go to &lt;STRONG&gt;Upgrade&lt;/STRONG&gt;, select your target PostgreSQL version, and choose &lt;STRONG&gt;Validate only&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2&gt;Learn more&lt;/H2&gt;
&lt;P style="font-size: 18px;"&gt;To learn more about major version upgrades and related Azure PostgreSQL capabilities, see:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/concepts-major-version-upgrade" target="_blank" rel="noopener"&gt;Major version upgrades in Azure Database for PostgreSQL&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/how-to-perform-major-version-upgrade?tabs=portal-major-version-upgrade" target="_blank" rel="noopener"&gt;Perform a major version upgrade&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/concepts-supported-versions" target="_blank" rel="noopener"&gt;Supported PostgreSQL versions &lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/extensions/concepts-extensions-by-engine?pivots=postgresql-18" target="_blank" rel="noopener"&gt;PostgreSQL extensions supported by Azure Database for PostgreSQL &lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/monitor/how-to-configure-server-logs?tabs=portal-enable-capture-of-logs%2Cportal-disable-capture-of-logs%2Cportal-list-captured-logs%2Cportal-download-captured-logs" target="_blank" rel="noopener"&gt;Download PostgreSQL server logs&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.postgresql.org/docs/current/pgupgrade.html" target="_blank" rel="noopener"&gt;PostgreSQL &lt;CODE&gt;pg_upgrade&lt;/CODE&gt; documentation&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;EM&gt;&lt;STRONG&gt;Validate early. Fix with confidence. Upgrade when ready.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Thu, 11 Jun 2026 14:31:16 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/make-upgrades-predictable-with-pre-upgrade-validation-checks/ba-p/4522593</guid>
      <dc:creator>varun-dhawan</dc:creator>
      <dc:date>2026-06-11T14:31:16Z</dc:date>
    </item>
    <item>
      <title>Announcing new security, maintenance and analytics features for PostgreSQL at Microsoft Build 2026</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/announcing-new-security-maintenance-and-analytics-features-for/ba-p/4524559</link>
      <description>&lt;P&gt;&lt;SPAN data-teams="true"&gt;At &lt;STRONG&gt;Microsoft Build 2026&lt;/STRONG&gt;, we’re announcing a major wave of PostgreSQL innovation across Azure. Alongside&lt;/SPAN&gt;&amp;nbsp;the public preview of &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://aka.ms/HorizonDB-Build-blog" target="_blank" rel="noopener"&gt;Azure HorizonDB&lt;/A&gt;&lt;/STRONG&gt;, &lt;SPAN data-teams="true"&gt;we’re delivering a broad set of enhancements for&lt;/SPAN&gt; our fully managed open-source PostgreSQL service: &lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/postgresql/overview" target="_blank" rel="noopener"&gt;Azure Database for PostgreSQL flexible server.&lt;/A&gt;&lt;/STRONG&gt; These updates span &lt;EM&gt;performance&lt;/EM&gt;,&lt;EM&gt; analytics&lt;/EM&gt;,&lt;EM&gt; security&lt;/EM&gt;,&lt;EM&gt; operations&lt;/EM&gt;,&lt;EM&gt; resilience&lt;/EM&gt; and &lt;EM&gt;migration&lt;/EM&gt;&amp;nbsp;-&lt;SPAN style="color: rgb(30, 30, 30);"&gt; helping you build faster, operate with more control, secure your workloads, and modernize with confidence.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Here’s a quick tour of the top flexible server announcements at Build 2026.&lt;/P&gt;
&lt;H1&gt;Feature Highlights&lt;/H1&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-v6" target="_self" rel="noopener"&gt;V6 SKU with local SSD storage (NVMe)&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-duck-db" target="_self" rel="noopener"&gt;pg_duckdb Extension&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-ivm" target="_self" rel="noopener"&gt;pg_ivm Extension&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-assessments" target="_self" rel="noopener"&gt;Defender Security assessments&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-tables" target="_self" rel="noopener"&gt;temporal_tables Extension&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-cmk-support" target="_self" rel="noopener"&gt;&lt;STRONG&gt;Cross-tenant CMK&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-token" target="_self" rel="noopener"&gt;&lt;STRONG&gt;Automatic Entra token refresh libraries&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-powershell" target="_self" rel="noopener"&gt;&lt;STRONG&gt;New Powershell module:&amp;nbsp; Az.PostgreSQLFlexibleServer&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-maintenance" target="_self" rel="noopener" data-lia-auto-title="More control over planned maintenance" data-lia-auto-title-active="0"&gt;&lt;STRONG&gt;More control over planned maintenance&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-pvc" target="_self" rel="noopener"&gt;Pre-Upgrade validation checks&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-dashboard" target="_self" rel="noopener"&gt;&lt;STRONG&gt;New Built-in Grafana dashboards&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-chaos" target="_self" rel="noopener"&gt;&lt;STRONG&gt;Chaos Studio supports Azure Database for PostgreSQL&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-ai-migration" target="_self" rel="noopener"&gt;&lt;STRONG&gt;AI-assisted Oracle to PostgreSQL migration&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-migration-service" target="_self" rel="noopener"&gt;&lt;STRONG&gt;Migration Service for Azure Database for PostgreSQL improvements (EDB, AlloyDB)&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1&gt;Performance, Scale &amp;amp; Analytics&lt;/H1&gt;
&lt;H4 id="v6"&gt;V6 SKU with local SSD storage (NVMe) Generally Available by the end of June&lt;/H4&gt;
&lt;P&gt;V6 Compute SKUs are built to handle your largest workloads, delivering high performance, massive scale, and better price performance. Powered by 5th Gen Intel® Xeon® processor and AMD's fourth Generation EPYC™ 9004 processors you can scale up to 192 vCores and 1.8 TiB of memory. With NVMe-backed local SSD storage and support for high-performance storage options such as Premium SSD v2, you can achieve high IOPS and throughput for demanding, IO-intensive PostgreSQL workloads. The Intel &amp;amp; AMD v6 SKUs with local SSD (NVMe) will be Generally Available by the end of June. Learn more: &lt;A href="https://learn.microsoft.com/azure/postgresql/compute-storage/concepts-compute" target="_blank" rel="noopener"&gt;Compute options in Azure Database for PostgreSQL&lt;/A&gt;.&lt;/P&gt;
&lt;H4 id="duck-db"&gt;pg_duckdb Extension Generally Available&lt;/H4&gt;
&lt;P&gt;The &lt;STRONG&gt;pg_duckdb&lt;/STRONG&gt; extension enables you to accelerate high-performance analytics and data-intensive applications with DuckDB’s SQL engine running inside your Postgres server. We’re pleased to announce pg_duckdb is now generally available in Azure Database for PostgreSQL. The latest version builds on the preview with the latest DuckDB engine improvements and optimized performance. This version adds &lt;STRONG&gt;vectorized execution for faster analytical queries&lt;/STRONG&gt;, delivering significant improvements in aggregation performance, along with new support for &lt;STRONG&gt;writing to Azure Blob Storage&lt;/STRONG&gt; and &lt;STRONG&gt;querying Parquet data directly from PostgreSQL&lt;/STRONG&gt;. These capabilities enable high-performance analytics on your external data and simplify data processing workflows. Learn more: &lt;A href="https://learn.microsoft.com/azure/postgresql/extensions/concepts-extensions-versions#pg_duckdb" target="_blank" rel="noopener"&gt;pg_duckdb&lt;/A&gt;.&lt;/P&gt;
&lt;H4 id="ivm"&gt;pg_ivm Extension Generally Available&lt;/H4&gt;
&lt;P&gt;&lt;STRONG&gt;Materialized views&lt;/STRONG&gt; are a useful way to optimize performance for queries that run regularly, but if underlying data becomes stale the result set needs to be recomputed. With the &lt;STRONG&gt;pg_ivm&lt;/STRONG&gt; &lt;STRONG&gt;extension&lt;/STRONG&gt; you can automatically maintain materialized views as the underlying data changes. This is particularly &lt;STRONG&gt;valuable for large datasets with small incremental changes that need real-time freshness&lt;/STRONG&gt;, like dashboards, catalog analytics and SaaS usage reporting. We are pleased to announce the pg_ivm extension is now generally available in Azure Database for PostgreSQL. Learn more: &lt;A href="https://learn.microsoft.com/azure/postgresql/extensions/concepts-extensions-versions#pg_ivm" target="_blank" rel="noopener"&gt;pg_ivm&lt;/A&gt;.&lt;/P&gt;
&lt;H1&gt;Security, Auditing &amp;amp; Identity&lt;/H1&gt;
&lt;H4 id="assessments"&gt;Defender security assessments Preview&amp;nbsp;&lt;/H4&gt;
&lt;P&gt;&lt;STRONG&gt;Microsoft Defender Security Assessments for Azure Database for PostgreSQL&lt;/STRONG&gt; enables continuous evaluation of your database security posture, helping identify vulnerabilities and misconfigurations across server and database configurations. Previously limited to reactive threat detection, in the latest preview release, Defender now provides &lt;STRONG&gt;proactive, risk-based insights through assessments tailored to PostgreSQL-specific best practices&lt;/STRONG&gt;, delivering more relevant and actionable guidance. This helps you strengthen your security baseline, prioritize remediation, and align with best practices and compliance requirements. Learn more: &lt;A href="https://aka.ms/Defender-Assessments-for-PG-Preview" target="_blank" rel="noopener"&gt;https://aka.ms/Defender-Assessments-for-PG-Preview&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="tables"&gt;temporal_tables Extension Generally Available&lt;/H4&gt;
&lt;P&gt;We’ve had many customer requests to support the &lt;STRONG&gt;temporal_tables&lt;/STRONG&gt; extension, which provides&lt;STRONG&gt; built-in support for tracking and querying historical changes to data over time&lt;/STRONG&gt;. Temporal tables are now generally available in Azure Database for PostgreSQL. With this extension enabled you can easily perform time-based queries, audit data changes, and maintain historical records without building custom tracking logic, simplifying application development and compliance scenarios. Learn more: &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/extensions/concepts-extensions-versions#temporal_tables" target="_blank" rel="noopener"&gt;temporal_tables&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="cmk-support"&gt;Cross-tenant CMK Preview&lt;/H4&gt;
&lt;P&gt;Azure Database for &lt;STRONG&gt;PostgreSQL now supports cross-tenant customer-managed keys (CMK) in public preview&lt;/STRONG&gt;, allowing you to encrypt your data at rest using an Azure Key Vault key that resides in a separate Microsoft Entra tenant from the database service. This feature is designed for SaaS providers and enterprises that need to maintain strict separation of duties and ownership of encryption keys, enabling you to retain full control over key lifecycle management while PostgreSQL runs in a service provider’s tenant. Learn more: &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/security/security-data-encryption" target="_blank" rel="noopener"&gt;Data encryption at rest in Azure Database for PostgreSQL&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="token"&gt;Automatic Entra token refresh libraries Preview&lt;/H4&gt;
&lt;P&gt;We’re making it easier to use Entra ID authentication with Azure Database for PostgreSQL throughout the application stack by introducing&amp;nbsp;&lt;STRONG&gt;new token refresh libraries for .NET, JavaScript, and Python&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;With Entra ID, access tokens are short-lived which can make managing their lifecycle complex in real-world applications. Developers need to be aware of token refresh and build additional handling around token expiration, connection retry, and session continuity.&lt;/P&gt;
&lt;P&gt;These new libraries remove that friction. By handling Entra token refresh seamlessly in the background, they allow applications to stay connected without interruption and with no custom logic required. The result is a simpler development experience and more resilient applications, especially for long-running or connection-heavy workloads.&lt;/P&gt;
&lt;P&gt;Across languages, the libraries provide a consistent and streamlined way to adopt secure, passwordless authentication, helping teams focus more on building their applications and less on managing authentication. Learn more: &lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt;,&amp;nbsp;&lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;JavaScript&lt;/A&gt;, and&amp;nbsp;&lt;A href="https://pypi.org/project/azure-postgresql-auth/" target="_blank" rel="noopener"&gt;Python&lt;/A&gt;.&lt;/P&gt;
&lt;H1&gt;Operations, Maintenance &amp;amp; Monitoring&lt;/H1&gt;
&lt;H4 id="powershell"&gt;New Powershell module:&amp;nbsp; Az.PostgreSQLFlexibleServer Generally Available&lt;/H4&gt;
&lt;P&gt;We’re excited to introduce the newly renamed &lt;STRONG&gt;Az.PostgreSQLFlexibleServer PowerShell module&lt;/STRONG&gt;, delivering a streamlined experience for managing Azure Database for PostgreSQL with PowerShell. Building on the capabilities of the previous Az.PostgreSql module, the updated module aligns with the new features in the 2026-01-01 preview REST API. This module brings support for PostgreSQL 18, elastic clusters for scalable workloads and a range of enhancements designed to simplify management and improve performance. Whether you're provisioning new deployments or managing complex environments, this module ensures you can take full advantage of the latest platform capabilities directly from PowerShell.&lt;/P&gt;
&lt;P&gt;To learn more, visit our official documentation on PowerShell: &lt;A href="https://learn.microsoft.com/powershell/module/az.postgresql/?view=azps-15.6.0" target="_blank" rel="noopener"&gt;Az.PostgreSql Module | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="maintenance"&gt;More control over planned maintenance Generally Available&lt;STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We’ve seen many requests to provide more control when a maintenance update is applied to Azure Database for PostgreSQL. Sometimes when a critical workload is running you want to &lt;STRONG&gt;apply the maintenance when you’re ready&lt;/STRONG&gt;. &amp;nbsp;Announcing general availability this week, we’re building on the existing System and Custom maintenance window options and adding new self-service maintenance capabilities to the Azure portal.&lt;/P&gt;
&lt;P&gt;You can now &lt;STRONG&gt;reschedule upcoming maintenance updates for up to two weeks and apply maintenance on demand&lt;/STRONG&gt; at a time that suits you. You can also view scheduled maintenance and review your server’s maintenance history after updates are complete. &lt;BR /&gt;&lt;BR /&gt;These options help you better align maintenance with your business schedules, reduce disruption during critical workload periods, and minimize the need for support-driven deferral requests. CLI and API support are coming soon. Learn more: &lt;A href="https://aka.ms/azure-postgres-reschedule-maintenance" target="_blank" rel="noopener"&gt;https://aka.ms/azure-postgres-reschedule-maintenance&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="pvc"&gt;Pre-Upgrade validation checks Preview&lt;/H4&gt;
&lt;img&gt;PVC detects an event trigger blocker before upgrade execution and keeps the upgrade action disabled until issues are resolved.&lt;/img&gt;
&lt;P class="lia-align-justify lia-clear-both"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/configure-maintain/concepts-major-version-upgrade" target="_blank" rel="noopener"&gt;Major version upgrades&lt;/A&gt; are critical for staying current with PostgreSQL features, security updates, and performance improvements, but you often discover blockers only after starting the upgrade workflow. &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://review.learn.microsoft.com/en-us/azure/postgresql/configure-maintain/how-to-run-upgrade-validation-checks" target="_blank" rel="noopener"&gt;Pre-Upgrade Validation Checks&lt;/A&gt; lets you validate upgrade readiness before initiating the actual upgrade by running Azure-specific upgrade checks and PostgreSQL &lt;SPAN class="lia-text-color-13"&gt;pg_upgrade --check&lt;/SPAN&gt; validations independently&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;The shift is simple: you can identify and fix upgrade blockers before the upgrade window begins&lt;/STRONG&gt;. The feature surfaces actionable issues across configurations, extensions, dependencies, replication slots, event triggers, and other upgrade-sensitive objects. You can fix blockers, re-run validation until all checks pass, and proceed with the upgrade with greater predictability. &lt;BR /&gt;&lt;BR /&gt;Learn more: &lt;A href="https://aka.ms/pg-flex-upgrade-checks" target="_blank" rel="noopener"&gt;https://aka.ms/pg-flex-upgrade-checks&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="dashboard"&gt;New Built-in Grafana dashboards Generally Available&lt;/H4&gt;
&lt;img&gt;Monitor Azure PostgreSQL with built-in Grafana dashboards — no setup, no extra cost, and no separate service to manage.&lt;/img&gt;
&lt;P data-start="58" data-end="470"&gt;&lt;STRONG data-start="92" data-end="255"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/postgresql/monitor/how-to-use-dashboards-with-grafana" target="_blank" rel="noopener"&gt;Grafana dashboards&lt;/A&gt; are now built directly into the Azure portal for Azure Database for PostgreSQL - no setup, no extra cost, and no separate service to manage.&lt;/STRONG&gt; You can open your PostgreSQL resource in the portal and immediately access prebuilt dashboards for key health and performance signals such as CPU, memory, storage, IOPS, connections, transactions, and availability.&lt;/P&gt;
&lt;P data-start="472" data-end="787"&gt;&lt;STRONG data-start="472" data-end="521"&gt;The key value is &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/postgresql/monitor/concepts-monitoring" target="_blank" rel="noopener"&gt;metrics &lt;/A&gt;+ &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/postgresql/monitor/concepts-logging" target="_blank" rel="noopener"&gt;logs &lt;/A&gt;in one place.&lt;/STRONG&gt; You can quickly correlate performance spikes with PostgreSQL logs, understand what changed, and troubleshoot faster using the familiar Grafana experience. Dashboards can also be customized, saved to your subscription, and shared across teams for ongoing operations. &lt;BR /&gt;&lt;BR /&gt;Learn more:&amp;nbsp;&lt;A href="https://aka.ms/azure-postgres-dashboards-grafana" target="_blank" rel="noopener" data-start="801" data-end="849" data-is-last-node=""&gt;https://aka.ms/azure-postgres-dashboards-grafana&lt;/A&gt;&lt;/P&gt;
&lt;H1&gt;Resilience &amp;amp; Business Continuity&lt;/H1&gt;
&lt;H4 id="chaos"&gt;Chaos Studio supports Azure Database for PostgreSQL Preview&lt;/H4&gt;
&lt;P&gt;No matter how much you prepare, you only really know how good your database disaster recovery plan is when something breaks. With&amp;nbsp;&lt;STRONG&gt;Chaos Studio support for Azure Database for PostgreSQL,&lt;/STRONG&gt;&amp;nbsp;you can simulate zone-down scenarios on PostgreSQL HA-enabled instances and validate the resilience of your mission-critical workloads.&lt;/P&gt;
&lt;P&gt;With Chaos Studio integration, you can proactively test failover behavior and gain confidence in how your applications respond to real-world zonal failures.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This feature is currently available through a gated private preview. To get started, submit your subscription details using the&lt;A href="https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR_xNHyVnMH5NvQCAJk-wFYxUQzBGOEdUUDBUVFJVRVlETEJOQ1BZSUpIMi4u" target="_blank" rel="noopener"&gt; form&lt;/A&gt;. Once reviewed, our team will enable the feature for your subscription, with guidance to help you begin testing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Getting started is simple:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a Chaos Studio workspace via the &lt;A href="https://aka.ms/chaos-portal" target="_blank" rel="noopener"&gt;Chaos Studio portal&lt;/A&gt; and configure your subscription, resource group, and region.&lt;/LI&gt;
&lt;LI&gt;Define the scope and assign the required managed identity and permissions.&lt;/LI&gt;
&lt;LI&gt;Review and verify your workspace setup.&lt;/LI&gt;
&lt;LI&gt;Browse available scenarios and select the PostgreSQL zone-down scenario.&lt;/LI&gt;
&lt;LI&gt;Configure the test (name, duration), then run it from My Library to begin validating failover behavior.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;With just a few steps, you’ll be able to simulate real-world failure conditions and gain confidence in your application’s resilience.&lt;/P&gt;
&lt;P&gt;To get started, please submit your details using this link: &lt;A href="https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR_xNHyVnMH5NvQCAJk-wFYxUQzBGOEdUUDBUVFJVRVlETEJOQ1BZSUpIMi4u" target="_blank" rel="noopener"&gt;Private Preview Support for Chaos Studio&lt;/A&gt;&lt;/P&gt;
&lt;H1&gt;Migration &amp;amp; Modernization&lt;/H1&gt;
&lt;H4 id="ai-migration"&gt;AI-assisted Oracle to PostgreSQL migration Generally Available&lt;/H4&gt;
&lt;P&gt;AI-assisted migration tooling has dramatically lowered the bar for moving between different databases and is changing the way people look at the return on investment for migration. The VS Code PostgreSQL extension comes with AI-Assisted migration tooling which converts Oracle schema and application code to Azure Database for PostgreSQL. This tooling uses GitHub Copilot, Microsoft Foundry, and custom Language Model tools to convert Oracle schema, database code and client applications into the PostgreSQL equivalents, and validates every change against a running flexible server instance. Learn more: &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/oracle-schema-conversions/schema-conversions-overview" target="_blank" rel="noopener"&gt;Schema conversion&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/oracle-application-conversions/app-conversions-overview" target="_blank" rel="noopener"&gt;App conversion.&lt;/A&gt;&lt;/P&gt;
&lt;H4 id="migration-service"&gt;Migration Service for Azure Database for PostgreSQL improvements (EDB, AlloyDB) Generally Available&lt;/H4&gt;
&lt;P&gt;We’ve added AlloyDB and EDB Extended Server as new sources for migrating to PostgreSQL in the Azure Database for PostgreSQL Migration Service, with support for both online and offline migration support. Learn more: &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/migration-service/tutorial-migration-service-alloy-db-online?tabs=portal" target="_blank" rel="noopener"&gt;Migrate from AlloyDB&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/azure/postgresql/migrate/migration-service/tutorial-migration-service-enterprise-db-extended-server-online?tabs=portal" target="_blank" rel="noopener"&gt;Migrate from EDB&lt;/A&gt;.&lt;/P&gt;
&lt;H1&gt;Looking ahead&lt;/H1&gt;
&lt;P&gt;That wraps up the Build 2026 announcements for Azure Database for PostgreSQL flexible server. There are also many great PostgreSQL technical sessions at Build this week, covering cloud-native app and AI development. To find out more, here's a link to the Build session catalog for PostgreSQL sessions: &lt;A href="https://aka.ms/Postgres-on-Azure_Build-2026" target="_blank" rel="noopener"&gt;https://aka.ms/Postgres-on-Azure_Build-2026.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;We'll continue to build out our roadmap over the coming months to deliver on your asks to improve the performance, security and stability of your PostgreSQL workloads. Check the&amp;nbsp;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/category/azuredatabases/blog/adforpostgresql" target="_blank" rel="noopener" data-lia-auto-title="Microsoft Blog for PostgreSQL" data-lia-auto-title-active="0"&gt;Microsoft Blog for PostgreSQL&lt;/A&gt; for a regular monthly recap where we share the latest enhancements and product updates.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Jun 2026 19:13:35 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/announcing-new-security-maintenance-and-analytics-features-for/ba-p/4524559</guid>
      <dc:creator>GuyBowerman</dc:creator>
      <dc:date>2026-06-02T19:13:35Z</dc:date>
    </item>
    <item>
      <title>Azure HorizonDB: Enterprise-Ready Postgres, Engineered for the AI Era</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/azure-horizondb-enterprise-ready-postgres-engineered-for-the-ai/ba-p/4524094</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Affan Dar&lt;/STRONG&gt;, Vice President of Engineering, PostgreSQL at Microsoft&lt;BR /&gt;&lt;STRONG&gt;Charles Feddersen&lt;/STRONG&gt;, Partner Director of Program Management, PostgreSQL at Microsoft&lt;/P&gt;
&lt;P&gt;Today at Microsoft Build, we’re pleased to announce the public preview of&amp;nbsp;&lt;A href="https://aka.ms/AzureHorizonDB" target="_blank" rel="noopener"&gt;Azure HorizonDB&lt;/A&gt;, a new enterprise-ready Postgres-compatible database service designed to meet the needs of modern AI applications, alongside a set of enhancements to our PostgreSQL tooling in Visual Studio Code to further streamline the developer experience.&lt;/P&gt;
&lt;P&gt;Postgres is rapidly solidifying its role as a foundational layer in modern data architectures, with accelerating adoption across industries. For developers, it has become the preferred platform for new application development, driven by its extensible architecture, mature extension ecosystem, and adherence to open standards and APIs. At the same time, enterprises are choosing Postgres to re-platform and modernize existing systems, taking advantage of its ability to support a broad range of operational workloads while enabling advanced capabilities such as vector-based data access all within a single, interoperable platform.&lt;/P&gt;
&lt;H4&gt;A Postgres Platform Grounded in Security, Resilience, Scale, and Performance&lt;/H4&gt;
&lt;P&gt;Azure HorizonDB is purpose-built to meet these demands, combining the flexibility developers expect from Postgres with the operational rigor enterprises require. It extends the core Postgres engine with cloud-native capabilities such as integrated identity, fine-grained network and security controls, and seamless lifecycle management, while preserving full compatibility with the open ecosystem of extensions and tools. At the same time, HorizonDB introduces advanced, natively integrated capabilities like vector data support and AI model management, enabling new classes of intelligent applications without sacrificing transactional integrity or developer productivity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;These capabilities are backed by a platform designed for enterprise performance and scale. HorizonDB supports databases up to 128 TB, scales out with up to 15 read replicas for high-throughput workloads, and delivers sub-millisecond commit latency across availability zones for low-latency transactions and high availability. This combination is critical for modern applications that require consistent performance under load, including high-concurrency transactional systems, real-time AI-driven interactions, and globally distributed services.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;The result is a unified platform that scales from the first line of code to globally distributed, mission-critical systems. Enterprise adoption ultimately depends on trust in the platform itself. Azure HorizonDB delivers this with native integration into Microsoft Entra ID for centralized identity and access control, private endpoints for network isolation, and built-in encryption to protect data at rest and in transit. These capabilities are essential for meeting compliance requirements and enabling organizations to run mission-critical workloads with confidence, without added complexity.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;This foundation is critical for any application, but it becomes indispensable for AI, where secure access to data and controlled model interaction underpin every intelligent experience. Building on this, HorizonDB introduces a set of integrated AI capabilities designed to bring intelligence directly into the database.&lt;/P&gt;
&lt;H4&gt;Run Fast, Memory-Efficient Vector Search with DiskANN&lt;/H4&gt;
&lt;P&gt;HorizonDB brings high-performance vector search directly into Postgres through DiskANN with spherical quantization. This enables efficient, low-latency similarity search at scale while significantly reducing memory and storage overhead. Spherical quantization works by normalizing vectors and encoding them into compact representations that preserve angular distance, allowing the system to compare vectors efficiently with minimal loss in accuracy. The result is the ability to index and query large embedding datasets within the transactional engine itself, making vector search a first-class capability rather than an external dependency.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;"HorizonDB is compelling because it brings a PostgreSQL-compatible foundation, AI-native capabilities and enterprise-grade controls closer to the operational data layer." &lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;EM&gt;Jennings Balavari, Founder, Opsen AI&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;Build Smarter Apps with Hybrid Search in Postgres&lt;/H4&gt;
&lt;P&gt;HorizonDB supports hybrid search by combining vector similarity through pgvector with full-text search enabled via the pg_textsearch extension, allowing applications to match both semantic meaning and precise keyword relevance in a single query. This enables more accurate, context-aware results, such as blending intent-driven retrieval with exact term matching for search, recommendations, or RAG scenarios. By unifying these capabilities within Postgres, HorizonDB improves result quality while simplifying application design without the need for external search systems.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;Operationalize AI with Built-In AI Model Management&lt;/H4&gt;
&lt;P&gt;Working with vectors requires models to generate, interpret, and evolve embeddings, making model lifecycle a core part of the application stack. HorizonDB introduces integrated AI model management to simplify how models are registered, versioned, and governed alongside data, including built-in support for generative GPT models and ranking models. For example, GPT models can be used to generate summaries, responses, or structured outputs directly from application data, while ranking models enable relevance scoring for search results or recommendations over vector results. By managing these models alongside the data they operate on, HorizonDB ensures consistency, traceability, and control, creating a unified environment where models and data evolve together.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;“As we build a multi-tenant, AI-driven commerce platform, HorizonDB has been particularly compelling in two areas: scale and how close AI capabilities are to the data itself. Running vector search, filtering, and model-driven workflows directly inside the database removes a lot of the complexity we’d normally manage across separate services."&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;EM&gt;James Frawley, CIAO, ReFiBuy&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;H4&gt;Bring AI into SQL with AI Functions&lt;/H4&gt;
&lt;P&gt;With models managed in place, AI Functions provide a direct way to invoke them from within SQL and application logic. These functions are implemented through the azure_ai extension, which brings model invocation directly into the Postgres engine. This allows developers to embed inference into queries and transactions, eliminating the need for external orchestration. By bringing model execution closer to the data, AI Functions reduce latency, simplify application design, and make intelligent behavior a natural extension of existing Postgres workloads.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;"What stood out with HorizonDB is that it aligns closely with how we already think about the problem. Instead of stitching together multiple components, it brings transactional data, vector search, and AI capabilities into a single platform, which simplifies the architecture without forcing a complete rethink." &lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;EM&gt;Mohsin Shafqat, Director Software Engineering, Nasdaq&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;Run Reliable, Event-Driven Workflows with AI Pipelines&lt;/H4&gt;
&lt;P&gt;Finally, AI Pipelines operationalize these capabilities through reliable, event-driven workflows for model execution and data processing. Pipelines execute on data changes, enabling real-time asynchronous reactions without external orchestration and ensuring consistent, repeatable behavior as data evolves. Combined with model management and AI Functions, they turn embedded intelligence into something that can be run, scaled, and trusted in production, while inheriting the database’s high availability and failover characteristics for resilience. Pipelines can also be visualized and observed in real time through the Visual Studio Code extension for PostgreSQL, giving developers and operators immediate visibility into execution flow, state, and outcomes&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;Modern Unified Experience for Data, AI, and Operations in VS Code&lt;/H4&gt;
&lt;P&gt;As intelligence becomes a core part of the data platform, the developer and operator experience becomes equally critical. HorizonDB extends seamlessly into Visual Studio Code with enhanced PostgreSQL tooling that works across any Postgres deployment, not just HorizonDB. Features like AI-assisted query plans and integrated monitoring enable faster debugging and optimization, helping teams understand both database performance and AI-driven behaviors.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;At the same time, for Azure-based deployments, the experience is deeply integrated with platform capabilities, enabling management of networking configuration, server parameters, and server logs directly from the development environment, streamlining operations across application and infrastructure layers.&lt;/P&gt;
&lt;P&gt;Azure HorizonDB brings together enterprise-grade security, deep Postgres compatibility, and a modern AI-native data platform, all engineered for developers. It scales efficiently across workloads, from transactional systems to intelligent applications, while delivering a world-class, Azure-integrated experience in Visual Studio Code for both developers and operators.&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Ready to get started with Azure HorizonDB?&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Azure HorizonDB is now available in public preview in Australia East, Central US, Sweden Central, West US 2, and West US 3 regions. Additionally, East US, Canada Central, Indonesia Central, Italy North, Japan East, Korea Central, and Poland Central will be available in the coming weeks.&lt;/P&gt;
&lt;P&gt;You can get started today by creating a new HorizonDB instance using the Azure portal, API’s, or the Visual Studio Code extension for PostgreSQL to begin exploring these capabilities firsthand.&lt;/P&gt;
&lt;P&gt;To learn more, dive deeper into our &lt;A href="https://aka.ms/HorizonDB-documentation" target="_blank" rel="noopener"&gt;documentation&lt;/A&gt; and &lt;A href="https://aka.ms/horizondb-aimm-preview" target="_blank" rel="noopener"&gt;sign-up today&lt;/A&gt; to try AI model management in a limited preview.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Jun 2026 16:45:15 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/azure-horizondb-enterprise-ready-postgres-engineered-for-the-ai/ba-p/4524094</guid>
      <dc:creator>charlesfeddersenMS</dc:creator>
      <dc:date>2026-06-02T16:45:15Z</dc:date>
    </item>
    <item>
      <title>Your PostgreSQL workflow just found its new home in Cursor</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/your-postgresql-workflow-just-found-its-new-home-in-cursor/ba-p/4524081</link>
      <description>&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;TL; DR:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Our Visual Studio Code extension for PostgreSQL is now available on the Open&lt;/SPAN&gt; &lt;SPAN data-contrast="auto"&gt;VSX registry: Cursor users get first-class database tooling without leaving the editor that already understands their code.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;The context switch problem&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you use Cursor, you know the feeling. You’re deep in an agentic flow. Composer is scaffolding a feature across multiple files. Tab is anticipating your next move. Then you need to check a table's schema or run a quick query, so you switch to a different tool, and then you lose your flow state, and spend 30 seconds remembering which connection goes to which environment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That context switch is expensive. Not in minutes, but in momentum.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Why we built for Cursor (and &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Open&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;VSX&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Cursor is built on the VS Code ecosystem, which means it supports VS Code extensions natively. It uses the Open&lt;/SPAN&gt; &lt;SPAN data-contrast="auto"&gt;VSX registry: an open, vendor-neutral extension marketplace where database tooling options have been limited.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;We saw an opportunity: bring a modern PostgreSQL extension directly to where developers do their most productive work. By publishing to Open&lt;/SPAN&gt; &lt;SPAN data-contrast="auto"&gt;VSX, we make sure that developers across the entire VS Code-compatible ecosystem, including Cursor, Windsurf, AWS Kiro, Theia, and Ona all have access without workarounds.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Where AI-powered editing meets database awareness&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here’s what gets interesting. Cursor indexes your entire codebase semantically. It knows your Drizzle schemas, your raw SQL files, and your migration directories. Our extension completes the picture by giving the editor a live connection to the actual database.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here’s where they intersect:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Schema explorer in your sidebar&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; browse tables, columns, indexes, and functions without leaving the editor. When Cursor’s agent asks “what columns does the users table have?”, the answer is already visible.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Screenshot: Object Explorer sidebar showing tables, columns, and indexes expanded&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559738&amp;quot;:36,&amp;quot;335559739&amp;quot;:36}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Connection-aware IntelliSense&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; autocomplete table names, column names, and functions based on your live database schema. This pairs naturally with Cursor’s Tab completions: the AI writes the application logic, and IntelliSense validates the SQL.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Inline EXPLAIN diagnostics&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; catch performance issues before they ship. Write a query and see whether it uses an index or triggers a sequential scan, all without running a separate tool.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Zero-config connection discovery&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; we detect &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.env&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; files, &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;docker-compose.yml&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and ORM connection strings in your project. Your database connection follows your workspace, not a global settings file buried three menus deep.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Result export and inline execution&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; select SQL, run it, and see results in a clean panel. Export to JSON or CSV when you need to share findings with your team.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Features that make Cursor + PostgreSQL even better&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Beyond the basics, the extension includes capabilities that pair especially well with AI-powered workflows:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;MCP server for AI assistants&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; the extension registers a Model Context Protocol (MCP) server, so Cursor’s agent can discover and interact with your PostgreSQL databases directly through a standardized tool interface. Ask your AI assistant to inspect a table, run a diagnostic query, or analyze a plan: it has the tools to do it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Agent Mode database tools&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; dedicated DBAgent MCP tools give AI assistants richer database-analysis capabilities, from schema introspection to performance diagnostics and instruction management.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Query plan visualization&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; explore &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;EXPLAIN&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; output in four synchronized views: an interactive node graph, icicle chart, sortable table, and raw source. Color-coded severity groups expose bottlenecks at a glance, and AI-assisted analysis provides optimization suggestions.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Performance dashboard&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; investigate database performance with DB load charts, query activity, wait-event analysis, session health, and blocking chains. Use natural language to inspect trends, identify bottlenecks, and generate diagnostic SQL.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Object Explorer search&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; find database objects by name without expanding the tree. Search across connections, databases, and schemas. Filter by object type or schema name and navigate directly to any result.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Schema-aware “New Query”&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; right-click a schema in Object Explorer to open a new query with the appropriate &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;search_path&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; already set. No more manual &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SET search_path&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; before writing queries.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Multi-source connection profiles&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; save connection profiles to your user settings, workspace, or folder. Check workspace profiles into source control so every team member gets the right database connections when they open the project.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;SSH tunneling built in&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; connect to databases on private networks through SSH tunnels configured directly in the connection dialog, with ssh-agent support for private key authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Built for how you &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;actually work&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Modern development means ephemeral environments, branch-specific databases, and containers everywhere. The extension is designed around this reality:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Automatic detection of PostgreSQL instances running in Docker&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Project-scoped connections that travel with your workspace&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Support for standard PostgreSQL connections&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Integration with both local and cloud versions of PostgreSQL from multiple vendors, and first-class support for Azure Database for PostgreSQL and Azure HorizonDB, with provisioning, backup management, and network configuration: all without leaving the editor.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;·&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Status bar indicator showing your active database at a glance&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559991&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Get started&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Install from the &lt;/SPAN&gt;&lt;A class="lia-external-url" href="https://open-vsx.org/extension/microsoft/cursor-pgsql" target="_blank" rel="noopener"&gt;Open VSX Registry&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;: search for it in Cursor’s extension panel or install the &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.vsix&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; directly. Your existing VS Code workflow carries over unchanged.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you’re already using Cursor for its agentic capabilities, adding database awareness to the editor means fewer tabs, fewer context switches, and a tighter feedback loop between your application code and the data layer underneath it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Available now on &lt;/SPAN&gt;&lt;A class="lia-external-url" href="https://open-vsx.org/" target="_blank" rel="noopener"&gt;Open VSX&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;. Works with Cursor, Antigravity, and all the VS Code compatible editors.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;335559738&amp;quot;:180,&amp;quot;335559739&amp;quot;:180}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 04 Jun 2026 18:59:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/your-postgresql-workflow-just-found-its-new-home-in-cursor/ba-p/4524081</guid>
      <dc:creator>iemejia</dc:creator>
      <dc:date>2026-06-04T18:59:42Z</dc:date>
    </item>
    <item>
      <title>PostgreSQL Meets AI at POSETTE: An Event for Postgres 2026 (T-3 weeks)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/postgresql-meets-ai-at-posette-an-event-for-postgres-2026-t-3/ba-p/4523958</link>
      <description>&lt;P&gt;&lt;A href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;POSETTE: An Event for Postgres 2026&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="none"&gt; is where that evolution comes into focus, please visit conference’s site to register and add the event to your calendar!&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Artificial intelligence is changing how we build applications, but not in the way many people expected. The hardest problems aren’t about writing the perfect prompt or choosing the “best” model. Once teams move past demos and start putting systems in front of real users, the pain shows up somewhere else: in the data layer.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The recurring failure modes of production AI are remarkably consistent. Systems return answers that sound plausible but aren’t grounded. They pull the wrong records, miss key context, or stitch together fragments from unrelated sources. Sometimes they are correct, but wildly expensive. And when you let an AI system generate queries dynamically, the operational questions get sharper very quickly: what stops it from issuing a destructive statement, scanning a massive table, or repeatedly hammering a hot index until your p95 latency falls off a cliff?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In other words, the hard part is not generation. The hard part is &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retrieval&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, how data is accessed, shaped, governed, and observed. That’s exactly why the AI track at &lt;/SPAN&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event for Postgres 2026&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; is so compelling this year: it treats PostgreSQL not as a passive database at the end of a request, but as an active foundation for the next wave of AI, native applications.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What’s emerging across the agenda is a new mental model. PostgreSQL, long trusted as a durable, transactional system, has become the place where “truth” lives for many applications. And as AI agents become the interface to those applications, Postgres increasingly becomes the retrieval backbone that keeps those agents honest.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;From queries to agents: when the database becomes a tool&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In traditional application design, we assume a deterministic relationship between intent and query. The application decides what it needs, SQL expresses it precisely, and the database returns a predictable result set. We tune the query, we add an index, we cache the hot path, and we move on.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Agentic systems break that contract.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;An agent doesn’t just execute a query. It interprets intent, decides what tools to use, and often iterates, sometimes several times, based on intermediate results. That “tool use” framing is central to &lt;/SPAN&gt;&lt;A href="https://posetteconf.com/2026/talks/an-mcp-for-your-postgres-db/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Pamela Fox’s session An MCP for your Postgres DB&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;, which explores how MCP (Model Context Protocol) turns a database into an explicit, discoverable interface, one where design choices directly influence whether an LLM behaves safely and predictably when it interacts with Postgres.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In parallel, &lt;/SPAN&gt;&lt;A href="https://posetteconf.com/2026/talks/from-queries-to-agents-the-next-era-of-data-retrieval-on-postgresql/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;A&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;be Omorogbe’s From Queries to Agents: The Next Era of Data Retrieval on PostgreSQL&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; frames the evolution in a way that resonates with anyone building production systems: as agents move from demos to reality, the challenge isn’t the model, it’s “reliable, safe, and context, aware data retrieval.” In practice, that means dealing with failures that don’t show up in toy examples: agents producing SQL that’s syntactically valid but semantically wrong; pulling the right table but the wrong slice; or forming queries that quietly explode costs because there’s no natural “stop” condition.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Once you accept that agents are going to query your system in ways you didn’t anticipate, PostgreSQL becomes part of your application’s safety boundary. It must handle unpredictable access patterns without falling over. It must protect you from unsafe operations, whether accidental or adversarial. And increasingly, it must support multi, modal retrieval, because the context an agent needs rarely lives in a single shape of data.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That’s the pivot &lt;/SPAN&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event For Postgres 2026&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; is capturing: the database is no longer just queried, it is increasingly &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;negotiated with&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; by AI systems.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;RAG in practice: why PostgreSQL keeps showing up&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Retrieval, Augmented Generation (RAG) has become the default architecture for serious AI applications. It’s a pragmatic response to a simple reality: models are good at language, but they aren’t systems of record. If you care about accuracy, freshness, or traceability, you retrieve relevant information first, then generate a response grounded in that retrieved context.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The interesting question isn’t “does RAG work?”, it does. The interesting question is where teams choose to implement it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;A growing number of teams are using PostgreSQL as the core retrieval substrate for RAG pipelines because it lets them keep the system cohesive. You can store structured records, join across metadata, filter and rank, and now, thanks to the ecosystem, incorporate vector similarity search without standing up a separate database whose contents need to be continuously synchronized.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That’s the practical framing behind &lt;/SPAN&gt;&lt;A href="https://posetteconf.com/2026/talks/production-rag-at-scale-with-azure-database-for-postgresql/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Julia Schröder Langhaeuser and Paula Santamaría’s session Production RAG at Scale with Azure Database for PostgreSQL&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;. Their talk centers on what it takes to go from prototype to production, including architecture choices, performance tuning, and the operational discipline required when you’re serving RAG workloads at meaningful scale. The message is less “Postgres can do vectors” and more “RAG becomes real when you can observe it, tune it, and trust it.”&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This distinction matters, because the failure modes of RAG systems are rarely about embeddings. They are about &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;context assembly&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. The best answer in the world is useless if the system retrieved the wrong snippets, missed an important constraint, or pulled stale policy text from last quarter.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;PostgreSQL’s value here is subtle but powerful: it gives you a place to combine retrieval signals, structured filters, semantic similarity, graph, like relationships, business rules, inside a system whose behavior you can reason about.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;The real problem is retrieval, not generation&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you spend time around production AI teams, you start to hear the same phrase: retrieval is the hard part.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Models can generate fluent text easily. But without high, quality input, and without guardrails around what the system is allowed to do, they generate confident nonsense, partial answers, and occasionally harmful advice. In the worst cases, they can become operational liabilities: issuing expensive queries repeatedly, pulling sensitive data into prompts, or creating “self, inflicted incidents” that look like outages but are really uncontrolled tool usage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That’s why POSETTE’s AI programming doesn’t just celebrate capability. It spends real time on safety and operational control.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Building safety tooling for risk, free AI tuning of Postgres: &lt;/SPAN&gt;&lt;A href="https://posetteconf.com/2026/talks/building-safety-tooling-for-risk-free-ai-tuning-of-postgres-fast-cars-need-fast-brakes/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Fast cars need fast &lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;brakes&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt; by Mohsin Ejaz captures this mindset perfectly&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;. The title says what many teams learn too late: if you’re going to let an automated system tune or optimize database behavior, the safety net matters more than the accelerator. Guardrails, validation, monitoring, and rollback discipline aren’t “nice to have”, they’re the difference between a neat demo and a system you can run while you sleep.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;When you connect that back to the agent conversation, you get a coherent picture. Whether the system is generating queries, selecting tools, or attempting optimizations, the foundation of reliability is the same: controlled access, predictable performance, and strong observability.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;PostgreSQL contributes here not because it’s magical, but because it’s mature. It has deep access control primitives, transactional guarantees, and an ecosystem that has spent decades building operational muscle. The AI shift doesn’t eliminate those fundamentals, it makes them more important.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;The emerging retrieval stack: what sits between agents and data&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;One of the most useful ways to interpret this year’s sessions is as the early shape of a new architectural layer: a &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retrieval stack&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; that lives between AI agents and your data systems.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This stack is not a single product. It’s a set of practices and components that make agent, to, data interactions safe and effective. It includes abstraction layers (like MCP, style tool interfaces), orchestration logic that can combine relational queries with vector similarity (and, increasingly, graph, aware traversal), context shaping that ranks and filters results into something a model can actually use, and governance controls that define what data may be accessed in which situations.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What’s exciting about POSETTE: An Event For Postgres 2026 is that the agenda treats this as a real engineering problem, not a buzzword. Pamela Fox’s work on MCP surfaces the interface, design angle: when you expose Postgres as tools, the shape of those tools determines whether the agent behaves well. Abe Omorogbe’s framing pushes toward retrieval architectures that are robust by design rather than bespoke glue code. Julia Schröder Langhaeuser and Paula Santamaría bring the production perspective: what breaks at scale, and what you need to monitor. And Mohsin Ejaz anchors the safety story: the more automation you introduce, the more you need reliable brakes. &lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That same story now extends all the way to the developer experience. In &lt;/SPAN&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-tooling-across-ai-editors-and-agents/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Matt McFarland’s &lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;session&lt;/SPAN&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt; PostgreSQL Tooling Across AI Editors and Agents&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;, the&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; focus shifts from retrieval architecture inside applications to the environments where developers and AI assistants actually work. By showing how PostgreSQL capabilities such as connection management, query execution, schema analysis, plan inspection, and performance insights can be surfaced consistently across VS Code, Cursor, and the GitHub Copilot CLI through an MCP server, the session adds an important dimension to the overall AI track: if agents are going to become part of everyday software development, PostgreSQL tooling also needs to become agent-aware, portable, and usable wherever those workflows happen. It’s a practical reminder that the AI future of Postgres is not only about what runs in production, but also about how humans and AI systems collaborate around the database during development itself.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Together, these sessions sketch a coherent future: PostgreSQL isn’t just where data sits. It’s becoming one of the engines that powers retrieval, first application design.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;Why this matters if you build real systems&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you’re building applications today, this shift is not theoretical. It changes how you think about database design, performance tuning, security, and cost.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;You can’t assume query predictability anymore, because agents don’t behave like carefully written application code. You can’t treat access control as a static checklist, because prompts are leaky abstractions and tool use creates new attack surfaces. And you can’t ignore cost modeling, because AI, generated queries can be expensive in ways that traditional workloads rarely are, especially when they iterate.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event For Postgres 2026&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; tackles these realities head, on. Not with hype, but with practical patterns, real failure modes, and the kind of engineering trade, offs you only learn when systems meet production constraints.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;What &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;you’ll&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt; take away from the AI track at &lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;POSETTE: An Event for Postgres this year&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If there’s a single theme to keep in mind, it’s this: AI isn’t replacing databases. It’s forcing us to use them differently.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The AI sessions at &lt;/SPAN&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event For Postgres 2026&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt; will help you build a clearer mental model of how agents interact with PostgreSQL, how RAG systems become production, ready, and what it means to design retrieval layers with safety and observability from day one. And, importantly, you’ll leave with a vocabulary for discussing these systems without hand, waving: where the risk is, where the cost is, and where the true engineering work lives.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559685&amp;quot;:0,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;PostgreSQL’s flexibility and extensibility make it a natural foundation for this transition, but the real advantage will go to teams that treat retrieval as an engineering discipline, not an afterthought.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;At POSETTE, that transformation is on full display.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 1"&gt;A quick call to action&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:360,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;A href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;POSETTE: An Event for Postgres 2026&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="none"&gt; is a can’t, miss event for the PostgreSQL community. Register to get updates and save the livestream sessions you want to attend on your calendar.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 29 May 2026 17:24:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/postgresql-meets-ai-at-posette-an-event-for-postgres-2026-t-3/ba-p/4523958</guid>
      <dc:creator>scoriani</dc:creator>
      <dc:date>2026-05-29T17:24:40Z</dc:date>
    </item>
    <item>
      <title>Introducing PostgreSQL Hub for Azure Developers</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/introducing-postgresql-hub-for-azure-developers/ba-p/4522897</link>
      <description>&lt;P&gt;When you're building applications with PostgreSQL, finding the right resources can be harder than it should be. Documentation lives in one place, samples in another, tutorials scattered across blogs, and community discussions fragmented across forums. You end up with multiple browser tabs open just to piece together a working architecture for your project. Whether you're just getting started or you've been building for years, if all you want is a faster path from "I have an idea" to "this is running in production", then &lt;A class="lia-external-url" href="https://aka.ms/postgres-hub" target="_blank" rel="noopener"&gt;PostgreSQL Hub for Azure Developers&lt;/A&gt; is for you.&lt;/P&gt;
&lt;P&gt;It brings everything together in one place. But it's more than just a content aggregator. Here's what makes it different:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Curated resources to help you build.&lt;/STRONG&gt; From sample apps and solution accelerators to tutorials, videos, workshops, and relevant documentation, you'll find what you need to build core applications, AI-powered solutions, and multi-agent architectures on PostgreSQL. Resources are maintained and updated as new capabilities ship.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Structured learning pathways.&lt;/STRONG&gt; Instead of navigating documentation on your own, you get guided paths that take you from fundamentals through intermediate patterns to advanced AI scenarios like vector search, AI functions, and building agents. The pathways are designed to help you develop a solid understanding at every stage.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Community space.&lt;/STRONG&gt; Beyond content, the hub also includes a &lt;A class="lia-external-url" href="https://aka.ms/postgres-hub-developer-forum" target="_blank" rel="noopener"&gt;Developer Forum powered by GitHub Discussions&lt;/A&gt; where you can share product feedback, learn from fellow developers, and collaborate directly with Microsoft engineers on your use cases. Whether you want to discuss an architecture decision, share what you've built, or contribute a sample, the forum is the place for it. Real-time chat for quick questions and webinars is coming soon.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Who is this for?&lt;/H3&gt;
&lt;P&gt;No matter what stage you're at in building with PostgreSQL on Azure, there's something here for you. The hub is especially relevant if you are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;An &lt;STRONG&gt;application developer&lt;/STRONG&gt; looking for curated resources, end-to-end guidance, and patterns to build or scale your projects on PostgreSQL&lt;/LI&gt;
&lt;LI&gt;An &lt;STRONG&gt;AI builder&lt;/STRONG&gt; exploring use cases like vector search, embeddings, AI functions, or agent architectures&lt;/LI&gt;
&lt;LI&gt;A &lt;STRONG&gt;new learner&lt;/STRONG&gt; looking for a clear starting point with structured content to guide you&lt;/LI&gt;
&lt;LI&gt;An &lt;STRONG&gt;enterprise user with existing workloads on Azure&lt;/STRONG&gt; looking to understand the full breadth of intelligent application development capabilities available with PostgreSQL&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The sample apps, patterns, and learning content are valuable irrespective of whether you're already building on PostgreSQL or just exploring what's possible.&lt;/P&gt;
&lt;H3&gt;Get Started&lt;/H3&gt;
&lt;P&gt;The surface area of what you can build with PostgreSQL has expanded significantly, and finding the right resource at the right time shouldn't slow you down. That's exactly what this hub is here to solve.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here's a quick walkthrough of the Postgres Hub:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Head over to &lt;A class="lia-external-url" href="https://aka.ms/postgres-hub" target="_blank" rel="noopener"&gt;aka.ms/postgres-hub&lt;/A&gt; to explore further! Browse the sample apps, pick a learning pathway that matches where you are, or join the community discussions to connect with other developers and Microsoft engineers.&lt;/P&gt;
&lt;P&gt;We're actively growing this hub based on what the community needs. Your feedback, your questions, and your contributions will shape what comes next.&lt;/P&gt;</description>
      <pubDate>Wed, 27 May 2026 16:33:28 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/introducing-postgresql-hub-for-azure-developers/ba-p/4522897</guid>
      <dc:creator>ShreyaAithal</dc:creator>
      <dc:date>2026-05-27T16:33:28Z</dc:date>
    </item>
    <item>
      <title>Demystifying LWLock: MultiXact SLRU Wait Events in Azure Database for PostgreSQL</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/demystifying-lwlock-multixact-slru-wait-events-in-azure-database/ba-p/4518504</link>
      <description>&lt;H2&gt;&lt;STRONG&gt;What Is the MultiXact Subsystem?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Before diving into the wait events, it helps to understand what PostgreSQL is protecting. When a single transaction modifies a row, PostgreSQL stores that transaction's ID (&lt;STRONG&gt;XID&lt;/STRONG&gt;) directly in the row header's &lt;STRONG&gt;xmax&lt;/STRONG&gt; field. Simple and fast. But what happens when two or more transactions need to hold locks on the same row simultaneously? For example:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Two sessions run SELECT ... FOR KEY SHARE on the same row, OR&lt;/LI&gt;
&lt;LI&gt;A SELECT ... FOR UPDATE session encounters a row already locked by a foreign key check (FOR KEY SHARE), OR&lt;/LI&gt;
&lt;LI&gt;Multiple sub-transactions created by SAVEPOINT all reference the same row&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In these cases, PostgreSQL cannot store two XIDs in a single xmax field. Instead, it creates a MultiXact ID (&lt;STRONG&gt;MXID&lt;/STRONG&gt;) — a composite identifier that points to a list of all involved transaction IDs. These mappings are stored in two on-disk structures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;pg_multixact/offsets/ — maps each MXID to its position in the member's file&lt;/LI&gt;
&lt;LI&gt;pg_multixact/members/ — stores the actual list of member XIDs&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;To avoid reading these files from disk on every row visibility check, PostgreSQL caches them in memory using a &lt;STRONG&gt;SLRU &lt;/STRONG&gt;(Simple Least Recently Used) cache — a small, fixed-size ring buffer with just 8 buffer slots by default (64 KB) for offsets and 16 slots (128 KB) for members.&lt;/P&gt;
&lt;P&gt;Each of those buffer slots is protected by an &lt;STRONG&gt;LWLock &lt;/STRONG&gt;(Lightweight Lock). And that LWLock is exactly where the bottleneck hides.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;The Core Insight: &lt;BR /&gt;&lt;/STRONG&gt;Cache Hits and Lock Contention are &lt;STRONG&gt;not mutually exclusive&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;This is the most important concept in this entire post:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;pg_stat_slru&lt;/STRONG&gt; measures I/O misses. &lt;STRONG&gt;pg_stat_activity&lt;/STRONG&gt; wait events measure lock contention.&lt;/P&gt;
&lt;P&gt;Here is what actually happens at the microsecond level:&lt;/P&gt;
&lt;P&gt;Session A: Needs MXID 5,000,023 → Page is in SLRU cache (blks_hit++) → LWLock is needed on buffer slot 3 → Session B already holds that LWLock → Session A WAITS → wait_event = 'MultiXactOffsetSLRU' recorded&lt;/P&gt;
&lt;P&gt;The cache is warm, the page is in memory, but what happens when 50 concurrent sessions suddenly all need that same buffer slot's &lt;STRONG&gt;LWLock?&amp;nbsp; &lt;/STRONG&gt;Only one request can hold the LWLock at a time. Every session that queues behind the lock holder generates a wait event record, all while no disk I/O is occurring.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;What Triggers MultiXact SLRU Wait Events?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Below are the scenario's which could trigger MultiXact SLRU Wait Events.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Thundering Herd — Mass Concurrent Row Locking&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;When dozens or hundreds of sessions simultaneously attempt to lock the same small set of rows, PostgreSQL must create and resolve MXIDs at high frequency. Each resolution requires an SLRU lookup. When all lookups target the same few SLRU pages, the buffer lock becomes a serialization point. A classic reconnect avalanche triggered when the connection pool detected server slowness and all clients retried simultaneously.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Foreign Key FOR KEY SHARE vs. FOR UPDATE Conflicts&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;This is one of the most common hidden triggers. Every time a child row is inserted or updated, PostgreSQL implicitly acquires FOR KEY SHARE on the referenced parent row to prevent the parent from being deleted. If another session simultaneously holds FOR UPDATE on that same parent row, PostgreSQL &lt;STRONG&gt;must combine both lock modes into a new MXID&lt;/STRONG&gt;:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Session A (updater): 
SELECT * FROM orders WHERE id = 1 FOR UPDATE; 

-- Session B (child inserter — FK check): 
INSERT INTO order_items (order_id, amount) VALUES (1, 99.00); 

-- Implicitly: 
SELECT * FROM orders WHERE id = 1 FOR KEY SHARE; 

-- PostgreSQL creates MXID combining both transactions → SLRU write&lt;/LI-CODE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;SAVEPOINT and Sub-transaction Churn&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Every SAVEPOINT creates a sub-transaction XID. ORM frameworks and JDBC drivers with autosave=always silently wrap every statement in a SAVEPOINT, generating sub-XIDs that accumulate rapidly. When these sub-XIDs reference the same rows across concurrent sessions, MXID creation accelerates. Each exception handler internally creates a SAVEPOINT, even when no explicit savepoint is declared.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Idle Sessions Holding MXID References Open&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Long-running idle-in-transaction sessions hold their MXID references open, preventing PostgreSQL's autovacuum from cleaning up old multixact entries. As the MXID space grows without cleanup, the SLRU cache (fixed at 8 pages) cannot hold all active pages simultaneously. New MXID lookups begin evicting cached pages, and under concurrency the eviction/reload cycle itself creates LWLock contention.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;VACUUM FREEZE During High Concurrency&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;When autovacuum runs VACUUM FREEZE to prevent MXID wraparound, it reads and resolves every MXID on every row in the table. During this process it holds SLRU buffer locks for each lookup. Concurrent application sessions needing the same SLRU pages must wait; generating MultiXactOffsetSLRU wait events even when the underlying cause is a routine maintenance operation.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;How to Diagnose This in Real Time&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Step 1: Confirm Active Wait Events&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Start by querying pg_stat_activity to confirm which sessions are actively waiting on MultiXact SLRU events. Use \watch 1 to refresh every second since SLRU LWLocks are held for microseconds and brief spikes can be missed. Pay close attention to the wait_event column, MultiXactOffsetSLRU and MultiXactMemberSLRU indicate pure lock contention on cached pages, while MultiXactOffsetBuffer indicates the page was evicted from cache and is being reloaded from disk.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT pid, wait_event_type, wait_event, state
, now() - query_start AS duration, left(query, 100) AS query 
FROM pg_stat_activity 
WHERE wait_event IN ( 'MultiXactOffsetSLRU', 'MultiXactMemberSLRU', 'MultiXactOffsetBuffer' ) 
ORDER BY duration DESC;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2: Distinguish Lock Contention From Disk I/O&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Once wait events are confirmed, determine whether the root cause is cache under sizing (disk I/O problem) or LWLock queue depth (lock contention problem). These look identical in pg_stat_activity but require completely different fixes. Query pg_stat_slru and focus on the blks_read and blks_zeroed columns. A blks_read = 0 alongside active wait events is the definitive signature of pure lock contention: the cache is warm but the LWLock protecting each buffer slot is the bottleneck.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT name, blks_hit, blks_read, blks_zeroed, flushes
, ROUND(100.0 * blks_hit / NULLIF(blks_hit + blks_read, 0), 2) AS hit_pct 
FROM pg_stat_slru 
WHERE name LIKE 'MultiXact%';&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Interpretation&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Meaning&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;blks_read = 0 AND wait events are present&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Pure lock contention&lt;/STRONG&gt; — the cache is warm, the lock is the bottleneck&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;blks_read &amp;gt; 0 AND wait events are present&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Cache miss + lock contention&lt;/STRONG&gt; — the SLRU cache is undersized&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;blks_zeroed are increasing rapidly&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;High MXID creation rate — inspect application pattern issues&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;flushes are high (2,000+)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Frequent checkpoint SLRU flushes holding an exclusive lock&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3: Check MXID Age and Identify Hot Tables&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A high MXID age means autovacuum is not keeping pace with MXID creation. This causes the MXID space to span far more SLRU pages than the 8-slot cache can hold, directly worsening lock contention. Check MXID age at both the database and table level. Any database approaching 1.5 billion should be treated as a critical incident. At the table level, focus on tables with the highest mxid_age combined with high row counts and stale last_autovacuum timestamps — these are your primary VACUUM FREEZE targets.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Database-level MXID age (watch for values &amp;gt; 1 billion) 
SELECT datname, mxid_age(datminmxid) AS mxid_age 
FROM pg_database 
ORDER BY mxid_age DESC; 

-- Table-level — find the worst offenders 
SELECT relname, mxid_age(relminmxid) AS mxid_age
, pg_size_pretty(pg_total_relation_size(oid)) AS table_size, n_live_tup 
FROM pg_stat_user_tables t 
JOIN pg_class c USING (relname) 
WHERE c.relkind = 'r' 
ORDER BY mxid_age DESC 
LIMIT 10;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 4: Find Queries Driving MXID Creation&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Once the hot tables are identified, use pg_stat_statements to pinpoint the specific queries generating MXIDs at a high rate. Focus on queries using FOR UPDATE, FOR KEY SHARE, or FOR SHARE, as these are the direct triggers for concurrent row locking. Also watch for INSERT-heavy workloads on child tables with FK references, as these implicitly acquire FOR KEY SHARE on parent rows and are a common hidden driver of MXID creation.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT left(query, 200) AS query, calls, mean_exec_time::numeric(10,2) AS avg_ms 
FROM pg_stat_statements 
WHERE query ILIKE '%for update%' 
OR query ILIKE '%for key share%' 
OR query ILIKE '%for share%' 
ORDER BY calls DESC 
LIMIT 10;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 5: Catch Long-Running Idle Transactions&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Idle-in-transaction sessions are one of the most damaging contributors to SLRU contention. They hold row-level locks while doing nothing, preventing autovacuum from cleaning up MXIDs and forcing other sessions to queue on the same SLRU pages indefinitely. Query pg_stat_activity filtered to idle-in-transaction states and focus on sessions idle for more than 2 minutes; these are almost always stuck client tool connections (DBeaver, pgAdmin) or misbehaving application threads that opened a transaction and never committed.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT pid, usename, application_name, state, now() - xact_start AS txn_age
, now() - state_change AS idle_duration, left(query, 100) AS last_query 
FROM pg_stat_activity 
WHERE state IN ('idle in transaction', 'idle in transaction (aborted)') 
AND now() - state_change &amp;gt; interval '2 minutes' 
ORDER BY idle_duration DESC;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Fixes and Mitigation Strategies&lt;/STRONG&gt;&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Terminate long-running idle-in-transaction sessions&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The fastest way to break the contention cycle during an active incident is to terminate sessions holding locks while idle. This immediately releases row-level locks, unblocks autovacuum, and allows MXID cleanup to resume. Always preview before terminating to avoid disrupting legitimate long-running batch jobs.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Preview candidates first 
SELECT pid, usename, application_name, now() - state_change AS idle_duration 
FROM pg_stat_activity 
WHERE state = 'idle in transaction' 
AND now() - state_change &amp;gt; interval '5 minutes' 
ORDER BY idle_duration DESC;

--then run the terminate 
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE state = 'idle in transaction' 
AND now() - state_change &amp;gt; interval '5 minutes';&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Set timeouts to prevent recurrence&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;After immediate relief, set timeouts to automatically kill idle-in-transaction sessions before they accumulate again. Both parameters take effect immediately via pg_reload_conf() with no server restart required. Choose values appropriate to your workload, use more aggressive for high-concurrency OLTP, more lenient for batch or reporting workloads.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;ALTER SYSTEM SET idle_in_transaction_session_timeout = 'XXmin'; 
ALTER SYSTEM SET statement_timeout = 'XXmin'; 
SELECT pg_reload_conf();&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;STRONG&gt; VACUUM FREEZE the most affected table&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;Running VACUUM FREEZE on the tables identified in Step 3 immediately clears old MXIDs from row headers, replacing them with frozen values that never require SLRU lookups. This directly reduces SLRU page access and LWLock contention. For very large tables, use INDEX_CLEANUP FALSE on the first pass for speed, then run a full vacuum during off-peak hours.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;VACUUM FREEZE VERBOSE your_hot_table;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;STRONG&gt; Connection pooling&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Connection pooling is the most impactful long-term fix for preventing thundering herd connection storms. PgBouncer in transaction mode absorbs connection spikes at the pooler layer, ensuring PostgreSQL never sees more simultaneous sessions than the pool size, and directly reducing the number of concurrent MXID lookups and SLRU LWLock contention. On Azure PostgreSQL Flexible Server, PgBouncer is available as a &lt;STRONG&gt;built-in feature. &lt;/STRONG&gt;Simply enable it via Server Parameters (pgbouncer.enabled = ON) and connect on &lt;STRONG&gt;port 6432&lt;/STRONG&gt;. No separate installation is required.&lt;/P&gt;
&lt;P&gt;# Key PgBouncer settings for OLTP workloads&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;PRE&gt;pool_mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = transaction&amp;nbsp;&amp;nbsp; # Release connection after each transaction&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;default_pool_size = 100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Real PG connections per database/user pair&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;max_client_conn&amp;nbsp;&amp;nbsp; = 5000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Total clients PgBouncer will accept&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;MultiXact SLRU wait events are deceptive. A server can show 100% cache hit ratio, nominal disk I/O, and moderate CPU, all while &lt;EM&gt;simultaneously &lt;/EM&gt;stalling hundreds of sessions on a lock held for microseconds. The cache appears healthy, and the problem is invisible... until sessions start piling up.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The single most important diagnostic insight is this: &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;pg_stat_slru measures I/O efficiency. &lt;BR /&gt;pg_stat_activity measures lock contention.&lt;/P&gt;
&lt;P&gt;A 100% hit ratio does not mean there are no problems, it means the bottleneck is the lock protecting the cached page, not the cache itself.&lt;/P&gt;
&lt;P&gt;Once you know this, the path forward is clear. Use pg_stat_slru and pg_stat_activity together, never in isolation. Track mxid_age proactively, and do not wait for autovacuum to raise the alarm. Eliminate idle-in-transaction sessions before they become lock holders. Use the weakest lock mode that satisfies your application's consistency requirements.&amp;nbsp; Use FOR NO KEY UPDATE instead of FOR UPDATE wherever possible. And deploy PgBouncer (available as a built-in feature on Azure Database for PostgreSQL Flexible Server) to absorb connection storms before they reach the SLRU layer.&lt;/P&gt;
&lt;P&gt;MultiXact contention is not inevitable. It is the compounded result of concurrent locking patterns, under-tuned autovacuum, and unbounded connection growth, all of which are fully controllable. The earlier you instrument for it, the less likely it becomes an incident.&lt;/P&gt;</description>
      <pubDate>Wed, 27 May 2026 14:20:20 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/demystifying-lwlock-multixact-slru-wait-events-in-azure-database/ba-p/4518504</guid>
      <dc:creator>Gayathri_Paderla</dc:creator>
      <dc:date>2026-05-27T14:20:20Z</dc:date>
    </item>
    <item>
      <title>SELECT * FROM build2026_sessions WHERE postgres = true;</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/select-from-build2026-sessions-where-postgres-true/ba-p/4522093</link>
      <description>&lt;P&gt;&lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3EBreakout" target="_blank" rel="noopener"&gt;Microsoft Build 2026&lt;/A&gt; is around the corner, and this year it’s shaping up to be a big one for PostgreSQL experts and enthusiasts. If you’re a developer working with Postgres, or just love exploring new database technology, there's plenty to get excited about. Microsoft’s new cloud-first evolution of PostgreSQL,&amp;nbsp;&lt;A href="https://azure.microsoft.com/products/horizondb" target="_blank" rel="noopener"&gt;Azure HorizonDB&lt;/A&gt;, alongside sessions featuring &lt;A href="https://azure.microsoft.coms/products/postgresql" target="_blank" rel="noopener"&gt;Azure Database for PostgreSQL&lt;/A&gt;, will highlight how Postgres is powering the next wave of AI-driven applications.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A new horizon in Postgres&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Build 2026 arrives at a time when the role of databases in modern apps is evolving rapidly. From enabling AI model integration to scaling seamlessly across the cloud, PostgreSQL developers today are dealing with more complex demands than ever. That’s why Azure HorizonDB – Microsoft’s new cloud-native PostgreSQL service – is generating so much buzz ahead of Build.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;What is Azure HorizonDB?&lt;/EM&gt; In short, it’s a reimagined version of PostgreSQL designed for cloud-scale performance and AI-era workloads. Azure HorizonDB, introduces a distributed architecture that decouples compute and storage, delivering sub-millisecond latencies and three times the throughput of self-managed Postgres at massive scale. It aims to preserve Postgres’s beloved features and SQL ecosystem while adding next-generation capabilities: built-in vector indexing for high-speed AI/ML retrieval, the ability to run AI models and vector operations directly in the database, and multi-zone replication for resilience. For Postgres developers, this means less time stitching together external data stores or machine learning services – and more time building powerful apps on a unified platform that’s both familiar and built for the future.&lt;/P&gt;
&lt;P&gt;The bottom line: Microsoft Build 2026 is an ideal opportunity for developers to see Azure HorizonDB in action, learn best practices for modern PostgreSQL architectures, and understand how to leverage Postgres in new scenarios like generative AI and multi-agent applications. Read on for a rundown of sessions covering these topics, complete with what you’ll learn from each one.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Top sessions for PostgreSQL databases on Azure &amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Below are key sessions tailored for PostgreSQL users and those interested in Azure HorizonDB, with session types and highlights of what you’ll gain by attending.&lt;/P&gt;
&lt;P&gt;🎤 &lt;STRONG&gt;Breakout&lt;/STRONG&gt;: &lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3EBreakout" target="_blank" rel="noopener"&gt;From Rows to Reasoning: Designing Databases for AI Apps and Agents&lt;/A&gt; (&lt;STRONG&gt;BRK223&lt;/STRONG&gt;, 45 min, in-person and digital options)&lt;/P&gt;
&lt;P&gt;Discover how to architect databases that can power tomorrow’s intelligent applications. This technical breakout will show how AI-ready databases can move beyond plain transactions. You’ll see live demos of integrating transactional, analytical, and vector data in one unified platform, with Azure’s new database capabilities, including Azure HorizonDB. Learn how to simplify your stack by eliminating separate analytics engines or vector stores. The session will highlight patterns that reduce data movement and latency so your apps can efficiently reason over live data with minimal complexity.&lt;/P&gt;
&lt;P&gt;🧪 &lt;STRONG&gt;Hands-on lab&lt;/STRONG&gt;: &lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3ELab&amp;amp;filter=sessionType%2FlogicalValue%3EDigital+Lab" target="_blank" rel="noopener"&gt;Create Advanced Postgres-Powered Agentic Apps with Azure HorizonDB&lt;/A&gt; (&lt;STRONG&gt;LAB511&lt;/STRONG&gt;, 75 min, in person and digital options)&lt;/P&gt;
&lt;P&gt;Roll up your sleeves and get hands-on building a real multi-agent AI application with Postgres. In this advanced lab, you’ll create a production-ready AI agent powered by Azure HorizonDB as an all-in-one data, search, and intelligence layer. Experiment with retrieval-augmented generation (RAG) by combining semantic vector search (DiskANN) with traditional SQL queries right inside the database. Implement hybrid search and agent workflows without resorting to external vector databases or glue code – thanks to HorizonDB’s built-in vector indexing and in-database AI model capabilities. This lab is perfect for developers who want to experience how HorizonDB can simplify your stack and boost performance for AI-driven apps.&amp;nbsp;&lt;BR /&gt;&lt;EM&gt;Multiple hands-on labs&amp;nbsp;are offered to suite your schedule.&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;💻 Demo&lt;/STRONG&gt;:&amp;nbsp;&lt;A href="https://build.microsoft.com/sessions/DEM364?source=sessions" target="_blank" rel="noopener"&gt;Simplify App Dev with Cloud-Native PostgreSQL in Azure HorizonDB&lt;/A&gt; (&lt;STRONG&gt;DEM364&lt;/STRONG&gt;, 25 min, in-person and digital options)&lt;/P&gt;
&lt;P&gt;See how to cut your development time and complexity with built-in AI and search features in Postgres. This fast-paced demo shows how Azure HorizonDB helps eliminate the need for separate search engines and AI services by pulling those capabilities straight into PostgreSQL. Expect to learn how you can run hybrid vector + keyword queries using SQL, integrate AI models directly from within the database, and apply full-text search (BM25) and semantic ranking to get smarter results. If you’re eager to deliver intelligent apps faster, with fewer moving parts, this session will show how HorizonDB simplifies your architecture without sacrificing performance.&lt;/P&gt;
&lt;P&gt;⚡&lt;STRONG&gt;Lightning Talk&lt;/STRONG&gt;: &lt;A href="https://build.microsoft.com/sessions/LTG413?source=sessions" target="_blank" rel="noopener"&gt;Cloud-Native PostgreSQL, Rebuilt for Scale: Azure HorizonDB&lt;/A&gt; (&lt;STRONG&gt;LTG413&lt;/STRONG&gt;, 15 min, in-person only)&lt;/P&gt;
&lt;P&gt;Get a rapid-fire introduction to the architecture behind HorizonDB’s eye-popping performance. This short talk dives into how HorizonDB re-architects core PostgreSQL to deliver effortless scale out and blazing speed. Learn how decoupled compute and storage, predictive caching, and multi-region replication combine to achieve sub-millisecond query latencies and 3× higher throughput than standard Postgres. If you care about performance tuning and high-scale database design, don’t miss this quick primer on the tech under HorizonDB’s hood.&lt;/P&gt;
&lt;P&gt;👥 &lt;STRONG&gt;Interactive Table Talk&lt;/STRONG&gt;: &lt;A href="https://build.microsoft.com/sessions/TT622?source=sessions" target="_blank" rel="noopener"&gt;Scaling PostgreSQL for AI Apps: Patterns and Tradeoffs&lt;/A&gt; (&lt;STRONG&gt;TT622&lt;/STRONG&gt;, 45 min, in-person only)&lt;/P&gt;
&lt;P&gt;Bring your questions and ideas to this collaborative discussion. In this open round-table session with community and Microsoft experts, you’ll explore architecture patterns for scaling PostgreSQL to meet the demands of agent-based and AI-driven applications. Discuss real-world strategies for handling vector embeddings in Postgres, unifying relational and document data, integrating with AI models, and more. Compare the trade-offs between different scaling approaches – from monolithic to microservices, sharding strategies, and new technologies like HorizonDB – and learn where each design shines or struggles in production. Come ready to share your experiences and learn from others in the room.&lt;/P&gt;
&lt;P&gt;▶️ &lt;STRONG&gt;On-Demand&lt;/STRONG&gt;: &lt;A class="lia-external-url" href="https://build.microsoft.com/sessions/OD822?source=sessions" target="_blank"&gt;Smarter PostgreSQL Migrations to Power Modern, Intelligent Apps&lt;/A&gt; (&lt;STRONG&gt;OD822&lt;/STRONG&gt;, 30 min, digital only)&lt;/P&gt;
&lt;P&gt;Planning to migrate to Postgres or move your databases to Azure? Start here. This on-demand session focuses on new tools and proven strategies to migrate large-scale databases to Azure Database for PostgreSQL quickly and safely. You’ll see AI-assisted migration tools in action that minimize downtime and risk when moving terabytes of data. Just as importantly, you’ll learn how migrating to Azure unlocks advanced capabilities – from boosted performance and enhanced security to AI-ready features – helping you turn your newly migrated data into intelligent apps and services.&lt;EM&gt; &lt;BR /&gt;&lt;/EM&gt;&lt;EM&gt;On-demand session will be available to stream on the first day of Build.&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Meet the team: PostgreSQL expert meetups &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you’re attending Build in person, stop by the Expert Meetup (EMU) area and head to the &lt;STRONG&gt;relational cloud databases &lt;/STRONG&gt;booth. This is your chance to talk directly with the engineers and product teams behind PostgreSQL on Azure.&lt;/P&gt;
&lt;P&gt;Bring your questions about architecture decisions, scaling patterns, migrations, AI workloads, or anything else on your mind. Whether you want to sanity-check a design, dig deeper into something you saw in a session, or give direct feedback, the EMU space is designed for exactly that convo.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;How to get the most out of Build (and what to do next)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;With so much great content lined up, how do you decide where to start? It really depends on what you’re most excited about:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;Curious about AI and agentic apps:&lt;/EM&gt; Start with &lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3EBreakout" target="_blank" rel="noopener"&gt;From Rows to Reasoning&lt;/A&gt;, then go deeper with the &lt;A href="https://build.microsoft.com/sessions/DEM364?source=sessions" target="_blank" rel="noopener"&gt;Simplify App Dev with HorizonDB&lt;/A&gt; demo or get hands-on at the &lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3ELab&amp;amp;filter=sessionType%2FlogicalValue%3EDigital+Lab" target="_blank" rel="noopener"&gt;Azure HorizonDB lab&lt;/A&gt;s to see how these ideas work in practice.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Performance and scale are your focus:&lt;/EM&gt; The short &lt;A href="https://build.microsoft.com/sessions/LTG413?source=sessions" target="_blank" rel="noopener"&gt;Lightning Talk&lt;/A&gt; on HorizonDB’s cloud-native architecture and the &lt;A href="https://build.microsoft.com/sessions/TT622?source=sessions" target="_blank" rel="noopener"&gt;Table Talk on scaling Postgres&lt;/A&gt; will both provide unique insights and pro tips for running Postgres at massive scale.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Planning a migration to PostgreSQL on Azure:&lt;/EM&gt;&amp;nbsp;Watch the Smarter PostgreSQL Migrations on-demand session to &lt;A class="lia-external-url" href="https://build.microsoft.com/sessions/OD822?source=sessions" target="_blank"&gt;learn how to migrate&lt;/A&gt; large workloads with minimal downtime, and the benefits you can unlock after moving to Azure.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Looking for real answers to your specific questions: &lt;/EM&gt;Make time for the PostgreSQL Expert Meetup area to connect directly with the team.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;No matter which sessions you choose, Build 2026 promises to be an exciting event for the PostgreSQL developer community. Browse the &lt;A href="https://build.microsoft.com/sessions?search=postgres&amp;amp;sortBy=relevance&amp;amp;filter=sessionType%2FlogicalValue%3EBreakout" target="_blank" rel="noopener"&gt;session catalog&lt;/A&gt;, save the sessions that match your interests, and we’ll see you at Build. &amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Jun 2026 18:26:52 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/select-from-build2026-sessions-where-postgres-true/ba-p/4522093</guid>
      <dc:creator>Pooja_Y</dc:creator>
      <dc:date>2026-06-02T18:26:52Z</dc:date>
    </item>
    <item>
      <title>Real-World Success Stories with PostgreSQL on Azure</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/real-world-success-stories-with-postgresql-on-azure/ba-p/4519862</link>
      <description>&lt;P&gt;Organizations rarely leap into cloud migrations or AI-powered systems overnight. They progress in deliberate stages, establishing a reliable data foundation, optimizing for performance, and then accelerating innovation. Across healthcare, financial services, and AI startups, companies are navigating this journey on Azure Database for PostgreSQL: a fully managed, enterprise-ready PostgreSQL environment with 58% lower total cost of ownership (TCO) compared to on-premises deployments.&lt;/P&gt;
&lt;P&gt;This post walks through &lt;A href="https://aka.ms/PostgresCustomerStoriesEbook" target="_blank" rel="noopener"&gt;real customer stories&lt;/A&gt; that span the full arc, from lift-and-shift migration to production-grade AI agent development, illustrating how Azure Database for PostgreSQL supports scalability, performance, security, and AI-readiness at every stage.&lt;/P&gt;
&lt;H2&gt;Migrating with Confidence: Apollo Hospitals &amp;amp; August AI&lt;/H2&gt;
&lt;P&gt;&lt;A href="https://www.microsoft.com/en/customers/story/25629-apollo-hospitals-azure-database-for-postgresql" target="_blank" rel="noopener"&gt;Apollo Hospitals&lt;/A&gt; operates a network of more than 74 hospitals and needed to move beyond a legacy on-premises Oracle system that had become difficult to manage and couldn't keep pace with growing data volumes. IT teams were spending their time on maintenance rather than innovation.&lt;/P&gt;
&lt;P&gt;Apollo migrated its core hospital information system backend to Azure Database for PostgreSQL. Working with partner Quadrant Technologies, the team lifted and shifted critical applications while using Azure DevOps to orchestrate CI/CD pipelines and Azure Application Insights for telemetry and observability. The results:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;99.95% availability across hospital systems&lt;/LI&gt;
&lt;LI&gt;Database transactions executing within 5 seconds&lt;/LI&gt;
&lt;LI&gt;40% reduction in deployment times via modern CI/CD pipelines&lt;/LI&gt;
&lt;LI&gt;Decreased operational overhead, freeing IT staff for higher-value work&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;With a stable, scalable PostgreSQL backend in place, Apollo is now exploring real-time analytics and AI-enabled tools like Microsoft 365 Copilot to advance patient care.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"We saw Azure Database for PostgreSQL as the right foundation for the future. It's open, cost-effective, and capable of supporting the hospital information system we built in-house."&lt;/EM&gt; — Shankar Krishna A., General Manager of IT, Apollo Hospitals&lt;/P&gt;
&lt;P&gt;Apollo's experience is not unique. &lt;A href="https://www.microsoft.com/en/customers/story/25636-august-ai-linux-on-azure" target="_blank" rel="noopener"&gt;August AI&lt;/A&gt;, a healthcare-tech startup offering an AI-driven medical companion, migrated its entire stack to Azure—with Azure Database for PostgreSQL storing mission-critical patient data while meeting strict compliance requirements such as HIPAA. The result: scaling from roughly 500,000 users to 3.5 million+ users worldwide, with zero downtime during the cutover, completed in just three months. As Founder and CEO Anuruddh Mishra noted: &lt;EM&gt;"We receive a log of queries that are not performing optimally, and within a couple of minutes we can optimize that query with PostgreSQL on Azure and move on"&lt;/EM&gt;.&lt;/P&gt;
&lt;H2&gt;Modernizing at Scale: Nasdaq&lt;/H2&gt;
&lt;P&gt;Migration is often the first step. &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/nasdaq-builds-thoughtfully-designed-ai-for-board-governance-with-postgresql-on-a/4493078" target="_blank" rel="noopener"&gt;Nasdaq&lt;/A&gt; demonstrates what becomes possible when organizations modernize their architecture on a scalable data foundation.&lt;/P&gt;
&lt;P&gt;To improve its Nasdaq Boardvantage platform—used by corporate boards to collaborate on governance documents—Nasdaq re-architected on Azure. The team containerized services with Azure Kubernetes Service (AKS) and adopted Azure Database for PostgreSQL alongside Azure Database for MySQL as persistent data stores for governance workloads. This architecture provided the flexibility, performance, and security required for a multitenant platform handling sensitive board materials.&lt;/P&gt;
&lt;P&gt;With the data layer in place, Nasdaq integrated Microsoft Foundry and Azure OpenAI to deliver AI-powered summarization and workflow automation. The measurable outcomes:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;60% reduction in reading time through AI-powered document summarization&lt;/LI&gt;
&lt;LI&gt;25% decrease in administrative preparation time across board workflows&lt;/LI&gt;
&lt;LI&gt;Up to 97% accuracy in AI-generated summaries and meeting minutes&lt;/LI&gt;
&lt;LI&gt;A reusable AI framework established for future extensibility&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;"Both Azure Database for PostgreSQL and Azure Database for MySQL gave us the right balance of performance, security, and control. The governance workloads we handle are unique, so we needed something that could meet those isolation and encryption requirements."&lt;/EM&gt; — Scott Ellison, Vice President of Technology, Nasdaq&lt;/P&gt;
&lt;H2&gt;Building Intelligent Applications: SubgenAI and OpenAI&lt;/H2&gt;
&lt;P&gt;Azure Database for PostgreSQL now supports native vector search via pgvector, high-performance DiskANN indexing, semantic operators and AI model management, and integrated graph capabilities for relationship reasoning—making it a production-ready foundation for intelligent applications.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/subgenai-makes-ai-practical-scalable-and-sustainable-with-azure-database-for-pos/4475021" target="_blank" rel="noopener"&gt;SubgenAI&lt;/A&gt;, a European generative AI company, built its flagship platform Serenity Star on Azure Database for PostgreSQL and Microsoft Foundry to transform AI agent development from a code-heavy, fragmented process into a streamlined, no-code experience. A core technical requirement: the platform's retrieval-augmented generation (RAG) system needs efficient vector search against embedded content while maintaining enterprise-grade reliability. After evaluating several database options, SubgenAI chose Azure Database for PostgreSQL with pgvector for its accurate and scalable vector similarity search. Serenity Star customers can now:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Launch AI agents in as little as 15 minutes&lt;/LI&gt;
&lt;LI&gt;Cut coding and development time by 50%&lt;/LI&gt;
&lt;LI&gt;Resolve most AI agent queries in under 60 seconds &lt;A href="https://microsoft-my.sharepoint.com/personal/pyarabothu_microsoft_com/Documents/Microsoft%20Copilot%20Chat%20Files/Customer%20success%20stories%20for%20Azure%20Database%20for%20PostgreSQL%20e-book.PDF" target="_blank" rel="noopener"&gt;[&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;"With Microsoft and Azure Database for PostgreSQL we have total control and an environment that is truly dynamic and can adapt to the evolution we're looking for."&lt;/EM&gt; — Julia Schröder Langhaeuser, VP of Product Serenity Star, SubgenAI&lt;/P&gt;
&lt;P&gt;At the extreme end of scale, &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/supporting-chatgpt-on-postgresql-in-azure/4490247" target="_blank" rel="noopener"&gt;OpenAI&lt;/A&gt; runs PostgreSQL on Azure to support production systems behind ChatGPT. As write scalability limits emerged on an initially unsharded single primary instance, OpenAI offloaded write-heavy operations to other systems and optimized read workloads using PgBouncer for connection pooling. The Azure Database for PostgreSQL team responded by developing the elastic clusters feature, enabling horizontal scaling through row-based and schema-based sharding. The team reduced connection latency from approximately 50 ms to under 5 ms, scaled reads horizontally with multiple replicas, and improved reliability by prioritizing critical requests—all achieved by a small team making systematic optimizations on open-source PostgreSQL.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"After all the optimization we did, we are super happy with Postgres right now for our read-heavy workloads. It's really scalable and reliable."&lt;/EM&gt; — Bohan Zhang, Member of the Technical Staff, OpenAI&lt;/P&gt;
&lt;H2&gt;Meeting You Where You Are&lt;/H2&gt;
&lt;P&gt;Beyond these stories, organizations like &lt;A href="https://www.microsoft.com/en/customers/story/19769-bmw-ag-azure-app-service" target="_blank" rel="noopener"&gt;BMW Group&lt;/A&gt; (cloud-native applications at global scale), &lt;A href="https://www.microsoft.com/en/customers/story/25672-ahold-delhaize-usa-azure" target="_blank" rel="noopener"&gt;Ahold Delhaize&amp;nbsp;&lt;/A&gt;(highly available retail applications),&amp;nbsp;&lt;A href="https://www.microsoft.com/en/customers/story/25658-mott-macdonald-azure" target="_blank" rel="noopener"&gt;Mott MacDonald&lt;/A&gt; (an AI agent accelerating onboarding and spreading best practices across 220,000 employees), and &lt;A href="https://techcommunity.microsoft.com/blog/azure-customer-innovation-blog/multitude-builds-resilient-banking-platform-with-postgresql-and-mysql-on-azure/4512470" target="_blank"&gt;Multitude &lt;/A&gt;(scaling responsibly in regulated environments) all run on Azure Database for PostgreSQL. The service offers 99.99% availability with automatic failover and SLA, independent compute and storage scaling, and intelligent performance recommendations, available across 60+ Azure regions. Developer tooling including the PostgreSQL extension for Visual Studio Code with GitHub Copilot further accelerates productivity.&lt;/P&gt;
&lt;P&gt;Whether you are planning your first migration or building production AI agents, these stories share a clear signal: Azure Database for PostgreSQL delivers a scalable, secure, AI-ready data foundation at every stage of growth.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Explore full customer stories in depth in the eBook: &lt;/STRONG&gt;&lt;A class="lia-external-url" href="https://cdn-dynmedia-1.microsoft.com/is/content/microsoftcorp/azure/acom/documents/pdfs/en-us/Customer-Evidence-For-Azure-Database-For-PostgreSQL-Ebook.pdf" target="_blank"&gt;Customer Success Stories with Azure Database for PostgreSQL&lt;/A&gt;&lt;STRONG&gt;.&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 20 May 2026 17:34:35 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/real-world-success-stories-with-postgresql-on-azure/ba-p/4519862</guid>
      <dc:creator>Pooja_Y</dc:creator>
      <dc:date>2026-05-20T17:34:35Z</dc:date>
    </item>
    <item>
      <title>Native Database/Query Monitoring with Azure Database for PostgreSQL</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/native-database-query-monitoring-with-azure-database-for/ba-p/4503346</link>
      <description>&lt;H2&gt;Monitoring PostgreSQL Database Engine&lt;/H2&gt;
&lt;P&gt;The PostgreSQL database engine provides multiple administrative views, which can be leveraged to capture metrics of activities inside of the database engine including, but not limited to, database activities, query activities, execution time, database resource locks etc for initial and deep analysis on database &amp;amp; query performance. Database Administrators should use these views and their corresponding metrics to perform initial level analysis. Critical insights can be gathered around database activity, performance and system activity for reactive and proactive analysis.&lt;/P&gt;
&lt;P&gt;In this blog, I am going to show the important administrative views and their corresponding SQL statements for capturing database and query details.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The following section provides details about the statistics views and their usage. It contains the most important and mostly used statistics views, there are other views available that can be used to get into further details.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;NOTE&lt;/STRONG&gt;&lt;/U&gt;&lt;STRONG&gt;:&lt;/STRONG&gt; The queries and flows provided below are a few of the ways for each scenario. Eventually, the final approach will depend on and be dictated by the issue at hand or its symptoms.&lt;/P&gt;
&lt;H2&gt;Pre-requisites&lt;/H2&gt;
&lt;P&gt;The following parameters should be enabled in Azure Database for PostgreSQL “Server parameters” before using the statistics views:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;track_activities&lt;/LI&gt;
&lt;LI&gt;track_counts&lt;/LI&gt;
&lt;LI&gt;track_io_timing&lt;/LI&gt;
&lt;LI&gt;pg_stat_statements.track = ALL&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The following extensions should be installed before using the stats:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;create extension pg_stat_statements; create extension pgstattuple;&lt;/LI-CODE&gt;
&lt;P&gt;NOTE: All SQL queries mentioned below are as per PostgreSQL version 18.&lt;/P&gt;
&lt;H2&gt;Schema &amp;amp; Data for Analysis&lt;/H2&gt;
&lt;P&gt;All the "Example Scenario" mentioned in the analysis queries are based on the following schema and corresponding volumetrics:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 29.0738%; height: 94px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 50.0294%" /&gt;&lt;col style="width: 50.0294%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 34.6131px;"&gt;&lt;td style="height: 34.6131px;"&gt;&lt;STRONG&gt;Table Name&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.6131px;"&gt;&lt;STRONG&gt;No. of rows&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.6131px;"&gt;&lt;td style="height: 34.6131px;"&gt;customer&lt;/td&gt;&lt;td style="height: 34.6131px;"&gt;993,814&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.6131px;"&gt;&lt;td style="height: 34.6131px;"&gt;invoice&lt;/td&gt;&lt;td style="height: 34.6131px;"&gt;20,229,119&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.6131px;"&gt;&lt;td style="height: 34.6131px;"&gt;orders&lt;/td&gt;&lt;td style="height: 34.6131px;"&gt;4,497,292&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.6131px;"&gt;&lt;td style="height: 34.6131px;"&gt;product&lt;/td&gt;&lt;td style="height: 34.6131px;"&gt;2,818,000&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Statistics Views and SQL Queries for Analysis&lt;/H2&gt;
&lt;P&gt;The following SQL statements can be used to perform 1&lt;SUP&gt;st&lt;/SUP&gt; level monitoring on the database, tables and queries. Note that the output counters and metrics from the SQL statements represent cumulative data since the last server restart. The statistics should be reset to zero before performing troubleshooting or performance tuning exercises. Use the below mentioned SQL statements to reset statistics at database, table and IO level.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Database level stats reset&amp;nbsp;
&lt;UL&gt;
&lt;LI&gt;&lt;LI-CODE lang="sql"&gt;SELECT pg_stat_reset();&lt;/LI-CODE&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;IO level stats reset.
&lt;UL&gt;
&lt;LI&gt;&lt;LI-CODE lang="sql"&gt;SELECT pg_stat_reset_shared('io');&lt;/LI-CODE&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Reset pg_stat_statements metrics per user, query and database id or for the entire database - pg_stat_statements contain query level metrics for a database, user or a single query. We can reset the statistics at these individual levels. If any of the parameters are not specified, the default value 0 is used for each of them and the statistics that match with other parameters will be reset. "userid", "dbid" (Database ID), "queryid" &amp;nbsp;can be fetched from pg_roles (column - oid), pg_stat_database (column - datid) and pg_stat_activity (column - query_id) respectively.&amp;nbsp;
&lt;UL&gt;
&lt;LI&gt;&lt;LI-CODE lang="sql"&gt;SELECT pg_stat_statements_reset(userid, dbid, queryid);&lt;/LI-CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;LI-CODE lang="sql"&gt;SELECT pg_stat_statements_reset();&lt;/LI-CODE&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;SQL Activity Monitoring:&lt;/H3&gt;
&lt;P&gt;This query uses pg_stat_activity statistics view, which contains details of current activities in the database server. It can be used to track queries in transactions, transaction execution time, wait event details if any etc. The WHERE clause can be used to filter activities based on client IP address (client_addr), application name (application_name), user (usename) who has submitted the query and text of the SQL statement.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT datname AS dbname, 
       pid, 
       usename as username, 
       application_name, 
       client_addr as client_ip_addr, 
       xact_start AS transaction_start_time, 
       query_start AS query_start_time, 
       wait_event_type AS db_waitign_on, 
       wait_event AS waiting_activity, 
       CAST(query AS varchar(100)) AS sql_query, 
       backend_type AS db_operation 
FROM pg_stat_activity 
WHERE &amp;lt;conditions&amp;gt;;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: This output should be used to find overall activity in your database.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;username, application_name, client_ip_addr - The user, application and client IP address from where the query is being executed.&lt;/LI&gt;
&lt;LI&gt;transaction_start_time - When transaction started (using BEGIN keyword or corresponding API).&lt;/LI&gt;
&lt;LI&gt;query_start_time - Start time of currently active query in the transaction.&lt;/LI&gt;
&lt;LI&gt;wait_event and wait_event_type columns output the events on which the query is waiting, if applicable. Refer to the official links for details on &lt;A href="https://www.postgresql.org/docs/current/monitoring-stats.html#WAIT-EVENT-TABLE" target="_blank"&gt;wait events&lt;/A&gt; and &lt;A href="https://www.postgresql.org/docs/current/monitoring-stats.html#WAIT-EVENT-ACTIVITY-TABLE" target="_blank"&gt;wait event types&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;db_operation - Type of database operation that is being performed by the application. E.g. autovacuum, parallel worker, client backend, etc.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario&lt;/STRONG&gt;: Application team is complaining about higher load in "retail_db" database and it is causing multiple SQL statements to run slow, team wants to know whether ad-hoc SQL statements are being run using "psql" client by application developers. As a DBA, you want to look at the entire database activity - no. of SQL statements, who are running to SQLs and which client are they coming from. Above mentioned SQL can be used with filters on "application_name" (value = "psql") and "dbname" (value = "retail_db"). It generates the following output:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Analysis:&lt;/STRONG&gt; From the above output, it can be seen that "psql" client is indeed getting used from a few IP addresses.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step: &lt;/STRONG&gt;pg_terminate_backend(&amp;lt;pid&amp;gt;) can be used to kill the applications with pid 22210, 22209 and 21993.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Similarly, the same SQL statement can be used to look at overall SQL activities in individual database.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;SQL Statement Level monitoring&lt;/H3&gt;
&lt;P&gt;This is one of the most important SQL statements that describes operations at query level. It provides execution time detail of queries, read time, write time, disk read and disk write. Output of this query should serve as one of the starting point of query troubleshooting and query optimization.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT queryid , 
       CAST(query AS varchar(100)) AS sql_stmt, 
       calls AS no_of_executions, 
       total_exec_time, 
       min_exec_time, 
       max_exec_time, 
       mean_exec_time AS avg_exec_time, 
       rows AS rows_fetched, 
       shared_blks_hit AS blocks_read_from_buffer, 
       shared_blks_read AS blocks_read_from_disk, 
       shared_blks_written AS blks_written_to_disk, 
       shared_blk_read_time, 
       shared_blk_write_time 
FROM pg_stat_statements
WHERE query LIKE '%&amp;lt;sql-stmt&amp;gt;%';&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: Output of this query can be used to dive deeper into SQL performance issues.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;sql_stmt - Provides the SQL statement that is being run. This is the query that is being analyzed for tuning.&lt;/LI&gt;
&lt;LI&gt;no_of_executions - How many times this SQL statement has been executed so far (since the reset of pg_stat_statements).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;total_exec_time - This is the execution time for the query combining all runs. e.g. if the query was run 10 times and each time took 1.5s, then total_exec_time would be 15s.&lt;/LI&gt;
&lt;LI&gt;min_exec_time - Min. time the query took to execute. This can be considered as the benchmark execution time for this query.&lt;/LI&gt;
&lt;LI&gt;max_exec_time - Max. time the query took to execute.&lt;/LI&gt;
&lt;LI&gt;avg_exec_time - Avg. execution time of the query. This time should fall within the query SLA.&lt;/LI&gt;
&lt;LI&gt;rows_fetched - No. of rows needed by application (SQL query)&lt;/LI&gt;
&lt;LI&gt;blocks_read_from_buffer &amp;amp; blocks_read_from_disk - Data blocks (8KB size) read from PostgreSQL shared memory and from disk respectively.&lt;/LI&gt;
&lt;LI&gt;shared_blk_read_time &amp;amp; shared_blk_write_time - Total time spent in reading from and writing to disk. This time is included in total_exec_time. If ratio of shared_blk_read_time or shared_blk_write_time or both with total_exec_time is higher, then IO is causing high execution time in this query. If the ratio is less then other complex SQL operations like join, order by, group by, functions etc. are taking longer to execute.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario&lt;/STRONG&gt;: We will be using the same SQL statement that was used in the example scenario of "3. Application-wise IO Activities". But in this case, using "SQL Statement Level monitoring" we will look at the execution details of the query rather than IO usage. Following is the output of first execution (after server restart - shared memory was empty) of the SQL statement&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Analysis:&lt;/STRONG&gt; Here is the observation, execution time of the query was 154.81 seconds. Total rows needed by application was 4,497,292 out of which 341 8KB blocks were read from shared memory (PostgreSQL bufferpool) and 58504 8KB blocks were read from disk.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Following is the output after 2nd execution (after resetting pg_stat_statements):&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Analysis: &lt;/STRONG&gt;The query was executed 4 times. Execution time got reduced to 95 seconds, but it is still high. Even though all rows (4497292 x 4) were read from shared memory (buffer pool) as blocks_read_from_disk was zero, execution time is very high.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step: &lt;/STRONG&gt;Even if the execution time is found to be within SLA, the query needs to be analyzed for its execution plan. Use EXPLAIN ANALYZE command to analyze the access plan or execution path of the query. Query optimization must be done for this SQL statement.&lt;/P&gt;
&lt;H3&gt;Table-level Bloat Statistics&lt;/H3&gt;
&lt;P&gt;PostgreSQL uses MVCC (Multi Version Concurrency Control) to avoid read and write conflicts, which means one application can read rows while they are being modified by another application. This is done by storing multiple versions of the same row. But over time older versions, which are not needed by applications, become overhead as they occupy space. This is known as "Bloating". It can cause both storage and performance issue. The query mentioned below provides bloating percentage on a table, which should be monitored on a regular basis and DBAs should decide on the autovaccuum settings.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT (table_len/1024/1024) AS table_size_mb, 
       tuple_count AS no_of_live_rows, 
       (tuple_len/1024/1024) AS live_row_size_mb, 
       dead_tuple_count AS no_of_dead_rows, 
       (dead_tuple_len/1024/1024) AS dead_row_size_mb, 
       tuple_percent AS live_rows_percent, 
       dead_tuple_percent AS dead_rows_percent, 
       free_percent AS free_space_percent, 
        (((table_len – tuple_len)/table_len)*100) AS bloat_percent 
FROM pgstattuple('&amp;lt;table-name&amp;gt;');&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;table_size_mb - This is the total table size, including bloating.&lt;/LI&gt;
&lt;LI&gt;no_of_live_rows - No. of actual usable rows in the table.&lt;/LI&gt;
&lt;LI&gt;live_row_size_mb - This is the actual size of the table. This is the amount of data in this table that can be used by applications.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;no_of_dead_rows - No. of irrelevant rows in the table.&lt;/LI&gt;
&lt;LI&gt;dead_row_size_mb - Size of irrelevant rows in the table. This is the amount of data that is not needed by any application, but is still there in the table and occupying storage. This is the data that has to be removed from the table.&lt;/LI&gt;
&lt;LI&gt;bloat_percent - Percentage of dead rows occupying the table. If it goes beyond 25-30%, manual VACUUM should be used to remove bloating.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario&lt;/STRONG&gt;: invoice_history table contains more than 20 M rows and has a size of 1630 MB. Deleting records from a table does not reduce the size in PostgreSQL because of MVCC support to keep multiple versions of the same row. The deleted rows still occupy storage space, it is known as bloating as shown below.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;"Table level Bloat Statistics" can be used to find the bloat percentage of a table.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step:&lt;/STRONG&gt; Aggressive AUTOVACUUM has to be configured to remove bloating on time. As AUTOVACUUM does not free up storage space, manual FULL VACUUM has to be executed to reclaim storage space. Note that full vacuum takes exclusive lock on tables. Bloat percentage changed after executing full vacuum.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;Table Bloat using Stat table&lt;/H3&gt;
&lt;P&gt;Table bloating information using statistics table.&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT schemaname, 
       relname AS tblname, 
       n_live_tup AS live_rows, 
       n_dead_tup AS dead_rows, 
       ((n_dead_tup - n_live_tup)/100) AS tbl_bloat_percent, 
       last_vacuum AS last_manual_vacuum, 
       last_autovacuum 
FROM pg_stat_all_tables 
WHERE relname = '&amp;lt;tblname&amp;gt;';&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: Same as "Table-level Bloat Statistics".&lt;/P&gt;
&lt;H3&gt;Database Activity Monitoring&lt;/H3&gt;
&lt;P&gt;This SQL statement provides row level counters of DML statements for a database.&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT datname AS dbname, 
       blks_read AS total_no_of_read_ops, 
       blks_hit AS no_of_blks_read_from_bufferpool, 
       tup_returned AS no_of_rows_scanned, 
       tup_fetched AS no_of_rows_fetched, 
       tup_inserted AS no_of_rows_inserted, 
       tup_updated AS no_of_rows_updated, 
       tup_deleted AS no_of_rows_deteled, 
       deadlocks AS no_of_deadlocks, 
       (blk_read_time/1000) AS blk_read_time_s, 
       (blk_write_time/1000) AS blk_write_time_s 
FROM pg_stat_database;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: Output shows the impact of DML operations in a database.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;total_no_of_read_ops - This is the total block read request executed by the database engine.&lt;/LI&gt;
&lt;LI&gt;no_of_blks_read_from_bufferpool - Out of total read requests, how many blocks were already there in memory or shared_mem.&lt;/LI&gt;
&lt;LI&gt;no_of_rows_scanned &amp;amp; no_of_rows_fetched - Total no. of rows read from the database and the total no. of rows actually needed by application. Higher difference in the two metrics should call for query tuning using better indexes, join strategies etc.&lt;/LI&gt;
&lt;LI&gt;blk_read_time_s &amp;amp; blk_read_write_s - Time taken in seconds, to perform read and write operations.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;no_of_deadlocks - Higher no. of deadlocks should be investigated. Execution of application SQL queries might have to be re-looked if higher deadlocks create performance or application issues.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Index-level Bloat Statistics – Live rows, dead rows, bloat&lt;/H3&gt;
&lt;P&gt;This is similar to query no. 8, but it provides bloating information at index level.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT (index_size/1024/1024) AS idx_size_mb, 
       (index_size/8192) AS index_pages, 
       empty_pages, 
       deleted_pages, 
       ((index_pages - deleted_pages)/index_pages) * 100 AS idx_bloat_percent 
FROM pgstatindex('&amp;lt;idx-name&amp;gt;');&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: The output is similar to table-level bloat statistics, but it is for indexes.&lt;/P&gt;
&lt;H3&gt;Monitor IO activities&lt;/H3&gt;
&lt;P&gt;Output of the following SQL statement shows the overall IO (Input/Output) activities for a database. It can be used to infer whether database workload is read heavy or write heavy. For read workloads, database level bufferpool_hit_ratio metrics can be used to increase or decrease shared memory configuration parameter.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT backend_type , 
       object, 
       context AS reason_for_io, 
       reads AS no_of_reads, 
       (read_bytes/1024) AS read_data_kb, 
       read_time AS read_time_ms, 
       writes AS no_of_writes, 
       (write_bytes/1024) AS write_data_kb, 
       write_time AS write_time_ms, 
       writebacks AS no_of_blocks_to_storage, 
       writeback_time AS block_to_storge_write_time_ms , 
       hits AS no_of_reads_from_bufferpool, 100 * (hits / (hits + reads)) AS bufferpool_hit_ratio 
FROM pg_stat_io;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: The output showcases database level IO metrics.&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;backend_type - Type of database operation that is being performed by the application. E.g. autovacuum, parallel worker, client backend, etc.&lt;/LI&gt;
&lt;LI&gt;reason_for_io - corresponding IO operation. Following are the possible output values to look out for.
&lt;UL&gt;
&lt;LI&gt;normal - Read from or write to shared buffers.&lt;/LI&gt;
&lt;LI&gt;vacuum - IO used by VACUUM operation.&lt;/LI&gt;
&lt;LI&gt;bulkread &amp;amp; bulkwrite - Disk read and write operations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;no_of_reads - Total read operations.&lt;/LI&gt;
&lt;LI&gt;read_data_kb - Amount of data read (in KB) across all operations.&lt;/LI&gt;
&lt;LI&gt;no_of_writes - Total write operations.&lt;/LI&gt;
&lt;LI&gt;write_data_kb - Amount of data written (in KB) across all operations.&lt;/LI&gt;
&lt;LI&gt;read_time_ms &amp;amp; write_time_ms - Duration of all read &amp;amp; write operations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario&lt;/STRONG&gt;: Extending the previous example, application team is complaining about overall performance of the database. As a DBA you want to find out the overall read and write operations to confirm whether it is causing slowness in the database. It will give an idea about how busy the database has been. "Monitor IO Activities" SQL can be used to find out the trigger of higher IO activities in the database. Following is the output:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Analysis:&lt;/STRONG&gt; Output above shows that most of the read and write operations are emanating from applications ("backend_type" = "client backend"). This gives an idea of database usage by the applications.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step: &lt;/STRONG&gt;If resource utilization of this database is high, we can create read replica to offload the reads and increase server memory and CPU to handle the load. Or else, if possible, application throttling can be infused by reducing the no. of max connections or using application level throttling.&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;
&lt;H3&gt;Application-wise IO Activities&lt;/H3&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Query no. 2 above provides database level IO, the following SQL statement can be used to track application level IO summary. As there is to one-to-one mapping between application id in pg_stat_activity and pg_stat_io, backend_type is the only way to relate these two admin views.&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT psa.datname AS dbname, 
       pid, 
       psa.usename AS username, 
       psa.application_name, 
       psa.client_addr as client_ip_addr, 
       psa.xact_start AS transaction_start_time, 
       psa.query_start AS query_start_time, 
       psa.wait_event_type AS db_waitign_on, 
       psa.wait_event AS waiting_activity, 
       CAST(psa.query AS varchar(100)) AS sql_query, 
       state as current_state, 
       psa.backend_type AS db_operation, 
       psi.context AS reason_for_io, 
       psi.reads AS no_of_reads, 
       psi.writes AS no_of_writes 
FROM pg_stat_activity psa JOIN pg_stat_io psi ON psa.backend_type = psi.backend_type
WHERE psa.query LIKE '%&amp;lt;sql-stmt&amp;gt;%';&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;username, application_name and client_ip_addr column output can be used to track user who submitted the query, application from where the query was submitted and IP address of the application server from where query was executed.&lt;/LI&gt;
&lt;LI&gt;transaction_start_time &amp;amp; query_start_time show the execution start time of transaction and currently active query inside of the transaction. These metrics should be used to find the execution time of transaction and queries inside of the transaction.&lt;/LI&gt;
&lt;LI&gt;wait_event and wait_event_type columns output the events on which the query is waiting, if applicable. Refer to the official links for details on &lt;A class="lia-external-url" href="https://www.postgresql.org/docs/current/monitoring-stats.html#WAIT-EVENT-TABLE" target="_blank" rel="noopener"&gt;wait events&lt;/A&gt; and &lt;A class="lia-external-url" href="https://www.postgresql.org/docs/current/monitoring-stats.html#WAIT-EVENT-ACTIVITY-TABLE" target="_blank" rel="noopener"&gt;wait event types&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;reason_for_io column outputs corresponding IO operation. Following are the possible output values to look out for.
&lt;UL&gt;
&lt;LI&gt;normal - Read from or write to shared buffers.&lt;/LI&gt;
&lt;LI&gt;vacuum - IO used by VACUUM operation.&lt;/LI&gt;
&lt;LI&gt;bulkread &amp;amp; bulkwrite - Disk read and write operations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;no_of_reads &amp;amp; no_of_writes - Total no. of read and write operations by the query.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario&lt;/STRONG&gt;: So far we have been looking at database-level activities. In most of the cases, we need to track application level activities like read, write operations, application elapsed time (how long the query is getting executed for). These are some of the critical information that DBA should use while troubleshooting query performance or application slowness issue. Whereas pg_stat_statements should be the go to place to look at SQL or application-level statistics, above SQL statement can be used to monitor application level IO operations.&lt;/P&gt;
&lt;P&gt;Executed SQL statement :&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT
    c.cust_id, 
    c.cust_email, 
    c.cust_type, 
    o.order_no, 
    o.order_date 
FROM customer c, orders o 
WHERE c.cust_id = o.cust_id 
ORDER BY o.order_date DESC;&lt;/LI-CODE&gt;
&lt;P&gt;Output of the query can be filtered using partial SQL statement in the WHERE clause or using PID of the SQL statement as shown below.&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Following is the output of the query above (showing only relevant columns):&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Analysis: &lt;/STRONG&gt;Highlighted output above shows 3 types of IO operations - normal, bulkwrite and bulkread. "normal" means that client is reading from buffer, but "bulkread" and "bulwrite" indicates read from disk and write to disk (temporary file write for sorting!).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step:&amp;nbsp;&lt;/STRONG&gt;SQL statement should to be analysed further for index usage, high disk read and write IO. EXPLAIN (with ANALYZE) statement can be used to understand query behaviour. Other monitoring SQL statements should be used to dig deeper into the execution details.&amp;nbsp;&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;
&lt;H3&gt;Table &amp;amp; Index Operations&lt;/H3&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The following SQL statement can be used to capture table-level DML operations and its corresponding index read operations. Output of this query can be used to create index if sequential scans on a table is high, also, how an application is impacting the table rows using INSERT, UPDATE, DELETE statements.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT t.schemaname AS tabschema, 
       t.relname AS tabname, 
       t.seq_scan AS no_of_seq_scan, 
       t.seq_tup_read AS seq_scan_rows_read, 
       t.n_tup_ins AS rows_inserted, 
       t.n_tup_upd AS rows_updated, 
       t.n_tup_del AS rows_deleted, 
       t.n_live_tup AS total_active_rows, 
       t.n_dead_tup AS total_dead_rows, 
       i.schemaname AS idxschema, 
       i.indexrelname AS idxname, 
       i.idx_tup_read AS idx_rows_read, 
       i.idx_tup_fetch AS idx_rows_fetched 
FROM pg_stat_all_tables t JOIN pg_stat_all_indexes i 
ON t.relid = i.relid AND t.relname = i.relname ;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: It is almost similar to database activity monitoring except for the following columns.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;total_dead_rows - Total no. of rows that are not relevant for any transaction in PostgreSQL.&lt;/LI&gt;
&lt;LI&gt;total_active_rows - Total no. of actual rows in the table.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If the ratio of dead rows vs active rows is higher, it shows VACUUM is not working properly. It can be fixed by running manual vacuum or changing the configuration of AUTOVACUUM.&lt;/P&gt;
&lt;H3&gt;Table level Read IO&lt;/H3&gt;
&lt;P&gt;This SQL statement provides critical metrics on read operations for all or individual tables. heap_blks_read and heap_blks_hit should be used to find out the disk read vs memory read in tables. Higher disk read indicates memory crunch and can be a factor in deciding whether to increase shared memory size.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT schemaname AS tabschema, 
       relname AS tabname, 
       heap_blks_read AS no_of_tab_blks_read, 
       heap_blks_hit AS no_of_buffer_blks_read, 
       idx_blks_read AS no_of_idx_blks_read, 
       idx_blks_hit AS no_of_buffer_idx_blks_read 
FROM pg_statio_all_tables 
WHERE relname = '&amp;lt;table-name&amp;gt;';&lt;/LI-CODE&gt;
&lt;H3&gt;Lock Information&lt;/H3&gt;
&lt;P&gt;Data modification by applications or system commands locks rows and tables. Other application trying to modify the same row will get into waiting state thereby increasing the response time. Following SQL statement can be used to find out what type of locks is being held by applications on all or specific tables.&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT db.datname AS dbname, 
       tbl.relname AS tblname, 
       lck.pid, lck.locktype , 
       mode AS lock_mode, 
       CASE lck.granted 
          WHEN True THEN 'lock_held' 
          WHEN False THEN 'lock_waiting' 
          ELSE 'not_known' 
       END AS lock_status, 
       lck.waitstart AS lock_wait_start_time 
FROM pg_database db JOIN pg_locks lck ON lck.database = db.oid 
JOIN pg_class tbl ON lck.relation = tbl.oid 
WHERE tbl.relname NOT LIKE '%pg_%' 
AND tbl.relname = '&amp;lt;tablename&amp;gt;';&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: Output rows contain database name, table name, process id of the query and the following fields.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;locktype - Object of the lock. E.g. table, page, row (tuple) etc.&lt;/LI&gt;
&lt;LI&gt;lock_status - Whether the lock has been granted to this application or application is waiting for lock.&lt;/LI&gt;
&lt;LI&gt;lock_wait_start_time - If lock waiting state, then when the wait was started.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario:&lt;/STRONG&gt; Following SQL statement takes a lock on "orders" table as it is getting executed inside of a transaction which has not been either committed or rolled back. "Lock Information" SQL can be used to find out who is holding lock on a table as shown below:&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step:&lt;/STRONG&gt;&amp;nbsp;If lock needs to be released then the application with pid 15505 must be terminated using pg_terminate_backend(15505).&lt;/P&gt;
&lt;OL start="12"&gt;
&lt;LI&gt;
&lt;H3&gt;Who is Holding and who is Waiting for Locks&lt;/H3&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;If locks are being held long enough to block a critical application, it becomes imperative to terminate the application holding the lock. Following SQL statement provides information about applications waiting for locks and applications holding those locks so that necessary actions can be taken by DBA.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;WITH lock_holder AS 
(SELECT db.datname AS dbname, 
        tbl.relname AS tblname, 
        pid, 
        locktype , 
        mode AS lock_mode 
 FROM pg_database db JOIN pg_locks lck ON lck.database = db.oid 
 JOIN pg_class tbl ON lck.relation = tbl.oid 
 WHERE granted = true), 
lock_waiter AS 
(SELECT db.datname AS dbname, 
        tbl.relname AS tblname, 
        pid, 
        locktype , 
        mode AS lock_mode 
 FROM pg_database db JOIN pg_locks lck ON lck.database = db.oid 
 JOIN pg_class tbl ON lck.relation = tbl.oid) 
SELECT lh.pid AS pid_holding, 
       lh.locktype AS holding_lock_type, 
       lh.lock_mode AS holding_lock_mode, 
       lh.tblname AS holding_lock_table, 
       lw.pid AS pid_waiting, 
       lw.locktype AS waiting_lock_type, 
       lw.lock_mode AS waiting_lock_mode, 
       lw.tblname AS waiting_lock_table 
FROM lock_holder lh JOIN lock_waiter lw ON lh.tblname = lw.tblname 
WHERE lw.tblname='&amp;lt;tbl-name&amp;gt;';&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Interpreting output&lt;/STRONG&gt;: This is an extension of query 11 above. Following are the output columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;pid_holding - Application that is holding lock.&lt;/LI&gt;
&lt;LI&gt;holding_lock_type - Object (table, page, row) that has been locked.&lt;/LI&gt;
&lt;LI&gt;holding_lock_mode - Lock mode that is being held.&lt;/LI&gt;
&lt;LI&gt;holding_lock_table - Table that is being locked.&lt;/LI&gt;
&lt;LI&gt;pid_waiting - Application that is waiting for lock.&lt;/LI&gt;
&lt;LI&gt;waiting_lock_type - Object (table, page, row) that is waiting for lock.&lt;/LI&gt;
&lt;LI&gt;waiting_lock_mode - Lock mode that is needed.&lt;/LI&gt;
&lt;LI&gt;waiting_lock_table - Lock on table that is waiting.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example Scenario:&lt;/STRONG&gt; There can be scenarios where multiple applications can take write lock on the same rows at the same time. Depending on lock_timeout, one of the applications has to wait for that duration. Criticality of an application might dictate the terms of waiting on locks and DBAs have to terminate application holding the lock. Following is an application that is updating rows in a transaction, but has not released the lock.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;And following application has timed out because of lock wait.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Next Step:&amp;nbsp;&lt;/STRONG&gt;Using above query we can find out which application is waiting and who is holding lock on a table as shown below. Depending on priority one of the applications can be terminated by DBA.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;Diagnostic Flow:&lt;/H2&gt;
&lt;P&gt;The following chart can be used to decide which admin view to use and when. It also shows how Azure Monitor and PostgreSQL admin views work in tandem at any analysis scenarios.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;Summary:&lt;/H2&gt;
&lt;P&gt;PostgreSQL provides helpful administrative views that can be used by DBAs (Database Administrators) to perform initial level of analysis at engine side before looking at any infrastructure level issues. The initial analysis can be useful in relating infrastructure issues with database performance as well, if there is any.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 20 May 2026 14:14:33 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/native-database-query-monitoring-with-azure-database-for/ba-p/4503346</guid>
      <dc:creator>soudey</dc:creator>
      <dc:date>2026-05-20T14:14:33Z</dc:date>
    </item>
    <item>
      <title>Ultimate Guide to POSETTE: An Event for Postgres, 2026 edition</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/ultimate-guide-to-posette-an-event-for-postgres-2026-edition/ba-p/4520246</link>
      <description>&lt;P style="margin-bottom: 1.5em;"&gt;&lt;A href="https://posetteconf.com/2026/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/"&gt;POSETTE: An Event for Postgres 2026&lt;/A&gt; is back for its 5th year: free, virtual, and unapologetically all about Postgres. No travel budget required and no jet lag involved. Just your laptop, a decent internet connection, and curiosity.&lt;/P&gt;
&lt;P&gt;This year the &lt;A href="https://posetteconf.com/2026/schedule/" target="_blank" rel="noopener"&gt;POSETTE 2026 schedule&lt;/A&gt; has 4 livestreams (16-18 June) with 44 talks at ~25 minutes each—covering everything from query performance and partitioning to Postgres 19 features, extensions, and use cases. Which is awesome but also a bit of work to figure out which talks are for you. Hence this ultimate guide post. Every talk will land on YouTube afterward (un-gated, of course) so if you miss anything you care about, you can watch it later.&lt;/P&gt;
&lt;P&gt;But if you can catch a livestream in June, do it. That’s when the “virtual hallway track” happens on Discord—where you can ask the &lt;A href="https://posetteconf.com/2026/speakers/" target="_blank" rel="noopener"&gt;POSETTE speakers&lt;/A&gt; questions and compare notes with other attendees. Meeting other attendees who have the same weird Postgres problems you do can be reassuring somehow. And yes, there will be swag.&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;This guide is your cheat sheet: I’ve categorized and tagged all 44 talks so you don’t have to read 44 abstracts back-to-back. In this post you'll get:&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-by-the-numbers" target="_blank" rel="noopener" data-href="#by-the-numbers" data-lia-auto-title="A “by the numbers” summary" data-lia-auto-title-active="0"&gt;“By the numbers” summary&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-map" target="_blank" rel="noopener" data-lia-auto-title="Map of the 44 talks" data-lia-auto-title-active="0"&gt;Map of the 44 talks&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-keynotes" target="_blank" rel="noopener" data-href="#keynotes" data-lia-auto-title="2 Keynote sessions" data-lia-auto-title-active="0"&gt;2 Keynote sessions&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-postgres-core" target="_blank" rel="noopener" data-href="#postgres-core" data-lia-auto-title="23 Postgres core talks" data-lia-auto-title-active="0"&gt;23 Postgres core talks&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-postgres-ecosystem" target="_blank" rel="noopener" data-href="#postgres-ecosystem" data-lia-auto-title="11 Postgres ecosystem talks" data-lia-auto-title-active="0"&gt;11 Postgres ecosystem talks&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-azure" target="_blank" rel="noopener" data-href="#azure" data-lia-auto-title="8 Azure Database talks" data-lia-auto-title-active="0"&gt;8 Azure Database talks&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-discord" target="_blank" rel="noopener" data-href="#discord" data-lia-auto-title="Why participate on the virtual hallway track on Discord" data-lia-auto-title-active="0"&gt;Why participate on the virtual hallway track on Discord&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-speakers" target="_blank" rel="noopener" data-href="#speakers" data-lia-auto-title="A big thank you to our amazing speakers" data-lia-auto-title-active="0"&gt;A big thank you to our amazing speakers&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-join-us" target="_blank" rel="noopener" data-href="#join-us" data-lia-auto-title="Join us for POSETTE 2026 &amp;amp; mark your calendars" data-lia-auto-title-active="0"&gt;Join us for POSETTE 2026 &amp;amp; mark your calendars&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-internal-link" href="#community--1-trailer" target="_blank" rel="noopener" data-href="#trailer" data-lia-auto-title="Official POSETTE 2026 Trailer" data-lia-auto-title-active="0"&gt;Official POSETTE 2026 Trailer&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-by-the-numbers" class="lia-anchor"&gt;&lt;/a&gt;“By the numbers” summary for POSETTE 2026&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;Here’s a quick snapshot of what you need to know about POSETTE this year:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 83.2361%; height: 858.8px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 32.6871%" /&gt;&lt;col style="width: 67.2138%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;3 days&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;16-18 June 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 58.8px;"&gt;&lt;td class="lia-align-right" style="height: 58.8px;"&gt;&lt;STRONG&gt;4 livestreams&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 58.8px;"&gt;In Americas &amp;amp; EMEA time zones&lt;BR /&gt;but of course you can watch from anywhere&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;44 talks&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;All free, all virtual&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 82.8px;"&gt;&lt;td class="lia-align-right" style="height: 82.8px;"&gt;&lt;STRONG&gt;2 invited keynotes&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 82.8px;"&gt;Driving Postgres forward at Microsoft (Livestream 1), and&amp;nbsp;Postgres 19 Hackers Panel: What’s In, What’s Out, &amp;amp; What’s Next (Livestream 2)&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;25 minutes&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;&amp;nbsp;Average length per talk&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;~1100 minutes&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;Total minutes in POSETTE 2026 talks&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 82.8px;"&gt;&lt;td class="lia-align-right" style="height: 82.8px;"&gt;&lt;STRONG&gt;50 speakers&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 82.8px;"&gt;POSETTE 2026 speakers include PostgreSQL hackers and contributors, users, application developers, PG community members, Azure engineers, &amp;amp; Azure customers&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 82.8px;"&gt;&lt;td class="lia-align-right" style="height: 82.8px;"&gt;&lt;STRONG&gt;6 keynote speakers&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 82.8px;"&gt;Affan Dar &amp;amp; Charles Feddersen (Livestream 1); and&amp;nbsp;Álvaro Herrera, Heikki Linnakangas, Melanie Plageman, &amp;amp; Thomas Munro (Livestream 2)&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;19 countries&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;Speakers reside in 19 different countries&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td class="lia-align-right" style="height: 34.8px;"&gt;&lt;STRONG&gt;23 companies&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 34.8px;"&gt;&amp;nbsp;Speakers hail from 23 different companies&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td class="lia-align-right" style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;17.6% CFP acceptance rate&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;&amp;nbsp;42 talks selected from 238 submisssions&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 58.8px;"&gt;&lt;td class="lia-align-right" style="height: 58.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;75% general Postgres talks&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 58.8px;"&gt;33 talks are not cloud-specific at all, they’re about the Postgres technology &amp;amp; ecosystem&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 58.8px;"&gt;&lt;td class="lia-align-right" style="height: 58.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;25% Azure-related talks&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 58.8px;"&gt;11 of 44 talks feature Azure Database for PostgreSQL or Azure HorizonDB&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 58.8px;"&gt;&lt;td class="lia-align-right" style="height: 58.8px;"&gt;&lt;STRONG&gt;1 organizing company&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 58.8px;"&gt;Organized by the Postgres team at Microsoft, in partnership with AMD&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 92.8px;"&gt;&lt;td class="lia-align-right" style="height: 92.8px;"&gt;&lt;STRONG&gt;17 languages&amp;nbsp;&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 92.8px;"&gt;Published talk videos will have captions available in 17 languages, including English, Czech, Dutch, French, German, Hindi, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Turkish, Ukrainian, and Chinese Simplified &amp;amp; Chinese Traditional&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;H2 class="lia-linked-item" style="margin-bottom: 1.5em;"&gt;&lt;a id="community--1-map" class="lia-anchor"&gt;&lt;/a&gt;Map of the 44 talks&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;To help you quickly navigate all 44 talks, here’s a map of the high-level categories and detailed topics.&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure 1&lt;/STRONG&gt;: A map of the POSETTE 2026 talks—high-level categories and detailed tags to help you find what you care about&lt;/img&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-keynotes" class="lia-anchor"&gt;&lt;/a&gt;2 Keynote sessions&lt;/H2&gt;
&lt;P&gt;Affan Dar and Charles Feddersen lead the PostgreSQL engineering and product teams at Microsoft, In this keynote, they’ll walk through how Microsoft is contributing to Postgres, both upstream in the open source project and in the cloud database service they build on top of it.&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/driving-postgres-forward-at-microsoft/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/driving-postgres-forward-at-microsoft/"&gt;Driving Postgres forward at Microsoft&lt;/A&gt;, by Affan Dar &amp;amp; Charles Feddersen &lt;SMALL style="color: #767676;"&gt;(Azure Database for PostgreSQL, Azure HorizonDB, VS Code, Dev tools, community, Postgres hacking, open source, PosetteConf, livestream-1)&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Want to understand how Postgres features get decided? This keynote panel with 4 PostgreSQL committers &amp;amp; hackers will peel back the curtain. You’ll hear what made it into Postgres 19, what didn’t (and why), and get a sneak peek into a few of the things in the oven for Postgres 20.&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgres-19-hackers-panel-what-s-in-what-s-out-what-s-next/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgres-19-hackers-panel-what-s-in-what-s-out-what-s-next/"&gt;Postgres 19 Hackers Panel: What’s In, What’s Out, &amp;amp; What’s Next&lt;/A&gt;, by Álvaro Herrera, Heikki Linnakangas, Melanie Plageman, &amp;amp; Thomas Munro &lt;SMALL style="color: #767676;"&gt;(Postgres 19, Postgres hacking, panel, open source, collaboration, multithreading, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-postgres-core" class="lia-anchor"&gt;&lt;/a&gt;23 Postgres core talks&lt;/H2&gt;
&lt;H3&gt;Data Modeling&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/json-in-postgresql-evil-data-type-or-just-needs-to-be-tamed/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/json-in-postgresql-evil-data-type-or-just-needs-to-be-tamed/"&gt;JSON in PostgreSQL - evil data type or just needs to be tamed?&lt;/A&gt;, by Boriss Mejias &lt;SMALL style="color: #767676;"&gt;(JSON, performance, data modeling, livestream-1)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-design-patterns/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-design-patterns/"&gt;PostgreSQL Design Patterns&lt;/A&gt;, by Chris Ellis &lt;SMALL style="color: #767676;"&gt;(data modeling, SQL, PG use cases, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Graph Data&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/exploring-property-graphs-with-sql-pgq-in-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/exploring-property-graphs-with-sql-pgq-in-postgresql/"&gt;Exploring property graphs with SQL/PGQ in PostgreSQL&lt;/A&gt;, by Ashutosh Bapat &lt;SMALL style="color: #767676;"&gt;(SQL/PGQ, graph data, data modeling, Postgres 19, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;LISTEN/NOTIFY&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/listen-carefully-how-notify-can-trip-up-your-database/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/listen-carefully-how-notify-can-trip-up-your-database/"&gt;LISTEN Carefully: How NOTIFY Can Trip Up Your Database&lt;/A&gt;, by Jimmy Angelakos &lt;SMALL style="color: #767676;"&gt;(LISTEN/NOTIFY, PG use cases, triggers, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Performance&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/maintaining-large-tables-in-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/maintaining-large-tables-in-postgresql/"&gt;Maintaining Large Tables in PostgreSQL&lt;/A&gt;, by Sarat Balijepalli &lt;SMALL style="color: #767676;"&gt;(WAL, performance, scaling Postgres, vacuum, autovacuum, statistics, partitioning, monitoring, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/my-postgres-partitioning-cookbook/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/my-postgres-partitioning-cookbook/"&gt;My Postgres partitioning cookbook&lt;/A&gt;, by Derk van Veen &lt;SMALL style="color: #767676;"&gt;(partitioning, PG use cases, data modeling, performance, livestream-4)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-17-vs-18-side-by-side-performance-wins-in-real-world-queries/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-17-vs-18-side-by-side-performance-wins-in-real-world-queries/"&gt;PostgreSQL 17 vs 18: Side‑by‑Side Performance Wins in Real‑World Queries&lt;/A&gt;, by Divya Bhargov &lt;SMALL style="color: #767676;"&gt;(performance, PG use cases, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/vacuuming-enhancements-in-postgresql-18-faster-smarter-more-predictable/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/vacuuming-enhancements-in-postgresql-18-faster-smarter-more-predictable/"&gt;Vacuuming Enhancements in PostgreSQL 18: Faster, Smarter, More Predictable&lt;/A&gt;, by Shashikant Shakya &lt;SMALL style="color: #767676;"&gt;(vacuum, async IO, monitoring, performance, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;PG Internals&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/linux-and-postgresql-in-the-multiverse-of-connections/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/linux-and-postgresql-in-the-multiverse-of-connections/"&gt;Linux and PostgreSQL in the Multiverse of Connections&lt;/A&gt;, by Josef Machytka &lt;SMALL style="color: #767676;"&gt;(Linux, PG internals, connection pooling, livestream-2)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/pg_stats-how-postgres-internal-stats-work/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/pg_stats-how-postgres-internal-stats-work/"&gt;pg_stats: How Postgres Internal Stats Work&lt;/A&gt;, by Richard Yen &lt;SMALL style="color: #767676;"&gt;(statistics, pg_stats, PG internals, query planner, livestream-2)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgres-isn-t-slow-your-storage-is/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgres-isn-t-slow-your-storage-is/"&gt;Postgres isn’t slow, your storage is&lt;/A&gt;, by Sai Srirampur &lt;SMALL style="color: #767676;"&gt;(storage, IO, performance, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-queues-done-right-with-pgq/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-queues-done-right-with-pgq/"&gt;PostgreSQL queues done right with PgQ&lt;/A&gt;, by Alexander Kukushkin &lt;SMALL style="color: #767676;"&gt;(queues, PG internals, extensions, livestream-2)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/random_page_cost-in-postgres-why-the-default-is-4-0-and-should-you-lower-it/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/random_page_cost-in-postgres-why-the-default-is-4-0-and-should-you-lower-it/"&gt;random_page_cost in Postgres - why the default is 4.0 and should you lower it?&lt;/A&gt;, by Tomas Vondra &lt;SMALL style="color: #767676;"&gt;(PG internals, IO, performance, livestream-1)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/the-wonderful-world-of-wal/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/the-wonderful-world-of-wal/"&gt;The Wonderful World of WAL&lt;/A&gt;, by Bruce Momjian &lt;SMALL style="color: #767676;"&gt;(WAL, PG internals, replication, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/what-s-new-with-constraints-in-postgres-18/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/what-s-new-with-constraints-in-postgres-18/"&gt;What's new with constraints in Postgres 18&lt;/A&gt;, by Gülçin Yıldırım Jelínek &lt;SMALL style="color: #767676;"&gt;(constraints, data modeling, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Postgres Hacking&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/fuzzing-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/fuzzing-postgresql/"&gt;Fuzzing PostgreSQL&lt;/A&gt;, by Adam Wolk &lt;SMALL style="color: #767676;"&gt;(PG internals, testing, Dev tools, libpq, security, livestream-1)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/journey-of-developing-a-performance-optimization-feature-in-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/journey-of-developing-a-performance-optimization-feature-in-postgresql/"&gt;Journey of developing a performance optimization feature in PostgreSQL&lt;/A&gt;, by Rahila Syed &lt;SMALL style="color: #767676;"&gt;(Postgres hacking, PG internals, performance, WAL, replication, livestream-4)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/the-hitchhiker-s-guide-to-postgresql-hacking-don-t-panic-just-start-small/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/the-hitchhiker-s-guide-to-postgresql-hacking-don-t-panic-just-start-small/"&gt;The Hitchhiker’s Guide to PostgreSQL Hacking: Don’t Panic, Just Start Small&lt;/A&gt;, by Xuneng Zhou &lt;SMALL style="color: #767676;"&gt;(Postgres hacking, PG internals, community, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Replication&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/past-present-and-future-logical-decoding-and-replication-in-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/past-present-and-future-logical-decoding-and-replication-in-postgresql/"&gt;Past, Present, and Future: Logical Decoding and Replication in PostgreSQL&lt;/A&gt;, by Hari Kiran &lt;SMALL style="color: #767676;"&gt;(replication, logical decoding, PG internals, livestream-4)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/where-does-my-insert-go-a-logical-replication-story/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/where-does-my-insert-go-a-logical-replication-story/"&gt;Where Does My INSERT Go? A Logical Replication Story&lt;/A&gt;, by Hamid Akhtar &lt;SMALL style="color: #767676;"&gt;(replication, PG internals, WAL, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Security&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/from-dev-to-prod-securing-postgres-the-right-way/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/from-dev-to-prod-securing-postgres-the-right-way/"&gt;From Dev to Prod: Securing Postgres the Right Way&lt;/A&gt;, by Sakshi Nasha &lt;SMALL style="color: #767676;"&gt;(security, roles, PG use cases, extensions, monitoring, livestream-4)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/from-trust-to-tokens-a-short-history-of-postgresql-authentication/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/from-trust-to-tokens-a-short-history-of-postgresql-authentication/"&gt;From trust to Tokens: A Short History of PostgreSQL Authentication&lt;/A&gt;, by Murat Tuncer &lt;SMALL style="color: #767676;"&gt;(authentication, security, livestream-2)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-vs-sql-server-security-model-differences/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-vs-sql-server-security-model-differences/"&gt;PostgreSQL vs. SQL Server: Security Model Differences&lt;/A&gt;, by Taiob Ali &lt;SMALL style="color: #767676;"&gt;(security, authentication, SQL Server, roles, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-postgres-ecosystem" class="lia-anchor"&gt;&lt;/a&gt;11 Postgres ecosystem talks&lt;/H2&gt;
&lt;H3&gt;Analytics&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/pg_lake-postgres-as-a-lakehouse/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/pg_lake-postgres-as-a-lakehouse/"&gt;pg_lake: Postgres as a lakehouse&lt;/A&gt;, by Marco Slot &lt;SMALL style="color: #767676;"&gt;(pg_lake, extensions, OLAP, data warehouse, Iceberg, DuckDB, analytics, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Apache AGE&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/querying-visualizing-graphs-in-postgres-with-apache-age/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/querying-visualizing-graphs-in-postgres-with-apache-age/"&gt;Querying &amp;amp; Visualizing Graphs in Postgres with Apache AGE&lt;/A&gt;, by Christian Miles &lt;SMALL style="color: #767676;"&gt;(Apache AGE, graph data, data visualization, SQL/PGQ, Azure HorizonDB, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Autotuning&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/building-safety-tooling-for-risk-free-ai-tuning-of-postgres-fast-cars-need-fast-brakes/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/building-safety-tooling-for-risk-free-ai-tuning-of-postgres-fast-cars-need-fast-brakes/"&gt;Building safety tooling for risk-free AI tuning of Postgres: Fast cars need fast brakes&lt;/A&gt;, by Mohsin Ejaz &lt;SMALL style="color: #767676;"&gt;(autotuning, AI, performance, monitoring, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Change Data Capture&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/building-event-driven-systems-with-postgresql-logical-replication-and-drasi/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/building-event-driven-systems-with-postgresql-logical-replication-and-drasi/"&gt;Building Event-Driven Systems with PostgreSQL Logical Replication and Drasi&lt;/A&gt;, by Diaa Radwan &lt;SMALL style="color: #767676;"&gt;(Drasi, replication, WAL, CDC, livestream-3)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Citus&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/move-less-move-faster-speeding-up-citus-cluster-scaling/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/move-less-move-faster-speeding-up-citus-cluster-scaling/"&gt;Move Less, Move Faster: Speeding Up Citus Cluster Scaling&lt;/A&gt;, by Muhammad Usama &lt;SMALL style="color: #767676;"&gt;(Citus, extensions, performance, scaling Postgres, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Dev Tools&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/an-mcp-for-your-postgres-db/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/an-mcp-for-your-postgres-db/"&gt;An MCP for your Postgres DB&lt;/A&gt;, by Pamela Fox &lt;SMALL style="color: #767676;"&gt;(MCP, AI, Python, Dev tools, livestream-1)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/pgcov-bringing-real-test-coverage-to-postgresql-code/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/pgcov-bringing-real-test-coverage-to-postgresql-code/"&gt;pgcov: Bringing Real Test Coverage to PostgreSQL Code&lt;/A&gt;, by Pavlo Golub &lt;SMALL style="color: #767676;"&gt;(testing, Postgres hacking, Dev tools, extensions, CI/CD, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-tooling-across-ai-editors-and-agents/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-tooling-across-ai-editors-and-agents/"&gt;PostgreSQL Tooling Across AI Editors and Agents&lt;/A&gt;, by Matt McFarland &lt;SMALL style="color: #767676;"&gt;(Dev tools, VS Code, Cursor, AI, data visualization, Apache AGE, graph data, Azure, MCP, Copilot, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Django&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/postgresql-generated-columns-by-example/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/postgresql-generated-columns-by-example/"&gt;PostgreSQL Generated Columns by Example&lt;/A&gt;, by Paolo Melchiorre &lt;SMALL style="color: #767676;"&gt;(app dev, Django, generated columns, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Kubernetes&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/quorum-based-consistency-for-cluster-changes-with-cloudnativepg-operator/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/quorum-based-consistency-for-cluster-changes-with-cloudnativepg-operator/"&gt;Quorum-Based Consistency for Cluster Changes with CloudNativePG Operator&lt;/A&gt;, by Jeremy Schneider &amp;amp; Leonardo Cecchi &lt;SMALL style="color: #767676;"&gt;(CloudNativePG, Kubernetes, PG use cases, livestream-3)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Performance&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/modelling-postgres-performance-degradation-on-burstable-cloud-instances/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/modelling-postgres-performance-degradation-on-burstable-cloud-instances/"&gt;Modelling Postgres Performance Degradation on Burstable Cloud Instances&lt;/A&gt;, by Chun Lin Goh &lt;SMALL style="color: #767676;"&gt;(performance, burstable, compute, QA, livestream-4)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-azure" class="lia-anchor"&gt;&lt;/a&gt;8 Azure Database for PostgreSQL &amp;amp; Azure HorizonDB talks&lt;/H2&gt;
&lt;H3&gt;AI-related talks&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/from-queries-to-agents-the-next-era-of-data-retrieval-on-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/from-queries-to-agents-the-next-era-of-data-retrieval-on-postgresql/"&gt;From Queries to Agents: The Next Era of Data Retrieval on PostgreSQL&lt;/A&gt;, by Abe Omorogbe &lt;SMALL style="color: #767676;"&gt;(AI, MCP, Azure Database for PostgreSQL, graph data, Apache AGE, Azure HorizonDB, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/production-rag-at-scale-with-azure-database-for-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/production-rag-at-scale-with-azure-database-for-postgresql/"&gt;Production RAG at Scale with Azure Database for PostgreSQL&lt;/A&gt;, by Julia Schröder Langhaeuser &amp;amp; Paula Santamaría &lt;SMALL style="color: #767676;"&gt;(Azure Database for PostgreSQL, AI, RAG, PG use cases, livestream-3)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;AMD&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/choose-the-right-azure-infrastructure-to-improve-postgres-performance-by-over-60/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/choose-the-right-azure-infrastructure-to-improve-postgres-performance-by-over-60/"&gt;Choose the Right Azure Infrastructure to Improve Postgres Performance by Over 60%&lt;/A&gt;, by Andrew Ruffin &lt;SMALL style="color: #767676;"&gt;(AMD, performance, Azure, compute, Azure Database for PostgreSQL, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Azure HorizonDB&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/why-we-built-azure-horizondb-for-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/why-we-built-azure-horizondb-for-postgresql/"&gt;Why we built Azure HorizonDB for PostgreSQL&lt;/A&gt;, by Dingding Lu &lt;SMALL style="color: #767676;"&gt;(Azure HorizonDB, scaling Postgres, livestream-3)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Flexible Server&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/pg_duckdb-in-action-accelerating-analytics-on-azure-database-for-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/pg_duckdb-in-action-accelerating-analytics-on-azure-database-for-postgresql/"&gt;pg_duckdb in Action: Accelerating Analytics on Azure Database for PostgreSQL&lt;/A&gt;, by Nitin Jadhav &lt;SMALL style="color: #767676;"&gt;(DuckDB, Azure Database for PostgreSQL, extensions, OLAP, analytics, performance, livestream-4)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/the-rise-of-postgresql-as-the-everything-database/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/the-rise-of-postgresql-as-the-everything-database/"&gt;The Rise of PostgreSQL as the Everything Database&lt;/A&gt;, by Varun Dhawan &lt;SMALL style="color: #767676;"&gt;(Postgres history, extensions, graph data, Apache AGE, Azure Database for PostgreSQL, DuckDB, Citus, livestream-3)&lt;BR /&gt;&lt;BR /&gt;&lt;/SMALL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/what-i-ve-learned-teaching-postgres-to-200-field-engineers-at-microsoft/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/what-i-ve-learned-teaching-postgres-to-200-field-engineers-at-microsoft/"&gt;What I’ve Learned Teaching Postgres to 200+ field engineers at Microsoft&lt;/A&gt;, by Paula Berenguel &lt;SMALL style="color: #767676;"&gt;(training, Azure, Postgres skilling, livestream-1)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Oracle to Postgres&lt;/H3&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;A href="https://posetteconf.com/2026/talks/migrating-vldbs-from-oracle-to-azure-database-for-postgresql/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/talks/migrating-vldbs-from-oracle-to-azure-database-for-postgresql/"&gt;Migrating VLDBs from Oracle to Azure Database for PostgreSQL&lt;/A&gt;, by Adithya Kumaranchath &lt;SMALL style="color: #767676;"&gt;(migration, Azure Database for PostgreSQL, Oracle to Postgres, livestream-2)&lt;/SMALL&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-discord" class="lia-anchor"&gt;&lt;/a&gt;Why participate in the virtual hallway track on Discord&lt;/H2&gt;
&lt;P&gt;If you’ve checked out the schedule and plan to watch some of the talks, you might still be wondering: why join live—and why bother with the virtual hallway track on Discord?&lt;BR /&gt;&lt;BR /&gt;Here’s how a few of last year’s attendees described the experience:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;“Very impressed by all the speakers and content I am absolutely shattered as there was so much great content in all the talks over the past 3 days but I have probably learnt more in these sessions than I could have in months of reading up.”&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;“Want to let y’all know how much I got from this onine conference, the speakers were excellent, well-prepared and well-presented. The hosts were informative, engaging, &amp;amp; amusing. The discord hallway channel made me feel connected. I learned a lot and found some new inspiration. I’ll be back next year!”&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;“I have no idea how I’m going to summarise all the interesting stuff for coworkers.”&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The common thread: the live, shared experience—being able to ask questions, compare notes, and learn alongside other people in real time.&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;&lt;STRONG&gt;How to join the virtual hallway track&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;Head to the &lt;A href="https://aka.ms/open-source-discord" target="_blank" rel="noopener" data-href="https://aka.ms/open-source-discord"&gt;#posetteconf channel on Discord&lt;/A&gt; (on the Microsoft Open Source Discord)&lt;/LI&gt;
&lt;LI&gt;That’s where speakers and attendees hang out during the livestreams—it’s where you can ask questions, share reactions, and just say hi&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-speakers" class="lia-anchor"&gt;&lt;/a&gt;Big thank you to our amazing speakers&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;Every great event starts with great talks—and great talks start with great speakers. Want to learn more about the people behind these talks?&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;Visit the &lt;A href="https://posetteconf.com/2026/speakers/" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/speakers/"&gt;POSETTE 2026 Speaker page&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Click a speaker’s bio to see their written interview (if available)&lt;/LI&gt;
&lt;LI&gt;If a speaker has been a guest on the &lt;A href="https://talkingpostgres.com/" target="_blank" rel="noopener" data-href="https://talkingpostgres.com/"&gt;Talking Postgres podcast&lt;/A&gt; in the past, then you’ll find a link to their episode there, too&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;Figure 2: Bio pics for all speakers in POSETTE: An Event for Postgres 2026, along with our gratitude&lt;/img&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-join-us" class="lia-anchor"&gt;&lt;/a&gt;Join us for POSETTE 2026! Mark your calendars&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;I hope you join us for POSETTE 2026. Consider yourself officially invited. As part of the talk selection team, I’m definitely biased—but I truly believe these speakers and talks are worth your time. I’ll be hosting&amp;nbsp;&lt;STRONG&gt;Livestream 1&lt;/STRONG&gt; and you’ll find me in the #posetteconf Discord chat. I hope to see you there.&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;And please: &lt;STRONG&gt;tell your Postgres friends&lt;/STRONG&gt;, so they don’t miss out!&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;🗓️ &lt;STRONG&gt;Add the livestreams to your calendar&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;STRONG&gt;Livestream 1&lt;/STRONG&gt;: Tue 16 June, 8am–2pm PDT (UTC-7)&lt;BR /&gt;&lt;A href="https://developer.microsoft.com/reactor/events/26853/" target="_blank" rel="noopener" data-href="https://developer.microsoft.com/reactor/events/26853/"&gt;[ register for updates ]&lt;/A&gt; and/or &lt;A href="https://www.addevent.com/event/Sf26983045" target="_blank" rel="noopener" data-href="https://www.addevent.com/event/Sf26983045"&gt;[ add to calendar ]&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Livestream 2&lt;/STRONG&gt;: Wed 17 June, 8am–2pm CEST (UTC+2)&lt;BR /&gt;&lt;A href="https://developer.microsoft.com/reactor/events/26854/" target="_blank" rel="noopener" data-href="https://developer.microsoft.com/reactor/events/26854/"&gt;[ register for updates ]&lt;/A&gt; and/or &lt;A href="https://www.addevent.com/event/TX26983054" target="_blank" rel="noopener" data-href="https://www.addevent.com/event/TX26983054"&gt;[ add to calendar ]&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Livestream 3&lt;/STRONG&gt;: Wed 17 June, 8am–2pm PDT (UTC-7)&lt;BR /&gt;&lt;A href="https://developer.microsoft.com/reactor/events/26855/" target="_blank" rel="noopener" data-href="https://developer.microsoft.com/reactor/events/26855/"&gt;[ register for updates ]&lt;/A&gt; and/or &lt;A href="https://www.addevent.com/event/yH26983066" target="_blank" rel="noopener" data-href="https://www.addevent.com/event/yH26983066"&gt;[ add to calendar ]&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Livestream 4&lt;/STRONG&gt;: Thu 18 June, 8am–2pm CEST (UTC+2)&lt;BR /&gt;&lt;A href="https://developer.microsoft.com/reactor/events/26856/" target="_blank" rel="noopener" data-href="https://developer.microsoft.com/reactor/events/26856/"&gt;[ register for updates ]&lt;/A&gt; and/or &lt;A href="https://www.addevent.com/event/rd26983070" target="_blank" rel="noopener" data-href="https://www.addevent.com/event/rd26983070"&gt;[ add to calendar ]&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;&lt;STRONG&gt;Watch last year’s POSETTE 2025 talks in advance&lt;/STRONG&gt;: And if you want to get ready, you can watch talks from the &lt;A href="https://aka.ms/posette-playlist-2025" target="_blank" rel="noopener" data-href="https://aka.ms/posette-playlist-2025"&gt;POSETTE 2025 playlist on YouTube&lt;/A&gt; anytime, anywhere. Lots of solid, useful, and evergreen Postgres talks in there.&lt;/P&gt;
&lt;H2 class="lia-linked-item"&gt;&lt;a id="community--1-trailer" class="lia-anchor"&gt;&lt;/a&gt;“Official Trailer” for POSETTE 2026 is on YouTube&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;To help more developers, community members, and Postgres users discover POSETTE 2026, our team created this short video trailer. Take a peek and share it with friends as an invitation of sorts.&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;We’re trying to make sure that people don’t miss their opportunity to be part of the livestreams and ask questions on the discord during the conference (as well as watch the talks on YouTube after the event is over.)&lt;/P&gt;
&lt;UL style="margin-bottom: 1.5em;"&gt;
&lt;LI&gt;&lt;STRONG&gt;Watch and share the trailer&lt;/STRONG&gt;: &lt;A href="https://youtu.be/AX4Axl52uBQ" target="_blank" rel="noopener" data-href="https://youtu.be/AX4Axl52uBQ"&gt;Official Trailer for POSETTE: An Event for Postgres 2026&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;DIV class="lia-embeded-content" contenteditable="false"&gt;&lt;IFRAME src="https://www.youtube-nocookie.com/embed/AX4Axl52uBQ?si=LBj7K4e3rsiAw5_H" width="560" height="315" title="YouTube video player" allowfullscreen="allowfullscreen" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" frameborder="0" sandbox="allow-scripts allow-same-origin allow-forms"&gt;&lt;/IFRAME&gt;&lt;/DIV&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Acknowledgements &amp;amp; Gratitude&lt;/H2&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;I’ve already thanked the 50 amazing speakers above. In addition, thanks go to Silvano Coriani, Cornelia Biacsics, Aaron Wislang, and My Nguyen for reviewing parts of this post before publication.&lt;/P&gt;
&lt;P style="margin-bottom: 1.5em;"&gt;I also want to thank the team at AMD for their partnership and support of POSETTE this year! And of course, big thank you to the &lt;A href="https://posetteconf.com/2026/about/#organizing-team" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/about/#organizing-team"&gt;POSETTE 2026 organizing team&lt;/A&gt; and &lt;A href="https://posetteconf.com/2026/about/#talk-selection-team" target="_blank" rel="noopener" data-href="https://posetteconf.com/2026/about/#talk-selection-team"&gt;POSETTE talk selection team&lt;/A&gt;—without you, there would be no POSETTE!&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure 3: Visual invitation to join the virtual hallway track for POSETTE 2026 on the Microsoft Open Source Discord, so you can chat with the speakers &amp;amp; others in the Postgres community&lt;/P&gt;
&lt;/img&gt;</description>
      <pubDate>Mon, 18 May 2026 08:20:26 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/ultimate-guide-to-posette-an-event-for-postgres-2026-edition/ba-p/4520246</guid>
      <dc:creator>clairegiordano</dc:creator>
      <dc:date>2026-05-18T08:20:26Z</dc:date>
    </item>
    <item>
      <title>April 2026 Recap: Azure Database for PostgreSQL</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/april-2026-recap-azure-database-for-postgresql/ba-p/4519772</link>
      <description>&lt;P&gt;April brought several updates for &lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/" target="_blank" rel="noopener"&gt;Azure Database for PostgreSQL&lt;/A&gt;, focused on improving developer productivity, strengthening security and connectivity, and helping customers scale and optimize their PostgreSQL workloads. From new Entra ID token refresh libraries across .NET, JavaScript, and Python to simplify authentication, to guidance on migrating from VNet to Private Endpoint capable configurations, we continue to make it easier to build and manage secure applications. We also introduced enhancements to the PostgreSQL VS Code extension and published deep dives on query performance, data modeling, and real-world scaling patterns.&lt;/P&gt;
&lt;P&gt;We also published a blog on how &lt;A href="https://opensource.microsoft.com/blog/2026/04/30/postgresql-enters-its-ai-era-run-postgresql-like-a-pro-in-the-era-of-ai-and-rapid-growth/" target="_blank" rel="noopener"&gt;PostgreSQL enters its AI era&lt;/A&gt;, which explores ways with which developers can adapt PostgreSQL to meet the needs of AI-driven and rapidly growing applications, with practical guidance on running and scaling PostgreSQL more effectively in these evolving workloads.&lt;/P&gt;
&lt;H2&gt;POSETTE 2026&lt;/H2&gt;
&lt;P&gt;Before we dive deeper into the feature updates, &lt;A href="https://posetteconf.com/2026/about/" target="_blank" rel="noopener"&gt;POSETTE: An Event for Postgres&amp;nbsp;2026&lt;/A&gt; is just around the corner, PostgreSQL’s free, virtual conference bringing together the global community. Taking place from June 16–18, the event will feature four livestream tracks with a strong lineup of content, including 44 sessions, 2 keynotes, and 50 speakers. It’s a great opportunity to hear from PostgreSQL experts, learn about the latest trends, and discover real-world best practices across a wide range of topics.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/series/s-1645/" target="_blank" rel="noopener"&gt;Register today&lt;/A&gt; for updates and be part of three days of learning, insights, and community-driven discussions across a wide range of PostgreSQL topics.&lt;/P&gt;
&lt;H1&gt;Features&lt;/H1&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-entra" target="_self" rel="noopener"&gt;Entra-ID token refresh libraries for .NET, JavaScript, and Python: Preview&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-vnet" target="_self" rel="noopener"&gt;Migrating from VNet to Private Endpoint: Preview&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-vscode" target="_self" rel="noopener"&gt;New enhancements in the PostgreSQL VS Code Extension&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-blog1" target="_self" rel="noopener"&gt;Improving Query Performance and Modeling in PostgreSQL&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="#community--1-blog2" target="_self" rel="noopener"&gt;Scaling PostgreSQL for Real-World Application Workloads&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Learning Bytes: &lt;A class="lia-internal-link" href="#community--1-prevent" target="_blank" rel="noopener" data-lia-auto-title="Preventing accidental server deletion" data-lia-auto-title-active="0"&gt;Preventing accidental server deletion&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2 id="entra"&gt;Entra-ID Token refresh libraries: .NET, JavaScript and Python&lt;/H2&gt;
&lt;P&gt;We’ve introduced Entra ID token refresh libraries for &lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt;, &lt;A href="https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1#readme-body-tab" target="_blank" rel="noopener"&gt;JavaScript&lt;/A&gt;, and &lt;A href="https://pypi.org/project/azure-postgresql-auth/" target="_blank" rel="noopener"&gt;Python&lt;/A&gt; to simplify how applications authenticate with Azure Database for PostgreSQL using Entra ID. When using Entra ID–based authentication, access tokens are short-lived and need to be refreshed periodically. This often requires additional logic in the application to handle expiration, retries, and reconnection scenarios. These new libraries take care of that complexity by &lt;STRONG&gt;automatically refreshing tokens behind the scenes&lt;/STRONG&gt;, so applications can maintain &lt;STRONG&gt;uninterrupted database connections&lt;/STRONG&gt; without custom token management.&lt;/P&gt;
&lt;P&gt;With built-in support for token renewal, these libraries help:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Reduce the need for manual token refresh logic in your application code&lt;/LI&gt;
&lt;LI&gt;Improve reliability for long-running or connection-pooled workloads&lt;/LI&gt;
&lt;LI&gt;Simplify adoption of Entra ID authentication across different language stacks&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Whether you're building new applications or migrating existing ones to use Entra ID, these libraries make it easier to integrate secure, passwordless authentication while keeping connection handling straightforward.&lt;/P&gt;
&lt;H2 id="vnet"&gt;Migrating from VNet to Private Endpoint&lt;/H2&gt;
&lt;P&gt;Azure Database for PostgreSQL flexible server can now be migrated from a &lt;STRONG&gt;VNet‑integrated&lt;/STRONG&gt; deployment to a network configuration that supports &lt;STRONG&gt;Private Endpoint&lt;/STRONG&gt; connectivity. Servers originally deployed inside a VNet may require greater flexibility in networking management. Private Endpoints provide a simpler and more &lt;STRONG&gt;scalable model&lt;/STRONG&gt;. Following migration, private access to the server continues over Azure’s backbone network, dependency on delegated subnets is reduced, and database networking can be better aligned with evolving architectural or organizational standards.&lt;/P&gt;
&lt;P&gt;The migration can be initiated through &lt;STRONG&gt;Azure CLI, API, or SDK&lt;/STRONG&gt; and is designed to be straightforward. Although the operation involves a period of downtime, it enables adoption of Private Endpoint connectivity without recreating the server or manually moving data. After migration, Private Endpoints or firewall rules can be configured based on the desired access model, and infrastructure-as-code templates can be updated accordingly.&lt;/P&gt;
&lt;P&gt;Read more here: &lt;A href="https://learn.microsoft.com/azure/postgresql/network/how-to-migrate-vnet-private-endpoint-capable-server?tabs=portal-migrate" target="_blank" rel="noopener"&gt;Migrate from VNet to a Private Endpoint Capable Network Configuration | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H2 id="vscode"&gt;New enhancements in the PostgreSQL VS Code Extension&lt;/H2&gt;
&lt;P&gt;The latest release (v1.21) of the PostgreSQL VS Code extension delivers enhancements to query authoring and analysis workflows, improved cross-extension interoperability, reliability improvements across Object Explorer and connection management, and a set of targeted bug fixes.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema-Aware Query Creation:&lt;/STRONG&gt; You can now open a new query directly from a schema in Object Explorer, automatically setting the appropriate search_path so unqualified object names resolve correctly without additional setup.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Query Plan Visualization Enhancements:&lt;/STRONG&gt; The query plan visualizer now uses PostgreSQL-specific node icons across all views, making it easier to identify scan, join, and aggregate operations during performance analysis.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Improved Multi-Extension Compatibility:&lt;/STRONG&gt; The extension now coordinates editor ownership with the MSSQL extension when both are installed, reducing duplicate UI actions and avoiding conflicts in query execution workflows.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Object Explorer Reliability Improvements&lt;/STRONG&gt;: The Object Explorer has been refactored for more consistent refresh, expansion, and reconnection behavior, especially in long-running sessions and databases with many schemas.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enhanced IntelliSense Behavior:&lt;/STRONG&gt; IntelliSense now respects the configured search_path, improving the relevance of suggestions and helping you work more efficiently across schemas.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Bug Fixes:&lt;/STRONG&gt; This release includes fixes across object scripting (including partitioned tables), connection profile handling, Docker container creation, and initial extension setup for improved reliability and stability.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="blog1"&gt;Improving Query Performance and Modeling in PostgreSQL&lt;/H2&gt;
&lt;P&gt;This month, we also shared a set of technical blogs highlighting advanced PostgreSQL scenarios and practical guidance for real-world workloads:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Guide on workload observability with Query store&lt;/STRONG&gt;:&amp;nbsp;This &lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/end-to-end-workload-observability-with-query-store-for-primary-and-replicas/4517110" target="_blank" rel="noopener"&gt;blog&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; dives into how Query Store can be used to gain end-to-end visibility into query performance across both primary and replica nodes. It highlights the importance of understanding query behavior in distributed setups and how bottlenecks can surface differently across nodes. The post also shares practical guidance on using these insights to troubleshoot issues and optimize workload performance effectively.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Guide on Common Table Expressions(CTEs) with Data Skew&lt;/STRONG&gt;: This deep dive unpacks a complex query planning scenario in PostgreSQL v17, where data skew can lead to unexpected and suboptimal execution plans involving CTEs. It explains why the optimizer may choose inefficient plans and how this impacts real-world workloads. The&amp;nbsp;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/when-postgresql-v17-chooses-the-wrong-plan-a-deep-dive-into-ctes-with-data-skew/4515705" target="_blank" rel="noopener"&gt;blog&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; also outlines strategies to diagnose and mitigate these issues, helping users better predict and tune query performance.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Guide on PostgreSQL as a Graph Database:&lt;/STRONG&gt; This&amp;nbsp;&lt;A style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://techcommunity.microsoft.com/blog/adforpostgresql/postgresql-as-your-graph-database-in-the-ai-era/4516323" target="_blank" rel="noopener"&gt;blog&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; explains how PostgreSQL can be leveraged to model and query graph-like relationships, making it highly relevant for AI-driven applications. It demonstrates how relational capabilities can be extended to support graph workloads without introducing additional systems. The post also highlights practical patterns and use cases that enable developers to build more connected, intelligent applications using PostgreSQL as a unified data platform.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="blog2"&gt;Scaling PostgreSQL for Real-World Application Workloads&lt;/H2&gt;
&lt;P&gt;Alongside performance tuning and data modeling topics, we also explored how PostgreSQL behaves under real-world application patterns especially in scenarios involving high concurrency, background job processing, and connection-heavy workloads. These blogs focus on common architectural choices developers make and the trade-offs to consider when scaling reliably.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Guide on using Postgres as a Job Queue&lt;/STRONG&gt;: This&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/adforpostgresql/potential-consequences-of-using-postgres-as-a-job-queue/4514332" target="_blank" rel="noopener" data-lia-auto-title="blog" data-lia-auto-title-active="0"&gt;blog&lt;/A&gt; takes a deeper look at the implications of using PostgreSQL as a job queue, a pattern commonly adopted for simplicity and tighter integration. It walks through how queue-like workloads can introduce contention due to frequent updates, row locking, and long-running transactions. The post highlights how these patterns can impact throughput, vacuum efficiency, and overall database health as scale increases. It also discusses when this approach is appropriate, and when teams should consider dedicated queuing systems to avoid performance bottlenecks.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Guide on Connection Scaling with Elastic Clusters: &lt;/STRONG&gt;This&amp;nbsp;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/adforpostgresql/connection-scaling-in-elastic-clusters/4509624" target="_blank" rel="noopener" data-lia-auto-title="blog " data-lia-auto-title-active="0"&gt;blog &lt;/A&gt;dives into the challenges of handling large volumes of concurrent connections, which is a common bottleneck for modern, microservices-based applications. It explains how Elastic Clusters help distribute connections and workload across multiple nodes, improving scalability and resilience under heavy load. The post also touches on connection management patterns, including pooling strategies, and how they work in conjunction with Elastic Clusters to prevent resource exhaustion and ensure consistent performance at scale.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;Azure Postgres Learning Bytes 🎓&lt;/H1&gt;
&lt;H5 id="prevent"&gt;Preventing accidental server deletion&lt;/H5&gt;
&lt;P&gt;In production environments, accidental deletions can lead to significant downtime and data loss. To safeguard critical resources like Azure Database for PostgreSQL servers, Azure provides &lt;STRONG&gt;resource locks&lt;/STRONG&gt; that add an extra layer of protection beyond standard role-based access control (RBAC). A commonly used option is the &lt;STRONG&gt;CanNotDelete (Delete Lock)&lt;/STRONG&gt;, which ensures that a resource cannot be deleted even by users with elevated permissions until the lock is explicitly removed.&lt;/P&gt;
&lt;P&gt;You can apply a delete lock easily using the Azure CLI by targeting the specific resource:&lt;/P&gt;
&lt;LI-CODE lang="shell"&gt;az lock create --name PreventDelete --lock-type CanNotDelete --resource-group &amp;lt;rg-name&amp;gt; --resource-type Microsoft.DBforPostgreSQL/flexibleServers --resource-name &amp;lt;resource-name&amp;gt;&amp;lt;/resource-name&amp;gt;&amp;lt;/rg-name&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Once applied, any delete operation on the resource will be blocked, helping prevent accidental or unintended deletions during maintenance, deployments, or testing. Locks can be applied at different levels subscription, resource group, or individual resources allowing flexibility based on your protection needs.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;For more details and &lt;STRONG&gt;step-by-step guidance&lt;/STRONG&gt;, read our blog on &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/adforpostgresql/prevent-accidental-deletion-of-an-instance-in-azure-postgres/4447969" data-lia-auto-title="Preventing accidental deletion of an Azure PostgreSQL Instance" data-lia-auto-title-active="0" target="_blank"&gt;Preventing accidental deletion of an Azure PostgreSQL Instance&lt;/A&gt;.&lt;/P&gt;</description>
      <pubDate>Thu, 14 May 2026 17:27:45 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/april-2026-recap-azure-database-for-postgresql/ba-p/4519772</guid>
      <dc:creator>gauri-kasar</dc:creator>
      <dc:date>2026-05-14T17:27:45Z</dc:date>
    </item>
    <item>
      <title>End-to-end workload observability with Query Store for primary and replicas</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/end-to-end-workload-observability-with-query-store-for-primary/ba-p/4517110</link>
      <description>&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Query performance doesn’t stop at the primary&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;Most PostgreSQL architectures don’t run on a single node anymore. Reads get offloaded. Replica chains grow. And when performance issues hit, the hardest part is often simple: &lt;STRONG&gt;where did the queries actually run&lt;/STRONG&gt;?&lt;BR /&gt;With the latest &lt;STRONG&gt;query store&lt;/STRONG&gt; capabilities in Azure Database for PostgreSQL flexible server, you can now capture workload executed not just on the primary, but also on &lt;STRONG&gt;read replicas&lt;/STRONG&gt;—including &lt;STRONG&gt;cascading read replicas&lt;/STRONG&gt;—and export the captured runtime stats, wait stats, and query text into &lt;STRONG&gt;Azure Monitor Logs (Log Analytics workspace / LAWS)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;See the real hotspot&lt;/STRONG&gt;: isolate which node (primary vs replica) is slow.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Know why&lt;/STRONG&gt;: break down time by waits (CPU, I/O, locks) per query.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Connect the dots&lt;/STRONG&gt;: correlate query IDs to query text, and inspect sampled parameters locally in &lt;STRONG&gt;azure_sys&lt;/STRONG&gt; on the &lt;STRONG&gt;primary&lt;/STRONG&gt; when you need input context (parameters aren’t exported to LAWS).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Centralize analysis&lt;/STRONG&gt;: query everything with KQL in LAWS, across servers.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;What you’ll build&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;This post walks through a reproducible demo that provisions a primary server, a read replica, and a cascading read replica, then runs a TPC-H–based workload across all three to generate query store data you can analyze locally and in Log Analytics.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Enable query store capture (including query text) and parameter sampling for parameterized queries.&lt;/LI&gt;
&lt;LI&gt;Enable wait sampling so query store can record wait statistics.&lt;/LI&gt;
&lt;LI&gt;Export &lt;STRONG&gt;runtime stats&lt;/STRONG&gt;, &lt;STRONG&gt;wait stats&lt;/STRONG&gt;, and &lt;STRONG&gt;SQL text&lt;/STRONG&gt; to LAWS using resource-specific tables.&lt;/LI&gt;
&lt;LI&gt;Validate capture on &lt;STRONG&gt;read replicas&lt;/STRONG&gt; and &lt;STRONG&gt;cascading read replicas&lt;/STRONG&gt; (not just the primary).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Prerequisites&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Azure CLI logged in (&lt;STRONG&gt;az login&lt;/STRONG&gt;) and permission to create a resource group, Log Analytics workspace, and PostgreSQL flexible servers.&lt;/LI&gt;
&lt;LI&gt;psql and curl available on your machine.&lt;/LI&gt;
&lt;LI&gt;PostgreSQL flexible server on &lt;STRONG&gt;General Purpose&lt;/STRONG&gt; or &lt;STRONG&gt;Memory Optimized&lt;/STRONG&gt; tier (query store and replicas aren’t supported on Burstable).&lt;/LI&gt;
&lt;LI&gt;PostgreSQL 14+ to test out cascading replicas.&lt;/LI&gt;
&lt;LI&gt;Networking: the script opens firewall access broadly for demos—tighten for production.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Architecture (primary + replica chain + LAWS)&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;You’ll deploy four resources:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Primary server&lt;/STRONG&gt;: read/write node.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Read replica (level 1)&lt;/STRONG&gt;: read-only node created from the primary.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cascading read replica (level 2)&lt;/STRONG&gt;: read-only node created from replica level 1.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Log Analytics workspace (LAWS)&lt;/STRONG&gt;: central place to query Query Store telemetry across all nodes.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;If Diagnostic Settings is properly configured, each server streams query store telemetry to LAWS—but &lt;STRONG&gt;how &lt;/STRONG&gt;it’s kept locally differs by role. On the &lt;STRONG&gt;primary&lt;/STRONG&gt;, query store data is recorded in-memory, then &lt;STRONG&gt;persisted locally &lt;/STRONG&gt;in the &lt;STRONG&gt;azure_sys &lt;/STRONG&gt;database, and then exported to LAWS. On &lt;STRONG&gt;read replicas &lt;/STRONG&gt;(including cascading replicas), query store data is recorded &lt;STRONG&gt;in-memory only&lt;/STRONG&gt; and then exported to LAWS. Bottom line: &lt;STRONG&gt;use LAWS for fleet-wide visibility&lt;/STRONG&gt;, and use the &lt;STRONG&gt;primary’s azure_sys&lt;/STRONG&gt; when you need deep local inspection (like parameter samples).&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Deploy the demo environment&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;The fastest way to reproduce the scenario is to run the end-to-end bash script which you can download from &lt;A class="lia-external-url" href="https://raw.githubusercontent.com/Azure-Samples/azure-postgresql-query-store/refs/heads/main/may2026/script/query_store_demo.sh" target="_blank" rel="noopener"&gt;https://raw.githubusercontent.com/Azure-Samples/azure-postgresql-query-store/refs/heads/main/may2026/script/query_store_demo.sh&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Save the file to a local directory in your Linux shell, and name the file &lt;STRONG&gt;query_store_demo.sh&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;To invoke the script, at minimum, you must assign a string password for the administrator login of the instances of the flexible servers it creates, and invoke the script like this:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;ADMIN_PASSWORD=&amp;lt;Your_Strong_Password&amp;gt; ./query_store_demo.sh&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Optionally, you can also override default values for other environment variables used by the script:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; height: 445.468px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 33.3333%" /&gt;&lt;col style="width: 33.3333%" /&gt;&lt;col style="width: 33.3333%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;&lt;STRONG&gt;Variable&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;STRONG&gt;Purpose&lt;/STRONG&gt;&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;STRONG&gt;Default&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;SUBSCRIPTION_ID&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Azure subscription ID to use&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;EM&gt;(current default subscription)&lt;/EM&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59.1319px;"&gt;&lt;td style="height: 59.1319px;"&gt;BASE_NAME&lt;/td&gt;&lt;td style="height: 59.1319px;"&gt;Base name for all resources (used in naming servers, resource groups, etc.)&lt;/td&gt;&lt;td style="height: 59.1319px;"&gt;pgqswait&lt;EM&gt;{YYYYMMDDHHMMSS}&lt;/EM&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;RESOURCE_GROUP&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Azure resource group name&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;rg-&lt;EM&gt;{BASE_NAME}&lt;/EM&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;LOCATION&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Azure region for resources&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;southeastasia&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;PRIMARY_SERVER&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Name of primary PostgreSQL server&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;EM&gt;{BASE_NAME}&lt;/EM&gt;-primary&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;REPLICA_1&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Name of first-level read replica&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;EM&gt;{BASE_NAME}&lt;/EM&gt;-readreplica&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;REPLICA_2&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Name of second-level cascading read replica&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;EM&gt;{BASE_NAME}&lt;/EM&gt;-cascadereadreplica&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;LOG_ANALYTICS_WORKSPACE&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Log Analytics workspace name&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;law-&lt;EM&gt;{BASE_NAME}&lt;/EM&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;LOG_ANALYTICS_LOCATION&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;Azure region for Log Analytics workspace&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;southeastasia&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;ADMIN_USER&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;PostgreSQL admin username&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;pgadmin&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 35.1215px;"&gt;&lt;td style="height: 35.1215px;"&gt;ADMIN_PASSWORD&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;PostgreSQL admin password&lt;/td&gt;&lt;td style="height: 35.1215px;"&gt;&lt;STRONG&gt;(REQUIRED)&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SKU_NAME&lt;/td&gt;&lt;td&gt;PostgreSQL server SKU (compute tier)&lt;/td&gt;&lt;td&gt;Standard_D4ds_v5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TIER&lt;/td&gt;&lt;td&gt;PostgreSQL pricing tier&lt;/td&gt;&lt;td&gt;GeneralPurpose&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;STORAGE_SIZE&lt;/td&gt;&lt;td&gt;Storage size in GB&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VERSION&lt;/td&gt;&lt;td&gt;PostgreSQL version (minimum 14 for cascading replicas)&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PRIMARY_DATABASE&lt;/td&gt;&lt;td&gt;Initial database name&lt;/td&gt;&lt;td&gt;postgres&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQL_BASE_URL&lt;/td&gt;&lt;td&gt;Base URL for downloading SQL scripts&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://raw.githubusercontent.com/Azure-Samples/azure-postgresql-query-store/refs/heads/main/may2026/script/query_store_demo.sh&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TPCH_DDL_URL&lt;/td&gt;&lt;td&gt;URL for TPC-H schema DDL file&lt;/td&gt;&lt;td&gt;
&lt;P&gt;{SQL_BASE_URL}/schema/tpch_ddl.sql&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WORKLOAD_REPETITIONS&lt;/td&gt;&lt;td&gt;Number of times to execute each workload query (minimum 5)&lt;/td&gt;&lt;td&gt;
&lt;P&gt;10&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AUTO_APPROVE&lt;/td&gt;&lt;td&gt;Skip confirmation prompt and proceed automatically&lt;/td&gt;&lt;td&gt;
&lt;P&gt;false&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If, for example, you want to not only pass the ADMIN_PASSWORD but also override the LOCATION, you could do it like this:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;ADMIN_PASSWORD=&amp;lt;Your_Strong_Password&amp;gt; LOCATION=canadacentral ./query_store_demo.sh&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In a bit over 1 hour, the script will do the following steps:&lt;/P&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Step 1 — Provision first part of the infrastructure&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;The infrastructure provisioned in this phase consists of:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A resource group in which all resources are deployed.&lt;/LI&gt;
&lt;LI&gt;An instance of Log Analytics workspace, where all flexible server instances will send their query store related logs.&lt;/LI&gt;
&lt;LI&gt;A primary (read-write) flexible server.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Step 2 — Configure primary server&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;Now it's time to configure one new&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/server-parameters/concepts-server-parameters" target="_blank" rel="noopener"&gt;server parameters&lt;/A&gt; on your primary server so that query store emits query text to LAWS, so that we can correlate quey IDs to something recognizable.&lt;/P&gt;
&lt;P&gt;Query IDs are great for aggregation—but you still need the SQL. Turn on query text emission so you can correlate runtime and waits back to the actual statement text. Do this by setting&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/postgresql/server-parameters/param-query-store?pivots=postgresql-18#pg_qsemit_query_text" target="_blank" rel="noopener"&gt;pg_qs.emit_query_text&lt;/A&gt; to &lt;STRONG&gt;on&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Refer to our documentation to learn &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/server-parameters/how-to-server-parameters-set-value?tabs=portal-set-value" target="_blank" rel="noopener"&gt;how to set the value of a server parameter&lt;/A&gt;.&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Step 3 — Provision second part of the infrastructure&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;The infrastructure provisioned in this phase consists of:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A read replica (read-only) whose source is the primary server.&lt;/LI&gt;
&lt;LI&gt;A cascade read replica (read-only), whose source is the previously created read replica.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Notice that when read replicas are created, they inherit the server parameter values from their source server. Because we have configured query store related settings on the primary server already, the intermediate read replica inherits its server parameters from that primary, and the cascade read replica inherits them from the intermediate replica.&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Step 4 — Export query store to Log Analytics (LAWS)&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;Now for the payoff, we want to stream the data to Log Analytics so you can query across nodes, build dashboards, and alert.&lt;/P&gt;
&lt;P&gt;The script configures diagnostic settings on &lt;STRONG&gt;the primary and both replicas &lt;/STRONG&gt;to send logs to a Log Analytics workspace using &lt;STRONG&gt;resource-specific tables&lt;/STRONG&gt;. This is the key to cross-node visibility: each server exports its own captured telemetry, and you can slice by resource in a single KQL query.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Query store runtime stats&lt;/STRONG&gt;: execution counts, elapsed time, and other performance counters.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Query store wait stats&lt;/STRONG&gt;: wait breakdown attributed to queries.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Query store SQL text&lt;/STRONG&gt;: query text to decode query IDs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: Query store parameter samples are not included in the Log Analytics export. Parameters are stored locally per server in &lt;STRONG&gt;azure_sys&lt;/STRONG&gt;, and on read replicas &lt;STRONG&gt;azure_sys is read-only&lt;/STRONG&gt;—so don’t depend on replicas for parameter inspection. LAWS receives runtime stats, wait stats, and query text.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Diagnostics settings&lt;/STRONG&gt; for an instance of flexible server can be configured via portal. In the resource menu, under &lt;STRONG&gt;Monitoring&lt;/STRONG&gt;, select &lt;STRONG&gt;Diagnostic settings&lt;/STRONG&gt;. Add a new diagnostic setting, select a destination Log Analytics workspace, and the individual log catergories which you want to stream to that LAWS, and save the changes.&lt;/P&gt;
&lt;P&gt;For &lt;STRONG&gt;Destination table&lt;/STRONG&gt; it's highly recommended to use &lt;STRONG&gt;Resource specific&lt;/STRONG&gt; (one table per signal with proper schema) over &lt;STRONG&gt;Azure diagnostics&lt;/STRONG&gt; (legacy one table for everything).&lt;/P&gt;
&lt;P&gt;With &lt;STRONG&gt;Azure diagnostics&lt;/STRONG&gt;, all logs from all resource types land into a single table (AzureDiagnostics). It's a wide table with many columns. New columns get added as services emit new fields. If the 500 column limit is hit, extra fields go into the AdditionalFields column (a dynamic JSON). Querying on attributes stored in that column might have huge performance and query cost impact. The schema is inconsistent and difficult to discover. You must always filter events in that table by ResourceType and Category.&lt;/P&gt;
&lt;P&gt;On the other hand, with &lt;STRONG&gt;Resource specific&lt;/STRONG&gt;, logs are written to separate tables per resource type and category. Therefore, each table has a well-defined schema and columns are strongly typed. Tables are smaller and faster to query. Queries on these tables are simpler don't need filtering by ResourceType and Category. Performance-wise, they also support faster ingestion and faster querying. They also support selecting different table plans and retention settings for each table. And, more importantly, role-based access control (RBAC) permissions can be applied at table level, allowing you to control access to telemetry in a more granular way.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: If you want to see any of the images in this article in better quality, click on them to see them in their original size.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;This can also be configured using Azure CLI command &lt;A class="lia-external-url" href="https://learn.microsoft.com/cli/azure/monitor/diagnostic-settings?view=azure-cli-latest#az-monitor-diagnostic-settings-create" target="_blank" rel="noopener"&gt;az monitor diagnostic-settings create&lt;/A&gt;. Make sure that the &lt;STRONG&gt;--export-to-resource-specific&lt;/STRONG&gt; parameter is set to &lt;STRONG&gt;true&lt;/STRONG&gt;, which is the equivalent of selecting &lt;STRONG&gt;Resource specific&lt;/STRONG&gt; for &lt;STRONG&gt;Destination table &lt;/STRONG&gt;in portal UI. Setting this parameter to false, would mean that you want to use AzureDiagnostics as the destination table, which we don't recommend using.&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Step 5 — Run some workload&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;In this phase the script loads a TPC-H schema and executes workload SQL across different nodes so that you can prove replica capture.&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Query it in Log Analytics&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;Once the workload completed and data was streamed to Log Analytics, you can open your Log Analytics workspace, and start querying the relevant tables. If you don't know how to start issuing queries in a Log Analytics workspace, refer to &lt;A href="https://learn.microsoft.com/en-us/azure/azure-monitor/logs/get-started-queries?tabs=kql" target="_blank" rel="noopener"&gt;Get started with log queries in Azure Monitor Logs&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;In your Log Analytics workspace, when you select &lt;STRONG&gt;Logs&lt;/STRONG&gt; in the resource menu, you can access the &lt;STRONG&gt;Queries hub&lt;/STRONG&gt;. By default, it should open automatically unless you have configured it to not show, in which case you can open by selecting &lt;STRONG&gt;Queries hub&lt;/STRONG&gt; on the top right corner of the Logs home screen.&lt;/P&gt;
&lt;P&gt;If you add a filter in the queries hub for &lt;STRONG&gt;Resource type&lt;/STRONG&gt; equals &lt;STRONG&gt;Azure Database for PostgreSQL Flexible Server&lt;/STRONG&gt;, you'll be able to access multiple examples of queries which might help you get started querying the log categories we support for our service.&lt;/P&gt;
&lt;P&gt;You can run any of them by selecting &lt;STRONG&gt;Run&lt;/STRONG&gt; on the summarization card that describes the query or, if you hover the mouse over the card, you can select &lt;STRONG&gt;Load to editor&lt;/STRONG&gt; so that the query is copied over to the active query window, and you can run it or modified it further.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Following, there are a few more query examples which can be useful to analyze the workload executed in this experiment.&lt;/P&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Top queries by to&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-10"&gt;tal time (across all nodes)&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;To get the list of 10 queries with higher duration from the ones that ran on any of the three nodes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;KQL&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;PGSQLQueryStoreRuntime
| summarize total_time_ms = sum(TotalExecDurationMs) by QueryId, LogicalServerName
| top 10 by total_time_ms desc&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;:&lt;SPAN class="lia-text-color-21"&gt; Results might be slightly different on each execution of the experiment.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Where queries wait on each node&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;List the most frequent wait events observed on user initiated queries across all nodes.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;KQL&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;PGSQLQueryStoreWaits
| join kind=inner (PGSQLQueryStoreRuntime) on QueryId
| summarize total_waits_sampled = sum(Calls) by Event, EventType, LogicalServerName
| order by total_waits_sampled desc&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;&lt;/SPAN&gt;: Results might be slightly different on each execution of the experiment.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Decode query IDs (join runtime stats with SQL text)&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;Top 20 queries the most frequent wait events observed on user initiated queries across all nodes.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;KQL&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;PGSQLQueryStoreRuntime
| join kind=inner (PGSQLQueryStoreQueryText) on QueryId
| where QueryType == 'select'
| project LogicalServerName, QueryId, TotalExecDurationMs, QueryText
| top 20 by TotalExecDurationMs desc&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;&lt;/SPAN&gt;: Results might be slightly different on each execution of the experiment.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Compare primary vs replicas (workload distribution)&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;Find total number of query executions and accumulated duration of all those executions for each node.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;KQL&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;PGSQLQueryStoreRuntime
| summarize execs = sum(Calls), total_time_ms = sum(TotalExecDurationMs) by LogicalServerName
| order by total_time_ms desc&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;&lt;/SPAN&gt;: Results might be slightly different on each execution of the experiment.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Replica-only hotspots (find what’s slow off the primary)&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;Find top 10 queries executed by their aggregated duration, focusing on what was executed on read replicas only.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;KQL&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;let Replicas = dynamic(["pgqswait20260505220501-readreplica", "pgqswait20260505220501-cascadereadreplica"]);
PGSQLQueryStoreRuntime
| where LogicalServerName in (Replicas)
| summarize total_time_ms = sum(TotalExecDurationMs) by QueryId, LogicalServerName
| top 10 by total_time_ms desc&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;&lt;/SPAN&gt;: Results might be slightly different on each execution of the experiment.&lt;/P&gt;
&lt;img /&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;QPI now supports query store stats collected on replicas&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;You can now use Query Performance Insight workbooks to analyze query store information not only on your primary server, as you were used to, but you can also get that valuable information on your read replicas.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Why replica workload capture is a big deal&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;This is the unlock: you can now answer performance questions in replica-heavy architectures without stitching together partial signals.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Per-node truth&lt;/STRONG&gt;: see the slow queries on the node where they actually ran (primary vs replica vs cascading replica).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Faster root cause&lt;/STRONG&gt;: runtime + waits gives you “slow” and “why” in one place.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Replica tuning that sticks&lt;/STRONG&gt;: identify replica-specific bottlenecks (I/O saturation, lock waits, CPU pressure) and tune with evidence.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Centralized observability&lt;/STRONG&gt;: export to LAWS so you can build dashboards, alerts, and cross-server comparisons with KQL.&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Unlock query visibility&lt;/STRONG&gt;: Access query text without database permissions&lt;SPAN style="color: rgb(30, 30, 30);"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;&lt;STRONG&gt;Fine grain control on who can view query text&lt;/STRONG&gt;: Using resource specific tables in LAWS, you can decide which users can access the table in which text of the queries is kept.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Parameter-aware debugging&lt;/STRONG&gt;: sampled parameters can help reproduce issues and explain plan changes, but they’re stored locally in &lt;STRONG&gt;azure_sys&lt;/STRONG&gt; and &lt;STRONG&gt;not exported to LAWS&lt;/STRONG&gt;. In practice, rely on the primary for parameter inspection (replicas have read-only &lt;STRONG&gt;azure_sys&lt;/STRONG&gt;).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Operational notes (quick but important)&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Expect a delay&lt;/STRONG&gt;: Query store stats and LAWS ingestion aren’t instant. Give it a few minutes after running workload.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Mind retention&lt;/STRONG&gt;: Query store retention and Log Analytics retention are separate knobs. Tune them to balance troubleshooting value and cost.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Production hygiene&lt;/STRONG&gt;: don’t use wide-open firewall rules outside of a demo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Clean up&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;When you’re done, delete the resource group:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;az group delete --name &amp;lt;RESOURCE_GROUP&amp;gt; --yes --no-wait&lt;/LI-CODE&gt;
&lt;H1&gt;&lt;SPAN class="lia-text-color-10"&gt;Bottom line&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;Query store in Azure Database for PostgreSQL flexible server now matches how modern architectures run—across primary, read replicas, and cascading replicas—and LAWS gives you a single place to query, compare, and act.&lt;/P&gt;</description>
      <pubDate>Fri, 08 May 2026 13:54:46 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/end-to-end-workload-observability-with-query-store-for-primary/ba-p/4517110</guid>
      <dc:creator>nachoalonsoportillo</dc:creator>
      <dc:date>2026-05-08T13:54:46Z</dc:date>
    </item>
    <item>
      <title>You don't want to miss POSETTE: An Event for Postgres 2026 (T-6 weeks)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/you-don-t-want-to-miss-posette-an-event-for-postgres-2026-t-6/ba-p/4517235</link>
      <description>&lt;P&gt;PostgreSQL has quietly become one of the most important pieces of modern application infrastructure — and in 2026, that momentum is just impossible to ignore.&lt;/P&gt;
&lt;P&gt;From AI‑powered applications and real‑time analytics to globally distributed systems and mission‑critical workloads, PostgreSQL is no longer “just” a relational database. It has evolved into a versatile, extensible platform that sits at the center of how modern systems are built.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event for Postgres 2026&lt;/A&gt;&lt;/STRONG&gt;is where that evolution comes into focus, please visit conference’s site to register and add the event to your calendar!&lt;/P&gt;
&lt;P&gt;This year’s conference is not about chasing hype or showcasing isolated features. It’s about how PostgreSQL is actually being built, operated, extended, and trusted in production — by the people who write the code, run it at scale, and depend on it every day.&lt;/P&gt;
&lt;P&gt;This post kicks off our POSETTE 2026 blog series. It introduces the major themes shaping the conference and sets the stage for deeper technical dives in the weeks ahead.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;PostgreSQL as the “Everything Database”&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;One idea shows up again and again across the POSETTE 2026 program: &lt;STRONG&gt;PostgreSQL is becoming the everything database&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Once viewed primarily as an OLTP engine, PostgreSQL now supports a surprising range of workloads and access patterns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Rich document models with JSON and JSONB&lt;/LI&gt;
&lt;LI&gt;Full‑text search and fuzzy matching&lt;/LI&gt;
&lt;LI&gt;Time‑series and event‑driven data&lt;/LI&gt;
&lt;LI&gt;Vector embeddings for AI and semantic search&lt;/LI&gt;
&lt;LI&gt;Graph traversal and property graph queries&lt;/LI&gt;
&lt;LI&gt;Analytical workloads through extensions and hybrid execution engines&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Instead of spreading data across specialized systems, many teams are choosing a different path: keep data closer together, reduce architectural sprawl, and let PostgreSQL adapt through extensions, planner improvements, and new query capabilities.&lt;/P&gt;
&lt;P&gt;At POSETTE 2026, you’ll see this evolution in practice — from Postgres acting as a lakehouse-style analytics engine, to SQL-native graph queries, to design patterns that simplify applications by leaning into Postgres’ breadth rather than working around it.&lt;/P&gt;
&lt;P&gt;One of the upcoming posts in this series will explore &lt;STRONG&gt;how far PostgreSQL can realistically go&lt;/STRONG&gt;, where it shines, and where drawing clear boundaries still matters.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;PostgreSQL Meets AI: Agents, RAG, and Retrieval at Scale&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;AI is no longer an experiment bolted onto databases after the fact. It’s changing how applications retrieve, interpret, and reason over data.&lt;/P&gt;
&lt;P&gt;A core theme at POSETTE 2026 is &lt;STRONG&gt;PostgreSQL’s role in AI&lt;/STRONG&gt;‑&lt;STRONG&gt;driven systems&lt;/STRONG&gt;, especially Retrieval‑Augmented Generation (RAG) and agent‑based workflows.&lt;/P&gt;
&lt;P&gt;Sessions throughout the conference dig into questions teams are actively struggling with today:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;How do you use PostgreSQL as a reliable retrieval backbone for AI systems?&lt;/LI&gt;
&lt;LI&gt;How do relational data, vectors, and graphs work together to provide better context?&lt;/LI&gt;
&lt;LI&gt;How do you expose databases to LLMs safely, without creating operational or security risks?&lt;/LI&gt;
&lt;LI&gt;How do you prevent accidental writes, unbounded queries, or runaway costs?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The pattern emerging across these talks is clear: production‑grade AI depends far more on disciplined data access, safeguards, and observability than on the model itself. PostgreSQL’s extensibility, strong consistency, and transactional guarantees make it a compelling foundation when AI systems move beyond demos into real workloads.&lt;/P&gt;
&lt;P&gt;We’ll dedicate a full blog post in this series to &lt;STRONG&gt;PostgreSQL, MCP, RAG, and agent architectures&lt;/STRONG&gt;, unpacking what works today and what’s coming next.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Performance, Elasticity, and the Reality of Scale&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Scaling PostgreSQL isn’t just about adding more CPU.&lt;/P&gt;
&lt;P&gt;Modern workloads are bursty and unpredictable. APIs spike without warning. Background jobs collide with user traffic. Analytics compete with OLTP. Cloud pricing penalizes both over‑provisioning and reactive resizing.&lt;/P&gt;
&lt;P&gt;That’s why POSETTE 2026 puts a strong emphasis on &lt;STRONG&gt;performance realism&lt;/STRONG&gt; — the practical realities teams face once systems leave the comfort zone of steady-state benchmarks.&lt;/P&gt;
&lt;P&gt;Across multiple sessions, you’ll see deep focus on topics such as:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Why storage, not CPU, is often the real bottleneck&lt;/LI&gt;
&lt;LI&gt;How planner costs, vacuum behavior, and maintenance evolve in PostgreSQL 18&lt;/LI&gt;
&lt;LI&gt;What changes — and what doesn’t — when moving from fixed capacity to elastic compute&lt;/LI&gt;
&lt;LI&gt;How to reason about distributed scaling without treating it as a magic switch&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;These are not theoretical discussions. They reflect real production systems under sustained load, and the trade‑offs teams make when performance and reliability actually matter.&lt;/P&gt;
&lt;P&gt;Future posts in this series will break down &lt;STRONG&gt;common Postgres performance myths&lt;/STRONG&gt;, highlight meaningful changes in recent releases, and share lessons learned from running PostgreSQL under pressure.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Inside PostgreSQL: Internals, Evolution, and What’s Next&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;POSETTE has always maintained a close connection to the PostgreSQL core community, and 2026 continues that tradition.&lt;/P&gt;
&lt;P&gt;This year’s agenda includes deep dives into:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WAL, logical replication, and change data capture&lt;/LI&gt;
&lt;LI&gt;Major features landing in PostgreSQL 18, with early signals for 19&lt;/LI&gt;
&lt;LI&gt;The engineering trade‑offs behind planner, executor, and I/O improvements&lt;/LI&gt;
&lt;LI&gt;Practical guidance for contributors getting started with PostgreSQL hacking&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;These sessions offer a rare look behind the curtain — not just at &lt;EM&gt;what&lt;/EM&gt; PostgreSQL does, but &lt;EM&gt;why&lt;/EM&gt; it behaves the way it does, and &lt;EM&gt;how&lt;/EM&gt; decisions make it from patch review to production release.&lt;/P&gt;
&lt;P&gt;If you’ve ever wondered how PostgreSQL keeps evolving at scale without losing its stability or community trust, POSETTE 2026 is where those answers take shape.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Security and Operations: Running PostgreSQL Like It Matters&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;As PostgreSQL adoption grows, expectations shift.&lt;/P&gt;
&lt;P&gt;“Works on my machine” isn’t enough. Databases must be secure by default, observable in production, and resilient when things go wrong.&lt;/P&gt;
&lt;P&gt;POSETTE 2026 includes sessions aimed squarely at operators, architects, and platform teams responsible for production systems, covering topics such as:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PostgreSQL authentication and authorization models&lt;/LI&gt;
&lt;LI&gt;Designing least‑privilege schemas and safer defaults&lt;/LI&gt;
&lt;LI&gt;Managing large tables without accumulating hidden risk&lt;/LI&gt;
&lt;LI&gt;Avoiding subtle operational pitfalls that only appear at scale&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;These are the talks that surface lessons learned the hard way — and help teams avoid repeating them.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;More Than a Conference: A PostgreSQL Community Event&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;What ultimately sets POSETTE apart isn’t just the agenda. It’s the people.&lt;/P&gt;
&lt;P&gt;POSETTE 2026 brings together PostgreSQL contributors, extension authors, cloud engineers, platform teams, and practitioners from across the ecosystem. It’s a space to learn from each other, challenge assumptions, and reconnect with why PostgreSQL continues to thrive after decades of evolution.&lt;/P&gt;
&lt;P&gt;And this blog series is only just beginning.&lt;/P&gt;
&lt;P&gt;In the coming weeks, we’ll go deeper into individual themes, highlight standout sessions, and explore the ideas shaping PostgreSQL’s next chapter.&lt;/P&gt;
&lt;P&gt;If PostgreSQL matters to your work — or if it’s becoming central faster than you expected — &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://posetteconf.com/2026/" target="_blank" rel="noopener"&gt;POSETTE: An Event for Postgres 2026&lt;/A&gt; is the event you don’t want to miss&lt;/STRONG&gt;. Go ahead and register!&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Up next: &lt;STRONG&gt;Why PostgreSQL Is Becoming the “Everything Database.”&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 07 May 2026 15:43:45 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/you-don-t-want-to-miss-posette-an-event-for-postgres-2026-t-6/ba-p/4517235</guid>
      <dc:creator>scoriani</dc:creator>
      <dc:date>2026-05-07T15:43:45Z</dc:date>
    </item>
    <item>
      <title>When PostgreSQL v17 Chooses the Wrong Plan: A Deep Dive into CTEs with Data Skew</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/when-postgresql-v17-chooses-the-wrong-plan-a-deep-dive-into-ctes/ba-p/4515705</link>
      <description>&lt;P&gt;Common Table Expressions or&amp;nbsp;CTEs provide temporary named result set that can be referenced within single complex SQL statements. CTE offer great flexibility in breaking down complex SQL queries into multiple readable parts and enables recursion. CTEs allows materialized result set which allows users to refer the result set multiple times.&lt;/P&gt;
&lt;P&gt;PostgreSQL 17 propagates column statistics from MATERIALIZED CTEs into the parent query, allowing the planner to estimate hash aggregation and join cardinalities more accurately.&lt;/P&gt;
&lt;P&gt;However, when queries combine &lt;STRONG&gt;highly skewed data distributions&lt;/STRONG&gt; with &lt;STRONG&gt;runtime randomness&lt;/STRONG&gt; (for example, ORDER BY random() LIMIT 1), this increased planner confidence can sometimes lead to execution plans that are correct in theory but catastrophic for specific runtime values.&lt;/P&gt;
&lt;H1&gt;What is Data Skew and how it affects plans?&lt;/H1&gt;
&lt;P&gt;Data skew is an uneven distribution of values in a column, where one or a few values occur far more often than the rest. To choose an efficient execution plan, PostgreSQL’s planner estimates row counts using statistics such as n_distinct, histograms, and most-common-values (MCV) frequencies stored in &lt;EM&gt;pg_statistic&lt;/EM&gt;. If these estimates are off—especially if selectivity is overestimated—query performance can degrade significantly.&lt;/P&gt;
&lt;P&gt;Baseline Query and Observed Planner Behavior&lt;/P&gt;
&lt;P&gt;To gauge the performance impact of data skew with PGv17, we generated data into 3 tables relating to Accounts, Purchases and Audit. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;This baseline query selects a single random HIGH_RISK account and retrieves matching rows from a large audit_logs table via two materialized CTEs.&lt;/P&gt;
&lt;H3&gt;Original Query&lt;/H3&gt;
&lt;LI-CODE lang="sql"&gt;with selected_account as materialized (  
select account_id
    from accounts
    where account_type = 'HIGH_RISK'
    order by random()
    limit 1
),
audit_purchases as materialized (
    select distinct p.account_id
    from purchases p
    join selected_account sa
      on p.account_id = sa.account_id
)
select al.*
from audit_logs al
where exists (
 select 1 
from audit_purchases ap 
where al.account_id = ap.account_id);&lt;/LI-CODE&gt;
&lt;H3&gt;PostgreSQL 14 Execution Plan&lt;/H3&gt;
&lt;P&gt;PostgreSQL 14 treats materialized CTEs as optimization fences and does not propagate detailed statistics into the parent query.&lt;/P&gt;
&lt;P&gt;As a result, the planner assumes relatively small CTE result sets and consistently favors &lt;STRONG&gt;nested loop joins with parameterized index scans&lt;/STRONG&gt;. While these estimates are not strictly accurate, this conservative planning approach prevents full-table scans and avoids catastrophic performance under extreme data skew.&lt;/P&gt;
&lt;P&gt;In this workload, PostgreSQL 14 completes the query in approximately &lt;STRONG&gt;7 ms&lt;/STRONG&gt;.&lt;/P&gt;
&lt;LI-CODE lang="c"&gt;                                                                            QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop  (cost=1412.94..212757485.16 rows=1500600064 width=27) (actual time=5.226..7.192 rows=30 loops=1)
   Buffers: shared hit=277 read=13
   CTE selected_account
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.460..4.460 rows=1 loops=1)
           Buffers: shared hit=271
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.459..4.459 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=271
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.011..3.533 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   CTE audit_purchases
     -&amp;gt;  HashAggregate  (cost=317.44..355.57 rows=3813 width=4) (actual time=4.735..4.741 rows=1 loops=1)
           Group Key: p.account_id
           Batches: 1  Memory Usage: 217kB
           Buffers: shared hit=274 read=1
           -&amp;gt;  Nested Loop  (cost=0.44..292.52 rows=9966 width=4) (actual time=4.722..4.726 rows=10 loops=1)
                 Buffers: shared hit=274 read=1
                 -&amp;gt;  CTE Scan on selected_account sa  (cost=0.00..0.02 rows=1 width=4) (actual time=4.461..4.461 rows=1 loops=1)
                       Buffers: shared hit=271
                 -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..192.84 rows=9966 width=4) (actual time=0.260..0.262 rows=10 loops=1)
                       Index Cond: (account_id = sa.account_id)
                       Heap Fetches: 0
                       Buffers: shared hit=3 read=1
   -&amp;gt;  HashAggregate  (cost=85.79..87.79 rows=200 width=4) (actual time=4.743..4.744 rows=1 loops=1)
         Group Key: ap.account_id
         Batches: 1  Memory Usage: 40kB
         Buffers: shared hit=274 read=1
         -&amp;gt;  CTE Scan on audit_purchases ap  (cost=0.00..76.26 rows=3813 width=4) (actual time=4.737..4.742 rows=1 loops=1)
               Buffers: shared hit=274 read=1
   -&amp;gt;  Index Scan using idx_account_audit on audit_logs al  (cost=0.58..817780.34 rows=24600001 width=27) (actual time=0.480..2.438 rows=30 loops=1)
         Index Cond: (account_id = ap.account_id)
         Buffers: shared hit=3 read=12
 Planning Time: 1.121 ms
 Execution Time: 7.253 ms
(37 rows)&lt;/LI-CODE&gt;
&lt;H3&gt;PostgreSQL 17 Execution Plan&lt;/H3&gt;
&lt;P&gt;PostgreSQL 17 correctly estimates that the &lt;EM&gt;audit_purchases&lt;/EM&gt; CTE may contain thousands of rows and that joining it with audit_logs could produce tens of millions of matches.&lt;/P&gt;
&lt;P&gt;Based on these estimates, the planner selects a &lt;STRONG&gt;Hash Semi Join with a Sequential Scan&lt;/STRONG&gt; on &lt;EM&gt;audit_logs&lt;/EM&gt;, which is optimal when many rows are expected to match.&lt;/P&gt;
&lt;P&gt;However, at runtime the selected account produces only ~30 matching audit rows. Despite this, PostgreSQL must execute the chosen plan fully, scanning millions of rows from disk. This results in an execution time of &lt;STRONG&gt;521,625 ms (~8.7 minutes)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Importantly, this behavior is not a cost estimation bug—the estimates are statistically correct.&lt;/P&gt;
&lt;P&gt;The failure occurs because the PostgreSQL 17 planner estimates a &lt;STRONG&gt;large matching result set&lt;/STRONG&gt; based on the cardinality of values produced by the &lt;EM&gt;audit_purchases&lt;/EM&gt; CTE, and consequently chooses a plan optimized for that estimated volume rather than for the single runtime-selected account.&lt;/P&gt;
&lt;LI-CODE lang="c"&gt;                                                                            QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Hash Semi Join  (cost=1691.60..93353890.16 rows=3001396992 width=26) (actual time=86577.858..521625.286 rows=30 loops=1)
   Hash Cond: (al.account_id = ap.account_id)
   Buffers: shared hit=28879 read=22040419
   CTE selected_account
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.486..4.487 rows=1 loops=1)
           Buffers: shared hit=274
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.485..4.486 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=274
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.021..3.551 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   CTE audit_purchases
     -&amp;gt;  HashAggregate  (cost=658.72..673.28 rows=1456 width=4) (actual time=4.907..4.912 rows=1 loops=1)
           Group Key: p.account_id
           Batches: 1  Memory Usage: 73kB
           Buffers: shared hit=277 read=1
           -&amp;gt;  Nested Loop  (cost=0.44..606.86 rows=20742 width=4) (actual time=4.898..4.902 rows=10 loops=1)
                 Buffers: shared hit=277 read=1
                 -&amp;gt;  CTE Scan on selected_account sa  (cost=0.00..0.02 rows=1 width=4) (actual time=4.487..4.487 rows=1 loops=1)
                       Buffers: shared hit=274
                 -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..399.42 rows=20742 width=4) (actual time=0.410..0.411 rows=10 loops=1)
                       Index Cond: (account_id = sa.account_id)
                       Heap Fetches: 0
                       Buffers: shared hit=3 read=1
   -&amp;gt;  Seq Scan on audit_logs al  (cost=0.00..52082989.92 rows=3001396992 width=26) (actual time=0.012..286755.571 rows=3001400050 loops=1)
         Buffers: shared hit=28602 read=22040418
   -&amp;gt;  Hash  (cost=29.12..29.12 rows=1456 width=4) (actual time=4.919..4.920 rows=1 loops=1)
         Buckets: 2048  Batches: 1  Memory Usage: 17kB
         Buffers: shared hit=277 read=1
         -&amp;gt;  CTE Scan on audit_purchases ap  (cost=0.00..29.12 rows=1456 width=4) (actual time=4.908..4.911 rows=1 loops=1)
               Buffers: shared hit=277 read=1
 Planning:
   Buffers: shared hit=197
 Planning Time: 1.831 ms
 Execution Time: 521625.433 ms
(38 rows)&lt;/LI-CODE&gt;
&lt;H3&gt;Forced nested loop&lt;/H3&gt;
&lt;P&gt;Disabling hash joins at the session level forces PostgreSQL 17 to revert to a nested loop plan using index scans. This diagnostic step completes in &lt;STRONG&gt;~8 ms&lt;/STRONG&gt;, confirming that index-based execution is sufficient for the actual runtime workload. However, disabling planner features is not suitable for production use and serves only to validate the root cause.&lt;/P&gt;
&lt;LI-CODE lang="c"&gt;        	                                                                    QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=1677.62..3361930001.36 rows=3001396992 width=26) (actual time=5.513..8.194 rows=30 loops=1)
   Buffers: shared hit=277 read=12
   CTE selected_account
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.524..4.524 rows=1 loops=1)
           Buffers: shared hit=271
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.523..4.523 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=271
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.014..3.608 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   CTE audit_purchases
     -&amp;gt;  HashAggregate  (cost=658.72..673.28 rows=1456 width=4) (actual time=4.890..4.894 rows=1 loops=1)
           Group Key: p.account_id
           Batches: 1  Memory Usage: 73kB
           Buffers: shared hit=274 read=1
           -&amp;gt;  Nested Loop  (cost=0.44..606.86 rows=20742 width=4) (actual time=4.882..4.885 rows=10 loops=1)
                 Buffers: shared hit=274 read=1
                 -&amp;gt;  CTE Scan on selected_account sa  (cost=0.00..0.02 rows=1 width=4) (actual time=4.525..4.525 rows=1 loops=1)
                       Buffers: shared hit=271
                 -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..399.42 rows=20742 width=4) (actual time=0.354..0.356 rows=10 loops=1)
                       Index Cond: (account_id = sa.account_id)
                       Heap Fetches: 0
                       Buffers: shared hit=3 read=1
   -&amp;gt;  HashAggregate  (cost=32.76..47.32 rows=1456 width=4) (actual time=4.896..4.899 rows=1 loops=1)
         Group Key: ap.account_id
         Batches: 1  Memory Usage: 73kB
         Buffers: shared hit=274 read=1
         -&amp;gt;  CTE Scan on audit_purchases ap  (cost=0.00..29.12 rows=1456 width=4) (actual time=4.892..4.895 rows=1 loops=1)
               Buffers: shared hit=274 read=1
   -&amp;gt;  Index Scan using idx_account_audit on audit_logs al  (cost=0.58..1782455.82 rows=52656088 width=26) (actual time=0.615..3.283 rows=30 loops=1)
         Index Cond: (account_id = ap.account_id)
         Buffers: shared hit=3 read=11
 Planning Time: 0.184 ms
 Execution Time: 8.252 ms
(37 rows)&lt;/LI-CODE&gt;
&lt;H3&gt;Fix Strategies&lt;/H3&gt;
&lt;P&gt;While the fix isn’t straightforward, we attempt to modify the query plan through query rewrite using following methods:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Lateral Join with Offset 0&lt;/LI&gt;
&lt;LI&gt;Limit on Purchases&lt;/LI&gt;
&lt;LI&gt;Using subqueries&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;Lateral Join with Offset 0&lt;/H4&gt;
&lt;P&gt;Adding OFFSET 0 inside a LATERAL subquery introduces an &lt;STRONG&gt;optimizer barrier&lt;/STRONG&gt; that prevents join reordering.&lt;/P&gt;
&lt;P&gt;This forces PostgreSQL to execute a &lt;STRONG&gt;parameterized nested loop&lt;/STRONG&gt;, passing the runtime account ID into an index scan on &lt;EM&gt;audit_logs&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;With this rewrite, PostgreSQL 17 executes the query in &lt;STRONG&gt;6.519 ms&lt;/STRONG&gt;, a &lt;STRONG&gt;99.9988% improvement&lt;/STRONG&gt; over the original plan.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;with selected_account as materialized (
  select account_id
  from accounts
  where account_type = 'HIGH_RISK'
  order by random()
  limit 1
),
audit_purchases as materialized (
  select p.account_id
  from purchases p
  join selected_account sa
    on p.account_id = sa.account_id
)
select al.*
from audit_purchases ap
join lateral (
  select *
  from audit_logs al where al.account_id = ap.account_id offset 0) al on true;&lt;/LI-CODE&gt;
&lt;H6&gt;Execution plan&lt;/H6&gt;
&lt;LI-CODE lang="c"&gt;                                                                         QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=1578.44..42162640233.98 rows=1092192577296 width=26) (actual time=4.980..6.481 rows=300 loops=1)
   Buffers: shared hit=403 read=12
   CTE selected_account
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.296..4.297 rows=1 loops=1)
           Buffers: shared hit=271
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.295..4.296 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=271
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.013..3.357 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   CTE audit_purchases
     -&amp;gt;  Nested Loop  (cost=0.44..606.86 rows=20742 width=4) (actual time=4.585..4.588 rows=10 loops=1)
           Buffers: shared hit=274 read=1
           -&amp;gt;  CTE Scan on selected_account sa  (cost=0.00..0.02 rows=1 width=4) (actual time=4.298..4.298 rows=1 loops=1)
                 Buffers: shared hit=271
           -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..399.42 rows=20742 width=4) (actual time=0.286..0.287 rows=10 loops=1)
                 Index Cond: (account_id = sa.account_id)
                 Heap Fetches: 0
                 Buffers: shared hit=3 read=1
   -&amp;gt;  CTE Scan on audit_purchases ap  (cost=0.00..414.84 rows=20742 width=4) (actual time=4.587..4.591 rows=10 loops=1)
         Buffers: shared hit=274 read=1
   -&amp;gt;  Index Scan using idx_account_audit on audit_logs al  (cost=0.58..1506157.19 rows=52656088 width=26) (actual time=0.040..0.185 rows=30 loops=10)
         Index Cond: (account_id = ap.account_id)
         Buffers: shared hit=129 read=11
 Planning:
   Buffers: shared hit=8
 Planning Time: 0.238 ms
 Execution Time: 6.519 ms
(31 rows)&lt;/LI-CODE&gt;
&lt;H4&gt;Limit on Purchases&lt;/H4&gt;
&lt;P&gt;Applying LIMIT 1 to the &lt;EM&gt;audit_purchases&lt;/EM&gt; CTE bounds its cardinality to a single row. This makes nested loops cheaper than hash joins during planning.&lt;/P&gt;
&lt;P&gt;PostgreSQL 17 selects an index‑driven execution plan and completes in &lt;STRONG&gt;7.742 ms&lt;/STRONG&gt;, yielding a &lt;STRONG&gt;99.9985% improvement&lt;/STRONG&gt;.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;with selected_account as materialized (
  select account_id
  from accounts
  where account_type = 'HIGH_RISK'
  order by random()
  limit 1
),
audit_purchases as materialized (
  select p.account_id
  from purchases p
  join selected_account sa
    on p.account_id = sa.account_id limit 1
)
select al.*
from audit_logs al where exists (select 1 from audit_purchases ap where al.account_id=ap.account_id);&lt;/LI-CODE&gt;
&lt;H6&gt;Execution plan&lt;/H6&gt;
&lt;LI-CODE lang="c"&gt;                                                                           QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=972.07..933697.99 rows=24600001 width=27) (actual time=5.693..7.686 rows=30 loops=1)
   Buffers: shared hit=276 read=13
   CTE selected_account
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.816..4.817 rows=1 loops=1)
           Buffers: shared hit=271
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.816..4.817 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=271
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.014..3.825 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   CTE audit_purchases
     -&amp;gt;  Limit  (cost=0.44..0.47 rows=1 width=4) (actual time=5.133..5.134 rows=1 loops=1)
           Buffers: shared hit=274 read=1
           -&amp;gt;  Nested Loop  (cost=0.44..292.52 rows=9966 width=4) (actual time=5.132..5.132 rows=1 loops=1)
                 Buffers: shared hit=274 read=1
                 -&amp;gt;  CTE Scan on selected_account sa  (cost=0.00..0.02 rows=1 width=4) (actual time=4.817..4.817 rows=1 loops=1)
                       Buffers: shared hit=271
                 -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..192.84 rows=9966 width=4) (actual time=0.313..0.313 rows=1 loops=1)
                       Index Cond: (account_id = sa.account_id)
                       Heap Fetches: 0
                       Buffers: shared hit=3 read=1
   -&amp;gt;  HashAggregate  (cost=0.02..0.03 rows=1 width=4) (actual time=5.138..5.139 rows=1 loops=1)
         Group Key: ap.account_id
         Batches: 1  Memory Usage: 24kB
         Buffers: shared hit=274 read=1
         -&amp;gt;  CTE Scan on audit_purchases ap  (cost=0.00..0.02 rows=1 width=4) (actual time=5.135..5.135 rows=1 loops=1)
               Buffers: shared hit=274 read=1
   -&amp;gt;  Index Scan using idx_account_audit on audit_logs al  (cost=0.58..686726.47 rows=24600001 width=27) (actual time=0.552..2.534 rows=30 loops=1)
         Index Cond: (account_id = ap.account_id)
         Buffers: shared hit=2 read=12
 Planning Time: 0.216 ms
 Execution Time: 7.742 ms
(35 rows)&lt;/LI-CODE&gt;
&lt;H4&gt;Using subqueries&lt;/H4&gt;
&lt;P&gt;Rewriting the query using scalar subqueries converts the selected account ID into an InitPlan.&lt;/P&gt;
&lt;P&gt;The resulting value is then used as a runtime parameter in index scans against audit_logs. This eliminates join reordering opportunities and guarantees a parameterized access path.&lt;/P&gt;
&lt;P&gt;Both scalar subquery variants complete in approximately 7.3–7.6 ms, achieving over 99.9986% improvement.&lt;/P&gt;
&lt;H5&gt;Subquery Example 1&lt;/H5&gt;
&lt;LI-CODE lang="sql"&gt;select * from audit_logs al where al.account_id in (select p.account_id from purchases p where p.account_id=(
select account_id from accounts where account_type = 'HIGH_RISK' order by random() limit 1));&lt;/LI-CODE&gt;
&lt;H6&gt;Execution plan&lt;/H6&gt;
&lt;LI-CODE lang="c"&gt;                                                                       QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop Semi Join  (cost=972.02..1302907.98 rows=24600001 width=27) (actual time=5.257..7.260 rows=30 loops=1)
   Buffers: shared hit=277 read=12
   InitPlan 1 (returns $0)
     -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.612..4.613 rows=1 loops=1)
           Buffers: shared hit=271
           -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.611..4.611 rows=1 loops=1)
                 Sort Key: (random())
                 Sort Method: top-N heapsort  Memory: 25kB
                 Buffers: shared hit=271
                 -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.012..3.674 rows=10000 loops=1)
                       Filter: (account_type = 'HIGH_RISK'::text)
                       Rows Removed by Filter: 40000
                       Buffers: shared hit=271
   -&amp;gt;  Index Scan using idx_account_audit on audit_logs al  (cost=0.58..686755.98 rows=24600001 width=27) (actual time=5.067..7.059 rows=30 loops=1)
         Index Cond: (account_id = $0)
         Buffers: shared hit=274 read=11
   -&amp;gt;  Materialize  (cost=0.44..242.67 rows=9966 width=4) (actual time=0.006..0.006 rows=1 loops=30)
         Buffers: shared hit=3 read=1
         -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..192.84 rows=9966 width=4) (actual time=0.187..0.188 rows=1 loops=1)
               Index Cond: (account_id = $0)
               Heap Fetches: 0
               Buffers: shared hit=3 read=1
 Planning Time: 0.160 ms
 Execution Time: 7.286 ms
(24 rows)&lt;/LI-CODE&gt;
&lt;H5&gt;Subquery Example 2&lt;/H5&gt;
&lt;LI-CODE lang="sql"&gt;select * from audit_logs al where al.account_id=(select distinct p.account_id from purchases p where p.account_id=(
select account_id from accounts where account_type = 'HIGH_RISK' order by random() limit 1));&lt;/LI-CODE&gt;
&lt;H6&gt;Execution plan&lt;/H6&gt;
&lt;LI-CODE lang="c"&gt;                                                                         QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_account_audit on audit_logs al  (cost=972.04..1507128.65 rows=52656088 width=26) (actual time=5.510..7.637 rows=30 loops=1)
   Index Cond: (account_id = (InitPlan 2).col1)
   Buffers: shared hit=277 read=12
   InitPlan 2
     -&amp;gt;  Limit  (cost=971.44..971.46 rows=1 width=4) (actual time=4.901..4.902 rows=1 loops=1)
           Buffers: shared hit=274 read=1
           InitPlan 1
             -&amp;gt;  Limit  (cost=971.00..971.00 rows=1 width=12) (actual time=4.455..4.456 rows=1 loops=1)
                   Buffers: shared hit=271
                   -&amp;gt;  Sort  (cost=971.00..996.00 rows=10000 width=12) (actual time=4.455..4.455 rows=1 loops=1)
                         Sort Key: (random())
                         Sort Method: top-N heapsort  Memory: 25kB
                         Buffers: shared hit=271
                         -&amp;gt;  Seq Scan on accounts  (cost=0.00..921.00 rows=10000 width=12) (actual time=0.018..3.522 rows=10000 loops=1)
                               Filter: (account_type = 'HIGH_RISK'::text)
                               Rows Removed by Filter: 40000
                               Buffers: shared hit=271
           -&amp;gt;  Index Only Scan using idx_purchases_account on purchases p  (cost=0.44..399.42 rows=20742 width=4) (actual time=4.900..4.900 rows=1 loops=1)
                 Index Cond: (account_id = (InitPlan 1).col1)
                 Heap Fetches: 0
                 Buffers: shared hit=274 read=1
 Planning:
   Buffers: shared hit=4
 Planning Time: 0.154 ms
 Execution Time: 7.663 ms
(25 rows)&lt;/LI-CODE&gt;
&lt;H2&gt;Query execution summary&lt;/H2&gt;
&lt;P&gt;The table below summarizes execution time improvements across all tested rewrites relative to the original PostgreSQL 17 and 14 query execution plans.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 92.5926%; height: 310.4px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Setup / Rewrite&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Execution Time (ms)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Speed‑up Factor (×)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;PG17 original (Hash Semi Join + Seq Scan)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;521,625.433&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;1.0×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;PG14 original query shape&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;7.253&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;71,919×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;Forced nested loop (hashjoin off – diagnostic)&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;8.252&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;63,212×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;LATERAL JOIN + OFFSET 0&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;6.519&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;80,016×&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;LIMIT on purchases&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;7.742&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;67,376×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;Subquery – IN with InitPlan (Example 1)&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;7.286&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;71,593×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 38.8px;"&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;Subquery – scalar subquery (Example 2)&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;7.663&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 38.8px;"&gt;
&lt;P&gt;68,071×&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Key Takeaways&lt;/H2&gt;
&lt;P&gt;While PostgreSQL 17’s planner improvements are correct, intentional, and beneficial for most workloads.&lt;/P&gt;
&lt;P&gt;However, queries that combine &lt;STRONG&gt;CTEs, runtime randomness, and heavily skewed data&lt;/STRONG&gt; can cause the planner to select globally optimal plans that are locally inefficient.&lt;/P&gt;
&lt;P&gt;When runtime values drastically narrow result sets, query rewrites that &lt;STRONG&gt;force parameterized index scans&lt;/STRONG&gt;—such as LATERAL joins, scalar subqueries, or bounded CTEs—provide predictable and stable performance.&lt;/P&gt;</description>
      <pubDate>Thu, 07 May 2026 13:58:01 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/when-postgresql-v17-chooses-the-wrong-plan-a-deep-dive-into-ctes/ba-p/4515705</guid>
      <dc:creator>vinaykumardumpa</dc:creator>
      <dc:date>2026-05-07T13:58:01Z</dc:date>
    </item>
    <item>
      <title>PostgreSQL as your Graph Database in the AI era</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/postgresql-as-your-graph-database-in-the-ai-era/ba-p/4516323</link>
      <description>&lt;P&gt;Enterprise data is full of hidden relationships: citation chains in legal docs, service dependencies, approval hierarchies, and drug interactions. These connections often hold the most valuable insight, but SQL-only and vector search can miss them.&lt;/P&gt;
&lt;P&gt;With &lt;STRONG&gt;Apache AGE&lt;/STRONG&gt; now generally available, &lt;STRONG&gt;AI Functions in ai_extension&lt;/STRONG&gt; in public preview, and &lt;STRONG&gt;graph visualization&lt;/STRONG&gt; shipped in the &lt;STRONG&gt;PostgreSQL VS Code extension&lt;/STRONG&gt;, Azure Database for PostgreSQL Flexible Server gives you everything you need to unlock this structural knowledge without adding a separate graph database to your stack.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Why Graphs? &lt;/STRONG&gt;&lt;STRONG&gt;Because Relationships Are the Blind Spot&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Vector search is great at finding&lt;EM&gt; &lt;/EM&gt;similar content, but it’s weaker when the answer depends on &lt;EM&gt;relationships&lt;/EM&gt;. For example, “does this new vendor contract conflict with existing obligations?” may return a relevant clause, but it won’t follow links across regions, obligation types, and counterparties to prove a real conflict.&lt;/P&gt;
&lt;P&gt;Graph queries fill that gap by following connections across your data to surface paths and patterns that flat retrieval can’t see. Combine graph traversal with AI-based extraction and you get &lt;STRONG&gt;knowledge graph &lt;/STRONG&gt;powered retrieval: LLM answers grounded in both the text and the structure of your data.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Enable Graph Queries Inside PostgreSQL &lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;A href="https://age.apache.org/" target="_blank" rel="noopener"&gt;Apache AGE&lt;/A&gt; adds graph capabilities to PostgreSQL. You can write graph queries in &lt;STRONG&gt;openCypher&lt;/STRONG&gt; and run them right alongside your SQL. That means no separate graph database to provision, no cross-database data movement, and no external synchronization pipeline is required. If you materialize a graph from relational tables, that graph representation still needs to be maintained as the source data changes, but it can be managed inside PostgreSQL with the same enterprise security, transactions, and operational model.&lt;/P&gt;
&lt;P&gt;AGE is now generally available on Azure Database for PostgreSQL Flexible Server on &lt;STRONG&gt;PostgreSQL 16&lt;/STRONG&gt;, &lt;STRONG&gt;PostgreSQL 17 &lt;/STRONG&gt;and with support now extending to &lt;STRONG&gt;PostgreSQL 18&lt;/STRONG&gt;. Key capabilities include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;openCypher&lt;/STRONG&gt; query language for expressive graph traversals&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ACID transactions&lt;/STRONG&gt; - graph operations share PostgreSQL's full transactional guarantees&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;BTREE and GIN indexes&lt;/STRONG&gt; on graph properties for efficient querying at scale&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Mixed SQL + Cypher&lt;/STRONG&gt; - JOIN graph results with relational tables in a single statement&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Here's what it looks like in practice:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Load AGE extension LOAD 'age'; 
SET search_path = ag_catalog, "$user", public;
-- Create a knowledge graph
SELECT ag_catalog.create_graph('company_graph');
-- Query: Who should I talk to about the payment service? 
SELECT *
FROM ag_catalog.cypher(
    'company_graph',
    $$
    MATCH (s:Service {name: 'PaymentService'})
        &amp;lt;-[:OWNS]-(t:Team)
        &amp;lt;-[:MEMBER_OF]-(p:Person)
    WHERE p.active = true
    RETURN p.name, t.name, p.role
    $$
) AS (person agtype, team agtype, role agtype);&lt;/LI-CODE&gt;
&lt;P&gt;That single query traverses from a service to its owning team to its active members, a three-hop relationship that would require nested subqueries or recursive CTEs in pure SQL.&lt;/P&gt;
&lt;P&gt;📘 &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/azure-ai/generative-ai-age-overview" target="_blank" rel="noopener"&gt;Apache AGE Extension — Documentation&lt;/A&gt; | &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/general-availability-of-graph-database-support-in-azure-database-for-postgresql/4413894" target="_blank" rel="noopener"&gt;GA Announcement Blog&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Build Knowledge Graphs from Your Data &lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;The hardest part of working with graphs is building the graph in the first place. &lt;STRONG&gt;AI Functions in ai_extension &lt;/STRONG&gt;(now in Public Preview) solve this by bringing LLM-powered intelligence directly into SQL.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;extract()&lt;/STRONG&gt; is the standout for graph workflows. It discovers hidden relationships and entities from unstructured text, right inside a SQL query. Feed it contracts, support tickets, research papers, or any text-heavy data, and it pulls out the structured relationships you need to populate your knowledge graph.&lt;/P&gt;
&lt;P&gt;The other operators complement the graph pipeline: &lt;STRONG&gt;rank()&lt;/STRONG&gt; re-ranks retrieval results with state-of-the-art models from &lt;A href="https://azure.microsoft.com/products/ai-model-catalog" target="_blank" rel="noopener"&gt;Microsoft Foundry&lt;/A&gt;, &lt;STRONG&gt;is_true()&lt;/STRONG&gt; evaluates natural-language filter conditions, and &lt;STRONG&gt;generate()&lt;/STRONG&gt; produces LLM responses which are all callable from SQL.&lt;/P&gt;
&lt;P&gt;Together, they enable a powerful pattern: extract relationships, store them as a graph in AGE, query the graph, then rank and return results all within PostgreSQL.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Extract relationships from a support ticket
SELECT azure_ai.extract(
    description,
    ARRAY['relationships: object[] - {source, edge, target} triples']
)
FROM support_tickets;

-- Returns:
-- {
--   "relationships": [
--     {"source": "API gateway", "edge": "CAUSED_FAILURE_IN", "target": "auth service"},
--     ...
--   ]
-- }&lt;/LI-CODE&gt;
&lt;P&gt;📘 &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/azure-ai/generative-ai-azure-ai-functions" target="_blank" rel="noopener"&gt;AI Functions — Documentation&lt;/A&gt; | &lt;A href="https://techcommunity.microsoft.com/blog/adforpostgresql/bringing-generative-ai-to-your-data-semantic-operators-in-azure-database-for-pos/4414983" target="_blank" rel="noopener"&gt;Deep Dive Blog&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Visualize Your Graph as You Build It&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;The &lt;A class="lia-external-url" href="https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql" target="_blank" rel="noopener"&gt;PostgreSQL extension for VS Code&lt;/A&gt; now renders graph visualizations automatically from Cypher queries. Run a query, see the nodes and edges. This makes exploring, debugging, and presenting your graph data dramatically easier requiring no separate visualization tool.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;📘 &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/postgresql/developer/vs-code-extension/vs-code-overview#apache-age-graph-visualization" target="_blank" rel="noopener"&gt;PostgreSQL Extension for VS Code&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Build Graph-Augmented AI Applications and Agents with PostgreSQL&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Graph doesn’t work alone. Azure Database for PostgreSQL also includes &lt;STRONG&gt;pgvector + DiskANN&lt;/STRONG&gt; for fast vector search, the &lt;STRONG&gt;Azure AI Extension&lt;/STRONG&gt; to call LLMs from SQL, and &lt;STRONG&gt;MCP Server&lt;/STRONG&gt; support to connect your database to AI agents. Together, they let you build end-to-end &lt;STRONG&gt;Graph-augmented RAG&lt;/STRONG&gt; pipelines in one database right from extraction and embeddings to graph storage, retrieval, ranking, and generation.&lt;/P&gt;
&lt;P&gt;Use the &lt;STRONG&gt;PostgreSQL MCP Server&lt;/STRONG&gt; to connect &lt;STRONG&gt;AI agents&lt;/STRONG&gt; to your database, giving them the ability to traverse graphs, run vector searches, and answer questions grounded in your enterprise data.&lt;/P&gt;
&lt;P&gt;📘 &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/extensions/how-to-use-pgdiskann" target="_blank" rel="noopener"&gt;DiskANN How-To&lt;/A&gt; | &lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/generative-ai-azure-overview" target="_blank" rel="noopener"&gt;Azure AI Extension&lt;/A&gt; | &lt;A href="https://aka.ms/azure-mcp-postgresql" target="_blank" rel="noopener"&gt;MCP Server Blog&lt;/A&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/postgresql/azure-ai/generative-ai-agents" target="_blank" rel="noopener"&gt; | Build AI Agents with PostgreSQL&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Why Build Your Graph on PostgreSQL?&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;You already have the data.&lt;/STRONG&gt; AGE adds graph features next to your existing tables. There’s no migration or separate graph store needed. You can use SQL and Cypher together in one query and transaction.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;One database instead of many.&lt;/STRONG&gt; Keep relational data, graphs, json data, vectors, and LLM calls in one managed service. Simplify backups, security, and billing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enterprise-grade from day one.&lt;/STRONG&gt; Zone-redundant HA, automated geo-backups, Microsoft Entra ID auth, encryption at rest and in transit, all inherited automatically.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Use Cases: Where Graph + AI Unlock What Tables and Vectors Alone Can’t&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Legal research&lt;/STRONG&gt; — Extract citations and holdings, traverse precedent paths, and ground answers with the full citation chain (not just similar text)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fraud detection &amp;amp; AML&lt;/STRONG&gt; — Build entity graphs from transactions and customer data, then use multi-hop traversals and AI summarization to explain suspicious rings, layering, and circular flows&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enterprise knowledge &amp;amp; expertise routing&lt;/STRONG&gt; — Construct a living knowledge graph from docs/tickets/repos; answer “who owns this?” and “who knows this?” with graph reasoning and ranked, source-backed responses&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;IT incident triage &amp;amp; root cause analysis&lt;/STRONG&gt; — Correlate incidents, services dependencies, deployments/config changes; traverse blast radius and generate an RCA narrative with supporting evidence&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Supply chain risk &amp;amp; resiliency&lt;/STRONG&gt; — Extract supplier relationships from contracts and POs, model tier-N dependencies, and let copilots flag sole-source bottlenecks and propose mitigations&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Regulatory compliance automation&lt;/STRONG&gt; — Link regulations, obligations, controls and systems/vendors; run impact analysis on new rules and auto-generate control mapping and gap assessment&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Life sciences knowledge discovery&lt;/STRONG&gt; — Connect drugs, targets, pathways, indications, and adverse events; traverse causal chains and generate explainable interaction/contraindication summaries&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Customer support &amp;amp; case deflection&lt;/STRONG&gt; — Turn tickets, product telemetry, and KB articles into a graph; retrieve via graph paths and generate step-by-step resolutions&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Get Started: Try It Now&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;We've built solution accelerators so you can see graph in action on Azure Database for PostgreSQL today:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Resource&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Link&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Contract Intelligence Platform&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://github.com/james-tn/graph/tree/main/contract_intelligence" target="_blank" rel="noopener"&gt;https://github.com/james-tn/graph/tree/main/contract_intelligence&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Agentic Shop&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/t5/aka.ms/agentic-shop" target="_blank" rel="noopener"&gt;aka.ms/agentic-shop&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;GraphRAG Legal Research Copilot&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://github.com/Azure-Samples/graphrag-legalcases-postgres" target="_blank" rel="noopener"&gt;github.com/Azure-Samples/graphrag-legalcases-postgres&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Build Your Own Advanced AI Copilot&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://github.com/Azure-Samples/postgres-sa-byoac" target="_blank" rel="noopener"&gt;github.com/Azure-Samples/postgres-sa-byoac&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;GraphRAG + Docker + AI Agents&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://github.com/Azure-Samples/postgreSQL-graphRAG-docker" target="_blank" rel="noopener"&gt;github.com/Azure-Samples/postgreSQL-graphRAG-docker&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Microsoft Learn — Implement GraphRAG Lab&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://microsoftlearning.github.io/mslearn-postgresql/Instructions/Labs/16-implement-graph-rag.html" target="_blank" rel="noopener"&gt;aka.ms/mslearn-graphrag&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;AGE MCP Server (Claude Desktop / VS Code)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href="https://github.com/rioriost/age_mcp_server" target="_blank" rel="noopener"&gt;github.com/rioriost/age_mcp_server&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enabling Apache AGE takes minutes : navigate to &lt;STRONG&gt;Server Parameters&lt;/STRONG&gt; in the Azure Portal, enable AGE under &lt;EM&gt;azure.extensions&lt;/EM&gt; and &lt;EM&gt;shared_preload_libraries&lt;/EM&gt;, save, and run&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CREATE EXTENSION age CASCADE;.&lt;/LI-CODE&gt;
&lt;P&gt;That's it, your PostgreSQL database is now a graph database.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Don't Miss the Edges&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;The most valuable knowledge in your data isn't sitting in rows, it's hiding in the &lt;EM&gt;connections between them&lt;/EM&gt;. These relationships are the structural context that makes AI applications genuinely intelligent.&lt;/P&gt;
&lt;P&gt;Enable graph on your Azure Database for PostgreSQL today, and start surfacing the relationships your data has been hiding all along.&lt;/P&gt;</description>
      <pubDate>Mon, 04 May 2026 19:55:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-blog-for-postgresql/postgresql-as-your-graph-database-in-the-ai-era/ba-p/4516323</guid>
      <dc:creator>Aditi_Gupta</dc:creator>
      <dc:date>2026-05-04T19:55:30Z</dc:date>
    </item>
  </channel>
</rss>

