<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Vonng on Medium]]></title>
        <description><![CDATA[Stories by Vonng on Medium]]></description>
        <link>https://medium.com/@fengruohang?source=rss-bf73e424127d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*h_Uo7npHxoQ8H8on2M7RIQ.jpeg</url>
            <title>Stories by Vonng on Medium</title>
            <link>https://medium.com/@fengruohang?source=rss-bf73e424127d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 06 Apr 2026 09:00:08 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@fengruohang/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The ideal way to deliver PostgreSQL extensions]]></title>
            <link>https://medium.com/@fengruohang/the-idea-way-to-deliver-postgresql-extensions-35646464bb71?source=rss-bf73e424127d------2</link>
            <guid isPermaLink="false">https://medium.com/p/35646464bb71</guid>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[distribution]]></category>
            <dc:creator><![CDATA[Vonng]]></dc:creator>
            <pubDate>Mon, 02 Dec 2024 10:00:28 GMT</pubDate>
            <atom:updated>2025-02-23T07:23:14.262Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://medium.com/@fengruohang/postgres-is-eating-the-database-world-157c204dcfc4"><strong>PostgreSQL Is Eating the Database World</strong></a> through the power of <strong>extensibility</strong>. With <a href="https://pigsty.io/ext/list">400</a> extensions powering PostgreSQL, we may not say it’s invincible, but it’s definitely getting much more closer.</p><p>I believe the PostgreSQL community has reached a consensus on the importance of extensions. The real question now is, <strong>“What should we do about it?”</strong></p><p>What’s the biggest problem with PostgreSQL extensions? In think it’s their <strong>accessibility</strong>. Extensions are useless if most users can’t easily install and enable them. But cloud vendors have some inherent limitations (multi-tenancy, security, licensing) that make it hard for them to fully address this issue. To solve this, I’ve built my own solution:</p><p>I’ve created a <a href="https://pigsty.io/ext/usage/repo"><strong>repository</strong></a> that hosts <a href="https://pigsty.io/ext/list"><strong>400</strong></a> of the most capable extensions in the PostgreSQL ecosystem, available as RPM / DEB packages on mainstream Linux distros. The goal? To take PostgreSQL one solid step closer to becoming the all-powerful database and achieve <strong>the great alignment</strong> between the Debian and EL OS ecosystems.</p><blockquote><a href="https://pigsty.cc/blog/pg/pg-ext-repo/#apt-repo"><strong><em>TL;DR: Take me to the HOW-TO part!</em></strong></a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pm3114Hpka_h6fK2.jpg" /></figure><h3>What’s the status quo</h3><p>The PostgreSQL ecosystem is rich with extensions, but how do you actually install and use them? This initial hurdle becomes a roadblock for many. How do we fix this?</p><p>PGXN says, “<em>You can download and compile extensions on the fly with </em><em>pgxnclient.</em>” Tembo says, “<em>I’ve prepared pre-configured extension stack as Docker images for you.</em>” StackGres says, “<em>We build OCI images and offer pre-compiled </em><em>.so files online.</em>” Omnigres says, “<em>we can download </em><em>so on the fly~</em>” All solid ideas.</p><p>But based on my experience, the vast majority of users still rely on their operating system’s package manager to install extensions. On-the-fly compilation and deploying shared libraries might be too risky for prod env, and many DB setups don’t have internet access or a proper toolchain. Even in Docker environments, OS package managers are still commonly used.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hhPhYjvZxW6aXB5Jjf20Qw.png" /></figure><p>Existing package managers like yum/dnf/apt already handle issues like dependency resolution, upgrades, and version management well. There’s no need to reinvent the wheel or disrupt existing standards. So the real question becomes to: Who’s going to package these extensions into ready-to-use software?</p><p>PGDG has already made a fantastic effort with official <a href="https://download.postgresql.org/pub/repos/yum/">YUM</a> and <a href="http://apt.postgresql.org/pub/repos/apt/">APT</a> repositories. In fact, even most PostgreSQL Docker images rely on the PGDG repo to install extensions.</p><p>In addition to the <strong>70</strong> built-in <a href="https://ext.pigsty.io/#/contrib">Contrib</a> extensions bundled with PostgreSQL,the PGDG YUM repo offers <strong>128</strong> RPM extensions, while the APT repo offers <strong>104</strong> DEB extensions. These extensions are compiled and packaged in the same environment as the PostgreSQL kernel, making them easy to install alongside the PostgreSQL binary packages.</p><p>I’m deeply grateful for Devrim’s maintenance of the PGDG YUM repo and Christoph’s work with the APT repo. Their efforts to make PostgreSQL installation and extension management seamless are incredibly valuable. But as a distribution creator myself, I’ve encountered some challenges with PostgreSQL extension distribution.</p><h3>What’s the challenge?</h3><p>The first major issue facing extension users is <strong>Alignment</strong>.</p><p>In the two primary Linux distro camps — Debian and EL — there’s a significant number of PostgreSQL extensions. Excluding the <strong>70</strong> built-in Contrib extensions bundled with PostgreSQL, the YUM repo offers <strong>128</strong> extensions, and the APT repo provides <strong>104</strong>.</p><p>However, when we dig deeper, we see that alignment between the two repos is not ideal. The combined total of extensions across both repos is <strong>153</strong>, but the overlap is just <strong>79</strong>. That means <strong>only half</strong> of the extensions are available in both ecosystems!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MNSd7UYpC_-gGbkV.png" /></figure><blockquote><em>Only half of the extensions are available in both distro!</em></blockquote><p>Next, we run into further alignment issues within each ecosystem itself. The availability of extensions can vary between different major OS versions. For instance, pljava, sequential_uuids, and firebird_fdw are only available in EL9, but not in EL8. Similarly, rdkit is available in Ubuntu 22+ / Debian 12+, but not in Ubuntu 20 / Debian 11. There’s also the issue of architecture support. For example, citus does not provide arm64 packages in the Debian repo.</p><p>And then we have alignment issues across different PostgreSQL major versions. Some extensions won’t compile on older PostgreSQL versions, while others won’t work on newer ones. Some extensions are only available for specific PostgreSQL versions in certain distributions, and so on.</p><p>These alignment issues lead to a significant number of permutations. For example, if we consider five mainstream OS distributions (el8, el9, debian12, ubuntu22, ubuntu24), two CPU architectures (x86_64 and arm64), and six PostgreSQL major versions (12–17), that’s <strong>60-70</strong> RPM/DEB packages per extension—just for one extension!</p><p>On top of alignment, there’s the problem of <strong>completeness</strong>. PGXN lists over <strong>375</strong> extensions, but the PostgreSQL ecosystem could have as many as <a href="https://gist.github.com/joelonsql/e5aa27f8cc9bd22b8999b7de8aee9d47"><strong>1,000+</strong></a>. The PGDG repos, however, contain only about <strong>one-tenth</strong> of them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UCFZu2KtpfJxhcBiCDMcog.png" /><figcaption>lot’s of extensions!</figcaption></figure><p>There are also several powerful new Rust-based extensions that PGDG doesn’t and will not include, such as pg_graphql, pg_jsonschema, and wrappers for <a href="https://pigsty.cc/">self-hosting Supabase</a>; pg_search as an Elasticsearch alternative; and pg_analytics, pg_parquet, pg_mooncake for OLAP processing. The reason? They are too slow to compile… I guess</p><h3>What’s the solution?</h3><p>Over the past six months, I’ve focused on consolidating the PostgreSQL extension ecosystem. Recently, I reached a milestone I’m quite happy with. I’ve created a PG YUM/APT repository with a catalog of <strong>340</strong>available PostgreSQL extensions.</p><p>Here are some key stats for the repo: It hosts <strong>340</strong> extensions in total. Excluding the <strong>70</strong> built-in extensions that come with PostgreSQL, this leaves <strong>270</strong> third-party extensions. Of these, about half are maintained by the official PGDG repos (<strong>126</strong> RPM, <strong>102</strong> DEB). The other half (<strong>131</strong> RPM, <strong>143</strong>DEB) are maintained, fixed, compiled, packaged, and distributed by myself.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i4aAH4Ot0ZHbCYAgXy5Vxg.png" /></figure><p>For each extension, I’ve built versions for the <strong>6</strong> major PostgreSQL versions (12–17) across five popular Linux distributions: EL8, EL9, Ubuntu 22.04, Ubuntu 24.04, and Debian 12. I’ve also provided some limited support for legacy OS versions like EL7, Debian 11, and Ubuntu 20.04.</p><p>This repo also addresses most of the <strong>alignment</strong> issue. Initially, there were extensions in the APT and YUM repos that were unique to each, but I’ve worked to port as many of these unique extensions to the other ecosystem.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0Bc3OzMLtYTJO4X6.png" /></figure><p>Now, only <strong>7</strong> APT extensions are missing from the YUM repo, and <strong>16</strong> extensions are missing in APT — just <strong>6%</strong> of the total. Many missing PGDG extensions have also been resolved.</p><p>I’ve created a comprehensive directory listing all supported extensions, with detailed info, dependency installation instructions, and other important notes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8O83KzZBvNjjA8rm.png" /></figure><p>I hope this repository can serve as the ultimate solution to the frustration users face when extensions are difficult to find, compile, or install.</p><h3>How to use this repo?</h3><p>Now, for a quick plug — what’s the easiest way to install and use these extensions?</p><p>The simplest option is to use the OSS PostgreSQL distribution: <a href="https://ext.pigsty.io/"><strong>Pigsty</strong></a>. The repo is autoconfigured by default, so all you need to do is declare them in the <a href="https://pigsty.cc/docs/setup/config/">config inventory</a>.</p><p>For example, the <a href="https://pigsty.cc/docs/db/supabase">self-hosting supabase</a> template requires extensions that aren’t available in the PGDG repo. You can simply <a href="https://pigsty.cc/docs/pgext/usage/download/">download</a>, <a href="https://pigsty.cc/docs/pgext/usage/install/">install</a>, <a href="https://pigsty.cc/docs/pgext/usage/load/">preload</a>, <a href="https://pigsty.cc/docs/pgext/usage/config">config</a> and <a href="https://pigsty.cc/docs/pgext/usage/create/">create</a> extensions by referring to their names.</p><pre>all:<br>  children:<br>    pg-meta:<br>      hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }<br>      vars:<br>        pg_cluster: pg-meta<br><br>        # INSTALL EXTENSIONS<br>        pg_extensions:<br>          - supabase   # essential extensions for supabase<br>          - timescaledb postgis pg_graphql pg_jsonschema wrappers pg_search pg_analytics pg_parquet plv8 duckdb_fdw pg_cron pg_timetable pgqr<br>          - supautils pg_plan_filter passwordcheck plpgsql_check pgaudit pgsodium pg_vault pgjwt pg_ecdsa pg_session_jwt index_advisor<br>          - pgvector pgvectorscale pg_summarize pg_tiktoken pg_tle pg_stat_monitor hypopg pg_hint_plan pg_http pg_net pg_smtp_client pg_idkit<br><br>        # LOAD EXTENSIONS<br>        pg_libs: &#39;pg_stat_statements, plpgsql, plpgsql_check, pg_cron, pg_net, timescaledb, auto_explain, pg_tle, plan_filter&#39;<br><br>        # CONFIG EXTENSIONS<br>        pg_parameters:<br>          cron.database_name: postgres<br>          pgsodium.enable_event_trigger: off<br><br>        # CREATE EXTENSIONS<br>        pg_databases:<br>          - name: postgres<br>            baseline: supabase.sql<br>            schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]<br>            extensions:<br>              - { name: pgcrypto  ,schema: extensions  }<br>              - { name: pg_net    ,schema: extensions  }<br>              - { name: pgjwt     ,schema: extensions  }<br>              - { name: uuid-ossp ,schema: extensions  }<br>              - { name: pgsodium        }               <br>              - { name: supabase_vault  }               <br>              - { name: pg_graphql      }               <br>              - { name: pg_jsonschema   }               <br>              - { name: wrappers        }               <br>              - { name: http            }               <br>              - { name: pg_cron         }               <br>              - { name: timescaledb     }               <br>              - { name: pg_tle          }               <br>              - { name: vector          }               <br>  vars:<br>    pg_version: 17<br><br>    # DOWNLOAD EXTENSIONS<br>    repo_extra_packages:<br>      - pgsql-main<br>      - supabase   # essential extensions for supabase<br>      - timescaledb postgis pg_graphql pg_jsonschema wrappers pg_search pg_analytics pg_parquet plv8 duckdb_fdw pg_cron pg_timetable pgqr<br>      - supautils pg_plan_filter passwordcheck plpgsql_check pgaudit pgsodium pg_vault pgjwt pg_ecdsa pg_session_jwt index_advisor<br>      - pgvector pgvectorscale pg_summarize pg_tiktoken pg_tle pg_stat_monitor hypopg pg_hint_plan pg_http pg_net pg_smtp_client pg_idkit</pre><p>To simply add extensions to existing clusters:</p><pre>./pgsql.yml -t pg_extension -e &#39;{&quot;pg_extensions&quot;: [citus]}&#39;</pre><p>Through this repo was meant to be used with Pigsty, But it is <strong>not mandatory</strong>. You can always enable this repository on any EL/Debian/Ubuntu system with a simple one-liner in the shell:</p><h3>APT Repo</h3><p>For Ubuntu 22.04 &amp; Debian 12 or any compatible platforms:</p><pre>curl -fsSL https://repo.pigsty.io/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg<br>sudo tee /etc/apt/sources.list.d/pigsty-io.list &gt; /dev/null &lt;&lt;EOF<br>deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/infra generic main <br>deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/pgsql/$(lsb_release -cs) $(lsb_release -cs) main<br>EOF<br>sudo apt update</pre><h3>YUM Repo</h3><p>For EL 8/9 and compatible platforms:</p><pre>curl -fsSL https://repo.pigsty.io/key      | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty &gt;/dev/null  # add gpg key<br>curl -fsSL https://repo.pigsty.io/yum/repo | sudo tee /etc/yum.repos.d/pigsty.repo        &gt;/dev/null  # add repo file<br>sudo yum makecache</pre><h3>What’s in this repo?</h3><p>In this repo, all the extensions are categorized into one of the <strong>15</strong> categories: TIME, GIS, RAG, FTS, OLAP, FEAT, LANG, TYPE, FUNC, ADMIN, STAT, SEC, FDW, SIM, ETL, as shown below.</p><p><a href="https://ext.pigsty.io/#/time"><strong>TIME</strong></a>: <a href="https://ext.pigsty.io/#/timescaledb">timescaledb</a> <a href="https://ext.pigsty.io/#/timescaledb_toolkit">timescaledb_toolkit</a> <a href="https://ext.pigsty.io/#/timeseries">timeseries</a> <a href="https://ext.pigsty.io/#/periods">periods</a> <a href="https://ext.pigsty.io/#/temporal_tables">temporal_tables</a> <a href="https://ext.pigsty.io/#/emaj">emaj</a> <a href="https://ext.pigsty.io/#/table_version">table_version</a> <a href="https://ext.pigsty.io/#/pg_cron">pg_cron</a> <a href="https://ext.pigsty.io/#/pg_later">pg_later</a> <a href="https://ext.pigsty.io/#/pg_background">pg_background</a> <a href="https://ext.pigsty.io/#/gis"><strong>GIS</strong></a>: <a href="https://ext.pigsty.io/#/postgis">postgis</a> <a href="https://ext.pigsty.io/#/postgis_topology">postgis_topology</a> <a href="https://ext.pigsty.io/#/postgis_raster">postgis_raster</a> <a href="https://ext.pigsty.io/#/postgis_sfcgal">postgis_sfcgal</a> <a href="https://ext.pigsty.io/#/postgis_tiger_geocoder">postgis_tiger_geocoder</a> <a href="https://ext.pigsty.io/#/address_standardizer">address_standardizer</a> <a href="https://ext.pigsty.io/#/address_standardizer_data_us">address_standardizer_data_us</a> <a href="https://ext.pigsty.io/#/pgrouting">pgrouting</a> <a href="https://ext.pigsty.io/#/pointcloud">pointcloud</a> <a href="https://ext.pigsty.io/#/pointcloud_postgis">pointcloud_postgis</a> <a href="https://ext.pigsty.io/#/h3">h3</a> <a href="https://ext.pigsty.io/#/h3_postgis">h3_postgis</a> <a href="https://ext.pigsty.io/#/q3c">q3c</a> <a href="https://ext.pigsty.io/#/ogr_fdw">ogr_fdw</a> <a href="https://ext.pigsty.io/#/geoip">geoip</a> <a href="https://ext.pigsty.io/#/pg_polyline">pg_polyline</a> <a href="https://ext.pigsty.io/#/pg_geohash">pg_geohash</a> <a href="https://ext.pigsty.io/#/mobilitydb">mobilitydb</a> <a href="https://ext.pigsty.io/#/earthdistance">earthdistance</a> <a href="https://ext.pigsty.io/#/rag"><strong>RAG</strong></a>: <a href="https://ext.pigsty.io/#/vector">vector</a> <a href="https://ext.pigsty.io/#/vectorscale">vectorscale</a> <a href="https://ext.pigsty.io/#/vectorize">vectorize</a> <a href="https://ext.pigsty.io/#/pg_similarity">pg_similarity</a> <a href="https://ext.pigsty.io/#/smlar">smlar</a> <a href="https://ext.pigsty.io/#/pg_summarize">pg_summarize</a> <a href="https://ext.pigsty.io/#/pg_tiktoken">pg_tiktoken</a> <a href="https://ext.pigsty.io/#/pgml">pgml</a> <a href="https://ext.pigsty.io/#/pg4ml">pg4ml</a> <a href="https://ext.pigsty.io/#/fts"><strong>FTS</strong></a>: <a href="https://ext.pigsty.io/#/pg_search">pg_search</a> <a href="https://ext.pigsty.io/#/pg_bigm">pg_bigm</a> <a href="https://ext.pigsty.io/#/zhparser">zhparser</a> <a href="https://ext.pigsty.io/#/hunspell_cs_cz">hunspell_cs_cz</a> <a href="https://ext.pigsty.io/#/hunspell_de_de">hunspell_de_de</a> <a href="https://ext.pigsty.io/#/hunspell_en_us">hunspell_en_us</a> <a href="https://ext.pigsty.io/#/hunspell_fr">hunspell_fr</a> <a href="https://ext.pigsty.io/#/hunspell_ne_np">hunspell_ne_np</a> <a href="https://ext.pigsty.io/#/hunspell_nl_nl">hunspell_nl_nl</a> <a href="https://ext.pigsty.io/#/hunspell_nn_no">hunspell_nn_no</a> <a href="https://ext.pigsty.io/#/hunspell_pt_pt">hunspell_pt_pt</a> <a href="https://ext.pigsty.io/#/hunspell_ru_ru">hunspell_ru_ru</a> <a href="https://ext.pigsty.io/#/hunspell_ru_ru_aot">hunspell_ru_ru_aot</a> <a href="https://ext.pigsty.io/#/fuzzystrmatch">fuzzystrmatch</a> <a href="https://ext.pigsty.io/#/pg_trgm">pg_trgm</a> <a href="https://ext.pigsty.io/#/olap"><strong>OLAP</strong></a>: <a href="https://ext.pigsty.io/#/citus">citus</a> <a href="https://ext.pigsty.io/#/citus_columnar">citus_columnar</a> <a href="https://ext.pigsty.io/#/columnar">columnar</a> <a href="https://ext.pigsty.io/#/pg_analytics">pg_analytics</a> <a href="https://ext.pigsty.io/#/pg_duckdb">pg_duckdb</a> <a href="https://ext.pigsty.io/#/pg_mooncake">pg_mooncake</a> <a href="https://ext.pigsty.io/#/duckdb_fdw">duckdb_fdw</a> <a href="https://ext.pigsty.io/#/pg_parquet">pg_parquet</a> <a href="https://ext.pigsty.io/#/pg_fkpart">pg_fkpart</a> <a href="https://ext.pigsty.io/#/pg_partman">pg_partman</a> <a href="https://ext.pigsty.io/#/plproxy">plproxy</a> <a href="https://ext.pigsty.io/#/pg_strom">pg_strom</a> <a href="https://ext.pigsty.io/#/tablefunc">tablefunc</a> <a href="https://ext.pigsty.io/#/feat"><strong>FEAT</strong></a>: <a href="https://ext.pigsty.io/#/age">age</a> <a href="https://ext.pigsty.io/#/hll">hll</a> <a href="https://ext.pigsty.io/#/rum">rum</a> <a href="https://ext.pigsty.io/#/pg_graphql">pg_graphql</a> <a href="https://ext.pigsty.io/#/pg_jsonschema">pg_jsonschema</a> <a href="https://ext.pigsty.io/#/jsquery">jsquery</a> <a href="https://ext.pigsty.io/#/pg_hint_plan">pg_hint_plan</a> <a href="https://ext.pigsty.io/#/hypopg">hypopg</a> <a href="https://ext.pigsty.io/#/index_advisor">index_advisor</a> <a href="https://ext.pigsty.io/#/plan_filter">plan_filter</a> <a href="https://ext.pigsty.io/#/imgsmlr">imgsmlr</a> <a href="https://ext.pigsty.io/#/pg_ivm">pg_ivm</a> <a href="https://ext.pigsty.io/#/pgmq">pgmq</a> <a href="https://ext.pigsty.io/#/pgq">pgq</a> <a href="https://ext.pigsty.io/#/pg_cardano">pg_cardano</a> <a href="https://ext.pigsty.io/#/rdkit">rdkit</a> <a href="https://ext.pigsty.io/#/bloom">bloom</a> <a href="https://ext.pigsty.io/#/lang"><strong>LANG</strong></a>: <a href="https://ext.pigsty.io/#/pg_tle">pg_tle</a> <a href="https://ext.pigsty.io/#/plv8">plv8</a> <a href="https://ext.pigsty.io/#/pllua">pllua</a> <a href="https://ext.pigsty.io/#/hstore_pllua">hstore_pllua</a> <a href="https://ext.pigsty.io/#/plluau">plluau</a> <a href="https://ext.pigsty.io/#/hstore_plluau">hstore_plluau</a> <a href="https://ext.pigsty.io/#/plprql">plprql</a> <a href="https://ext.pigsty.io/#/pldbgapi">pldbgapi</a> <a href="https://ext.pigsty.io/#/plpgsql_check">plpgsql_check</a> <a href="https://ext.pigsty.io/#/plprofiler">plprofiler</a> <a href="https://ext.pigsty.io/#/plsh">plsh</a> <a href="https://ext.pigsty.io/#/pljava">pljava</a> <a href="https://ext.pigsty.io/#/plr">plr</a> <a href="https://ext.pigsty.io/#/pgtap">pgtap</a> <a href="https://ext.pigsty.io/#/faker">faker</a> <a href="https://ext.pigsty.io/#/dbt2">dbt2</a> <a href="https://ext.pigsty.io/#/pltcl">pltcl</a> <a href="https://ext.pigsty.io/#/pltclu">pltclu</a> <a href="https://ext.pigsty.io/#/plperl">plperl</a> <a href="https://ext.pigsty.io/#/bool_plperl">bool_plperl</a> <a href="https://ext.pigsty.io/#/hstore_plperl">hstore_plperl</a> <a href="https://ext.pigsty.io/#/jsonb_plperl">jsonb_plperl</a> <a href="https://ext.pigsty.io/#/plperlu">plperlu</a> <a href="https://ext.pigsty.io/#/bool_plperlu">bool_plperlu</a> <a href="https://ext.pigsty.io/#/jsonb_plperlu">jsonb_plperlu</a> <a href="https://ext.pigsty.io/#/hstore_plperlu">hstore_plperlu</a> <a href="https://ext.pigsty.io/#/plpgsql">plpgsql</a> <a href="https://ext.pigsty.io/#/plpython3u">plpython3u</a> <a href="https://ext.pigsty.io/#/jsonb_plpython3u">jsonb_plpython3u</a> <a href="https://ext.pigsty.io/#/ltree_plpython3u">ltree_plpython3u</a> <a href="https://ext.pigsty.io/#/hstore_plpython3u">hstore_plpython3u</a> <a href="https://ext.pigsty.io/#/type"><strong>TYPE</strong></a>: <a href="https://ext.pigsty.io/#/prefix">prefix</a> <a href="https://ext.pigsty.io/#/semver">semver</a> <a href="https://ext.pigsty.io/#/unit">unit</a> <a href="https://ext.pigsty.io/#/md5hash">md5hash</a> <a href="https://ext.pigsty.io/#/asn1oid">asn1oid</a> <a href="https://ext.pigsty.io/#/roaringbitmap">roaringbitmap</a> <a href="https://ext.pigsty.io/#/pgfaceting">pgfaceting</a> <a href="https://ext.pigsty.io/#/pg_sphere">pg_sphere</a> <a href="https://ext.pigsty.io/#/country">country</a> <a href="https://ext.pigsty.io/#/currency">currency</a> <a href="https://ext.pigsty.io/#/pgmp">pgmp</a> <a href="https://ext.pigsty.io/#/numeral">numeral</a> <a href="https://ext.pigsty.io/#/pg_rational">pg_rational</a> <a href="https://ext.pigsty.io/#/uint">uint</a> <a href="https://ext.pigsty.io/#/uint128">uint128</a> <a href="https://ext.pigsty.io/#/ip4r">ip4r</a> <a href="https://ext.pigsty.io/#/uri">uri</a> <a href="https://ext.pigsty.io/#/pgemailaddr">pgemailaddr</a> <a href="https://ext.pigsty.io/#/acl">acl</a> <a href="https://ext.pigsty.io/#/debversion">debversion</a> <a href="https://ext.pigsty.io/#/pg_rrule">pg_rrule</a> <a href="https://ext.pigsty.io/#/timestamp9">timestamp9</a> <a href="https://ext.pigsty.io/#/chkpass">chkpass</a> <a href="https://ext.pigsty.io/#/isn">isn</a> <a href="https://ext.pigsty.io/#/seg">seg</a> <a href="https://ext.pigsty.io/#/cube">cube</a> <a href="https://ext.pigsty.io/#/ltree">ltree</a> <a href="https://ext.pigsty.io/#/hstore">hstore</a> <a href="https://ext.pigsty.io/#/citext">citext</a> <a href="https://ext.pigsty.io/#/xml2">xml2</a> <a href="https://ext.pigsty.io/#/func"><strong>FUNC</strong></a>: <a href="https://ext.pigsty.io/#/topn">topn</a> <a href="https://ext.pigsty.io/#/gzip">gzip</a> <a href="https://ext.pigsty.io/#/zstd">zstd</a> <a href="https://ext.pigsty.io/#/http">http</a> <a href="https://ext.pigsty.io/#/pg_net">pg_net</a> <a href="https://ext.pigsty.io/#/pg_smtp_client">pg_smtp_client</a> <a href="https://ext.pigsty.io/#/pg_html5_email_address">pg_html5_email_address</a> <a href="https://ext.pigsty.io/#/pgsql_tweaks">pgsql_tweaks</a> <a href="https://ext.pigsty.io/#/pg_extra_time">pg_extra_time</a> <a href="https://ext.pigsty.io/#/timeit">timeit</a> <a href="https://ext.pigsty.io/#/count_distinct">count_distinct</a> <a href="https://ext.pigsty.io/#/extra_window_functions">extra_window_functions</a> <a href="https://ext.pigsty.io/#/first_last_agg">first_last_agg</a> <a href="https://ext.pigsty.io/#/tdigest">tdigest</a> <a href="https://ext.pigsty.io/#/aggs_for_vecs">aggs_for_vecs</a> <a href="https://ext.pigsty.io/#/aggs_for_arrays">aggs_for_arrays</a> <a href="https://ext.pigsty.io/#/arraymath">arraymath</a> <a href="https://ext.pigsty.io/#/quantile">quantile</a> <a href="https://ext.pigsty.io/#/lower_quantile">lower_quantile</a> <a href="https://ext.pigsty.io/#/pg_idkit">pg_idkit</a> <a href="https://ext.pigsty.io/#/pg_uuidv7">pg_uuidv7</a> <a href="https://ext.pigsty.io/#/permuteseq">permuteseq</a> <a href="https://ext.pigsty.io/#/pg_hashids">pg_hashids</a> <a href="https://ext.pigsty.io/#/sequential_uuids">sequential_uuids</a> <a href="https://ext.pigsty.io/#/pg_math">pg_math</a> <a href="https://ext.pigsty.io/#/random">random</a> <a href="https://ext.pigsty.io/#/base36">base36</a> <a href="https://ext.pigsty.io/#/base62">base62</a> <a href="https://ext.pigsty.io/#/pg_base58">pg_base58</a> <a href="https://ext.pigsty.io/#/floatvec">floatvec</a> <a href="https://ext.pigsty.io/#/financial">financial</a> <a href="https://ext.pigsty.io/#/pgjwt">pgjwt</a> <a href="https://ext.pigsty.io/#/pg_hashlib">pg_hashlib</a> <a href="https://ext.pigsty.io/#/shacrypt">shacrypt</a> <a href="https://ext.pigsty.io/#/cryptint">cryptint</a> <a href="https://ext.pigsty.io/#/pguecc">pguecc</a> <a href="https://ext.pigsty.io/#/pgpcre">pgpcre</a> <a href="https://ext.pigsty.io/#/icu_ext">icu_ext</a> <a href="https://ext.pigsty.io/#/pgqr">pgqr</a> <a href="https://ext.pigsty.io/#/envvar">envvar</a> <a href="https://ext.pigsty.io/#/pg_protobuf">pg_protobuf</a> <a href="https://ext.pigsty.io/#/url_encode">url_encode</a> <a href="https://ext.pigsty.io/#/refint">refint</a> <a href="https://ext.pigsty.io/#/autoinc">autoinc</a> <a href="https://ext.pigsty.io/#/insert_username">insert_username</a> <a href="https://ext.pigsty.io/#/moddatetime">moddatetime</a> <a href="https://ext.pigsty.io/#/tsm_system_time">tsm_system_time</a> <a href="https://ext.pigsty.io/#/dict_xsyn">dict_xsyn</a> <a href="https://ext.pigsty.io/#/tsm_system_rows">tsm_system_rows</a> <a href="https://ext.pigsty.io/#/tcn">tcn</a> <a href="https://ext.pigsty.io/#/uuid-ossp">uuid-ossp</a> <a href="https://ext.pigsty.io/#/btree_gist">btree_gist</a> <a href="https://ext.pigsty.io/#/btree_gin">btree_gin</a> <a href="https://ext.pigsty.io/#/intarray">intarray</a> <a href="https://ext.pigsty.io/#/intagg">intagg</a> <a href="https://ext.pigsty.io/#/dict_int">dict_int</a> <a href="https://ext.pigsty.io/#/unaccent">unaccent</a> <a href="https://ext.pigsty.io/#/admin"><strong>ADMIN</strong></a>: <a href="https://ext.pigsty.io/#/pg_repack">pg_repack</a> <a href="https://ext.pigsty.io/#/pg_squeeze">pg_squeeze</a> <a href="https://ext.pigsty.io/#/pg_dirtyread">pg_dirtyread</a> <a href="https://ext.pigsty.io/#/pgfincore">pgfincore</a> <a href="https://ext.pigsty.io/#/pgdd">pgdd</a> <a href="https://ext.pigsty.io/#/ddlx">ddlx</a> <a href="https://ext.pigsty.io/#/prioritize">prioritize</a> <a href="https://ext.pigsty.io/#/pg_checksums">pg_checksums</a> <a href="https://ext.pigsty.io/#/pg_readonly">pg_readonly</a> <a href="https://ext.pigsty.io/#/safeupdate">safeupdate</a> <a href="https://ext.pigsty.io/#/pg_permissions">pg_permissions</a> <a href="https://ext.pigsty.io/#/pgautofailover">pgautofailover</a> <a href="https://ext.pigsty.io/#/pg_catcheck">pg_catcheck</a> <a href="https://ext.pigsty.io/#/pre_prepare">pre_prepare</a> <a href="https://ext.pigsty.io/#/pgcozy">pgcozy</a> <a href="https://ext.pigsty.io/#/pg_orphaned">pg_orphaned</a> <a href="https://ext.pigsty.io/#/pg_crash">pg_crash</a> <a href="https://ext.pigsty.io/#/pg_cheat_funcs">pg_cheat_funcs</a> <a href="https://ext.pigsty.io/#/pg_savior">pg_savior</a> <a href="https://ext.pigsty.io/#/table_log">table_log</a> <a href="https://ext.pigsty.io/#/pg_fio">pg_fio</a> <a href="https://ext.pigsty.io/#/pgpool_adm">pgpool_adm</a> <a href="https://ext.pigsty.io/#/pgpool_recovery">pgpool_recovery</a> <a href="https://ext.pigsty.io/#/pgpool_regclass">pgpool_regclass</a> <a href="https://ext.pigsty.io/#/pgagent">pgagent</a> <a href="https://ext.pigsty.io/#/vacuumlo">vacuumlo</a> <a href="https://ext.pigsty.io/#/pg_prewarm">pg_prewarm</a> <a href="https://ext.pigsty.io/#/oid2name">oid2name</a> <a href="https://ext.pigsty.io/#/lo">lo</a> <a href="https://ext.pigsty.io/#/basic_archive">basic_archive</a> <a href="https://ext.pigsty.io/#/basebackup_to_shell">basebackup_to_shell</a> <a href="https://ext.pigsty.io/#/old_snapshot">old_snapshot</a> <a href="https://ext.pigsty.io/#/adminpack">adminpack</a> <a href="https://ext.pigsty.io/#/amcheck">amcheck</a> <a href="https://ext.pigsty.io/#/pg_surgery">pg_surgery</a> <a href="https://ext.pigsty.io/#/stat"><strong>STAT</strong></a>: <a href="https://ext.pigsty.io/#/pg_profile">pg_profile</a> <a href="https://ext.pigsty.io/#/pg_show_plans">pg_show_plans</a> <a href="https://ext.pigsty.io/#/pg_stat_kcache">pg_stat_kcache</a> <a href="https://ext.pigsty.io/#/pg_stat_monitor">pg_stat_monitor</a> <a href="https://ext.pigsty.io/#/pg_qualstats">pg_qualstats</a> <a href="https://ext.pigsty.io/#/pg_store_plans">pg_store_plans</a> <a href="https://ext.pigsty.io/#/pg_track_settings">pg_track_settings</a> <a href="https://ext.pigsty.io/#/pg_wait_sampling">pg_wait_sampling</a> <a href="https://ext.pigsty.io/#/system_stats">system_stats</a> <a href="https://ext.pigsty.io/#/meta">meta</a> <a href="https://ext.pigsty.io/#/pgnodemx">pgnodemx</a> <a href="https://ext.pigsty.io/#/pg_proctab">pg_proctab</a> <a href="https://ext.pigsty.io/#/pg_sqlog">pg_sqlog</a> <a href="https://ext.pigsty.io/#/bgw_replstatus">bgw_replstatus</a> <a href="https://ext.pigsty.io/#/pgmeminfo">pgmeminfo</a> <a href="https://ext.pigsty.io/#/toastinfo">toastinfo</a> <a href="https://ext.pigsty.io/#/explain_ui">explain_ui</a> <a href="https://ext.pigsty.io/#/pg_relusage">pg_relusage</a> <a href="https://ext.pigsty.io/#/pg_top">pg_top</a> <a href="https://ext.pigsty.io/#/pagevis">pagevis</a> <a href="https://ext.pigsty.io/#/powa">powa</a> <a href="https://ext.pigsty.io/#/pageinspect">pageinspect</a> <a href="https://ext.pigsty.io/#/pgrowlocks">pgrowlocks</a> <a href="https://ext.pigsty.io/#/sslinfo">sslinfo</a> <a href="https://ext.pigsty.io/#/pg_buffercache">pg_buffercache</a> <a href="https://ext.pigsty.io/#/pg_walinspect">pg_walinspect</a> <a href="https://ext.pigsty.io/#/pg_freespacemap">pg_freespacemap</a> <a href="https://ext.pigsty.io/#/pg_visibility">pg_visibility</a> <a href="https://ext.pigsty.io/#/pgstattuple">pgstattuple</a> <a href="https://ext.pigsty.io/#/auto_explain">auto_explain</a> <a href="https://ext.pigsty.io/#/pg_stat_statements">pg_stat_statements</a> <a href="https://ext.pigsty.io/#/sec"><strong>SEC</strong></a>: <a href="https://ext.pigsty.io/#/passwordcheck_cracklib">passwordcheck_cracklib</a> <a href="https://ext.pigsty.io/#/supautils">supautils</a> <a href="https://ext.pigsty.io/#/pgsodium">pgsodium</a> <a href="https://ext.pigsty.io/#/supabase_vault">supabase_vault</a> <a href="https://ext.pigsty.io/#/pg_session_jwt">pg_session_jwt</a> <a href="https://ext.pigsty.io/#/anon">anon</a> <a href="https://ext.pigsty.io/#/pg_tde">pg_tde</a> <a href="https://ext.pigsty.io/#/pgsmcrypto">pgsmcrypto</a> <a href="https://ext.pigsty.io/#/pgaudit">pgaudit</a> <a href="https://ext.pigsty.io/#/pgauditlogtofile">pgauditlogtofile</a> <a href="https://ext.pigsty.io/#/pg_auth_mon">pg_auth_mon</a> <a href="https://ext.pigsty.io/#/credcheck">credcheck</a> <a href="https://ext.pigsty.io/#/pgcryptokey">pgcryptokey</a> <a href="https://ext.pigsty.io/#/pg_jobmon">pg_jobmon</a> <a href="https://ext.pigsty.io/#/logerrors">logerrors</a> <a href="https://ext.pigsty.io/#/login_hook">login_hook</a> <a href="https://ext.pigsty.io/#/set_user">set_user</a> <a href="https://ext.pigsty.io/#/pg_snakeoil">pg_snakeoil</a> <a href="https://ext.pigsty.io/#/pgextwlist">pgextwlist</a> <a href="https://ext.pigsty.io/#/pg_auditor">pg_auditor</a> <a href="https://ext.pigsty.io/#/sslutils">sslutils</a> <a href="https://ext.pigsty.io/#/noset">noset</a> <a href="https://ext.pigsty.io/#/sepgsql">sepgsql</a> <a href="https://ext.pigsty.io/#/auth_delay">auth_delay</a> <a href="https://ext.pigsty.io/#/pgcrypto">pgcrypto</a> <a href="https://ext.pigsty.io/#/passwordcheck">passwordcheck</a> <a href="https://ext.pigsty.io/#/fdw"><strong>FDW</strong></a>: <a href="https://ext.pigsty.io/#/wrappers">wrappers</a> <a href="https://ext.pigsty.io/#/multicorn">multicorn</a> <a href="https://ext.pigsty.io/#/odbc_fdw">odbc_fdw</a> <a href="https://ext.pigsty.io/#/jdbc_fdw">jdbc_fdw</a> <a href="https://ext.pigsty.io/#/mysql_fdw">mysql_fdw</a> <a href="https://ext.pigsty.io/#/oracle_fdw">oracle_fdw</a> <a href="https://ext.pigsty.io/#/tds_fdw">tds_fdw</a> <a href="https://ext.pigsty.io/#/db2_fdw">db2_fdw</a> <a href="https://ext.pigsty.io/#/sqlite_fdw">sqlite_fdw</a> <a href="https://ext.pigsty.io/#/pgbouncer_fdw">pgbouncer_fdw</a> <a href="https://ext.pigsty.io/#/mongo_fdw">mongo_fdw</a> <a href="https://ext.pigsty.io/#/redis_fdw">redis_fdw</a> <a href="https://ext.pigsty.io/#/redis">redis</a> <a href="https://ext.pigsty.io/#/kafka_fdw">kafka_fdw</a> <a href="https://ext.pigsty.io/#/hdfs_fdw">hdfs_fdw</a> <a href="https://ext.pigsty.io/#/firebird_fdw">firebird_fdw</a> <a href="https://ext.pigsty.io/#/aws_s3">aws_s3</a> <a href="https://ext.pigsty.io/#/log_fdw">log_fdw</a> <a href="https://ext.pigsty.io/#/dblink">dblink</a> <a href="https://ext.pigsty.io/#/file_fdw">file_fdw</a> <a href="https://ext.pigsty.io/#/postgres_fdw">postgres_fdw</a> <a href="https://ext.pigsty.io/#/sim"><strong>SIM</strong></a>: <a href="https://ext.pigsty.io/#/orafce">orafce</a> <a href="https://ext.pigsty.io/#/pgtt">pgtt</a> <a href="https://ext.pigsty.io/#/session_variable">session_variable</a> <a href="https://ext.pigsty.io/#/pg_statement_rollback">pg_statement_rollback</a> <a href="https://ext.pigsty.io/#/pg_dbms_metadata">pg_dbms_metadata</a> <a href="https://ext.pigsty.io/#/pg_dbms_lock">pg_dbms_lock</a> <a href="https://ext.pigsty.io/#/pg_dbms_job">pg_dbms_job</a> <a href="https://ext.pigsty.io/#/babelfishpg_common">babelfishpg_common</a> <a href="https://ext.pigsty.io/#/babelfishpg_tsql">babelfishpg_tsql</a> <a href="https://ext.pigsty.io/#/babelfishpg_tds">babelfishpg_tds</a> <a href="https://ext.pigsty.io/#/babelfishpg_money">babelfishpg_money</a> <a href="https://ext.pigsty.io/#/pgmemcache">pgmemcache</a> <a href="https://ext.pigsty.io/#/etl"><strong>ETL</strong></a>: <a href="https://ext.pigsty.io/#/pglogical">pglogical</a> <a href="https://ext.pigsty.io/#/pglogical_origin">pglogical_origin</a> <a href="https://ext.pigsty.io/#/pglogical_ticker">pglogical_ticker</a> <a href="https://ext.pigsty.io/#/pgl_ddl_deploy">pgl_ddl_deploy</a> <a href="https://ext.pigsty.io/#/pg_failover_slots">pg_failover_slots</a> <a href="https://ext.pigsty.io/#/wal2json">wal2json</a> <a href="https://ext.pigsty.io/#/wal2mongo">wal2mongo</a> <a href="https://ext.pigsty.io/#/decoderbufs">decoderbufs</a> <a href="https://ext.pigsty.io/#/decoder_raw">decoder_raw</a> <a href="https://ext.pigsty.io/#/test_decoding">test_decoding</a> <a href="https://ext.pigsty.io/#/mimeo">mimeo</a> <a href="https://ext.pigsty.io/#/repmgr">repmgr</a> <a href="https://ext.pigsty.io/#/pg_fact_loader">pg_fact_loader</a> <a href="https://ext.pigsty.io/#/pg_bulkload">pg_bulkload</a></p><p>Check <a href="https://ext.pigsty.io/">ext.pigsty.io</a> for all the details.</p><h3>Some Thoughts</h3><p>Each major PostgreSQL version introduces changes, making the maintenance of <strong>140+</strong> extension packages a bit of a beast.</p><p>Especially when some extension authors haven’t updated their work in years. In these cases, you often have no choice but to take matters into your own hands.</p><p>I’ve personally fixed several extensions and ensured they support the latest PostgreSQL major versions. For those authors I could reach, I’ve submitted numerous PRs and issues to keep things moving forward.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3v7D_HRklgwXFe9E.png" /></figure><p>Back to the point: my goal with this repo is to establish a convenient &amp; standard way for PostgreSQL extension installation and distribution, solving the distribution challenges that have long bother users.</p><p>A recent milestone that excites me is that Vitaliy Kukharik, the author of the popular open-source PostgreSQL high-availability cluster project <a href="https://autobase.tech/docs/extensions/list"><strong>postgresql_cluster</strong></a>, &amp; Omnigres has made this repository the default upstream for PostgreSQL extension installation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_bb_B2ke0gUpLNOXYQp11w.png" /><figcaption><a href="https://x.com/VKukharik/status/1853012121623155117">https://x.com/VKukharik/status/1853012121623155117</a></figcaption></figure><p>Currently, this repository (repo.pigsty.io) is hosted on Cloudflare. In the past month, the repo and its mirrors have served about <strong>300GB</strong> of downloads. Given that most extensions are just a few KB to a few MB, that amounts to nearly <strong>1M downloads per month</strong>.</p><p>Since Cloudflare doesn’t charge for traffic, I can confidently commit to keeping this repository completely free forever.</p><p>I believe my work can help PostgreSQL users worldwide and contribute to the thriving PostgreSQL ecosystem. I hope it proves useful to you as well. <strong>Enjoy PostgreSQL!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35646464bb71" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PGCon.Dev 2024, The conf that shutdown PG for a week]]></title>
            <link>https://medium.com/@fengruohang/pgcon-dev-2024-the-conf-that-shutdown-pg-for-a-week-ad6edef77637?source=rss-bf73e424127d------2</link>
            <guid isPermaLink="false">https://medium.com/p/ad6edef77637</guid>
            <category><![CDATA[database]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[conf]]></category>
            <category><![CDATA[pgcon]]></category>
            <dc:creator><![CDATA[Vonng]]></dc:creator>
            <pubDate>Thu, 20 Jun 2024 09:31:32 GMT</pubDate>
            <atom:updated>2024-06-20T09:55:49.551Z</atom:updated>
            <content:encoded><![CDATA[<h3>PGCon.Dev 2024, The conf that shut PG for a week</h3><p>PGCon.Dev, once known as PGCon — the annual must-attend gathering for PostgreSQL hackers and a key forum for its future direction, has been held in Ottawa since its inception in 2007.</p><p>This year marks a new chapter as the original organizer, Dan, hands over the reins to a new team, and the event moves to SFU’s Harbour Centre in Vancouver, kicking off a new era with grandeur.</p><p>How engaging was this event? <a href="https://peter.eisentraut.org/">Peter Eisentraut</a>, member of the PostgreSQL core team, noted that during PGCon.Dev, <a href="https://peter.eisentraut.org/blog/2024/06/04/how-engaging-was-pgconfdev-really">there were no code commits to PostgreSQL</a> — resulting in the longest pause in twenty years, a whopping week! a historic coding ceasefire! Why? Because all the developers were at the conference!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*r3VlwuYDeeOlifZV.png" /></figure><blockquote><em>Considering previous interruptions was occurred in the early days of the project twenty years ago…</em></blockquote><p>I’ve been embracing PostgreSQL for a decade, but attending a global PG Hacker conference in person was a first for me, and I’m immensely grateful for the organizer’s efforts. PGCon.Dev 2024 wrapped up on May 31st, though this post comes a bit delayed as I’ve been exploring Vancouver and Banff National Park ;)</p><h3>Day Zero: Extension Summit</h3><p>Day zero is for leadership meetings, and I’ve signed up for the afternoon’s Extension Ecosystem Summit.</p><p>Maybe this summit is somewhat subtly related to myrecent post, “<a href="https://medium.com/@fengruohang/postgres-is-eating-the-database-world-157c204dcfc4">Postgres is eating the database world</a>,” highlighting PostgreSQL’s thriving extension ecosystem as a unique and critical success factor and drawing the community’s attention.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_aaBDEfrOMJH-8Lo.jpg" /></figure><p>I participated in David Wheeler’s Binary Packing session along with other PostgreSQL community leaders. And In the latter half of the summit, I attended a session led by Yurii Rashkovskii, discussing extension directory structures, metadata, naming conflicts, version control, and binary distribution ideas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yiLUqoS6dgESLklV.jpg" /></figure><p>Prior to this summit, the PostgreSQL community had held <a href="https://www.eventbrite.com/e/postgres-extension-ecosystem-mini-summit-tickets-851127263557">six mini-summits</a> discussing these topics intensely, with visions for the extension ecosystem’s future development shared by various speakers. Recordings of these sessions are available on <a href="https://www.youtube.com/playlist?list=PL11N188AYb_aT6ulbJfrQJJziWb012jG3">YouTube</a>.</p><p>After the summit, I had a chance to chat with Devrim, the RPM maintainer, about extension packing, which was quite enlightening.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*GWJWk8INoNiTKrhp.gif" /></figure><blockquote><em>“Keith Fan Group” — from Devrim on Extension Summit</em></blockquote><h3>Day One: Brilliant Talks and Bar Social</h3><p>The core of PGCon.Dev lies in its sessions. Unlike some China domestic conferences with mundane product pitches or irrelevant tech details, PGCon.Dev presentations are genuinely engaging and substantive. The official program kicked off on May 29th, after a day of closed-door leadership meetings and the Ecosystem Summit on the 28th.</p><p>The opening was co-hosted by <a href="https://jkatz05.com/">Jonathan Katz</a>, 1 of the 7 core PostgreSQL team members and a chief product manager at AWS RDS, and <a href="https://postgresql.life/post/melanie_plageman/">Melanie Plageman</a>, a recent PG committer from Microsoft. A highlight was when Andres Freund, the developer who uncovered the famous xz backdoor, was celebrated as a superhero on stage.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fMszP8lfadBqJMld.jpeg" /></figure><p>Following the opening, the regular session tracks began. Although conference videos aren’t out yet, I’m confident they’ll “soon” be available on YouTube. Most sessions had three tracks running simultaneously; here are some highlights I chose to attend.</p><h3>Pushing the Boundaries of PG Extensions</h3><p>Yurii’s talk, “<a href="https://slides.omnigr.es/pushing-boundaries-pgconfdev2024/1">Pushing the Boundaries of PG Extensions</a>,” tackled what kind of extension APIs PostgreSQL should offer. PostgreSQL boasts robust extensibility, but the current extension API set is decades old, from the 9.x era. Yurii’s proposal aims to address issues with the existing extension mechanisms. Challenges such as installing multiple versions of an extension simultaneously, avoiding database restarts post-extension installations, managing extensions as seamlessly as data, and handling dependencies among extensions were discussed.</p><p>Yurii and Viggy, founders of <a href="https://omnigres.com/">Omnigres</a>, aim to transform PostgreSQL into a full-fledged application development platform, including hosting HTTP servers directly within the database. They designed a new extension API and management system for PostgreSQL to achieve this. Their innovative improvements represent the forefront of exploration into PostgreSQL’s core extension mechanisms.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HTb5J3yr3e2jd_Yv.png" /></figure><p>I had a great conversation with Viggy and Yurii. Yurii walked me through compiling and installing Omni. I plan to support the Omni extension series in the next version of Pigsty, making this powerful application development framework plug-and-play.</p><h3>Anarchy in DBMS</h3><p>Abigale Kim from CMU, under the mentorship of celebrity professor Andy Pavlo, delivered the talk “<a href="https://abigalekim.github.io/assets/pdf/Anarchy_in_the_Database_PGConfDev2024.pdf">Anarchy in the Database — A Survey and Evaluation of DBMS Extensibility</a>.” This topic intrigued me since Pigsty’s primary value proposition is about PostgreSQL’s <a href="https://pigsty.io/docs/reference/extension/"><strong>extensibility</strong></a>.</p><p>Kim’s research revealed interesting insights: <strong>PostgreSQL is the most extensible DBMS</strong>, supporting 9 out of 10 extensibility points, closely followed by DuckDB. With over 375+ available extensions, PostgreSQL significantly outpaces other databases.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*h1o43GkzavbAd-9R.png" /></figure><p>Kim’s quantitative analysis of compatibility levels among these extensions resulted in a compatibility matrix, unveiling conflicts — most notably, powerful extensions like TimescaleDB and Citus are prone to clashes. This information is very valuable for users and distribution maintainers. <a href="https://abigalekim.github.io/assets/pdf/Anarchy_in_the_Database_PGConfDev2024.pdf">Read the detailed study</a>.</p><p>I joked with Kim that — now I could brag about PostgreSQL’s extensibility with her research data.</p><h3>How PostgreSQL is Misused and Abused</h3><p>The first afternoon session featured <a href="https://postgresql.life/post/karen_jex/">Karen Jex</a> from CrunchyData, an unusual perspective from a user — and a female DBA. Karen shared common blunders by PostgreSQL beginners. While I knew all of what was discussed, it reaffirmed that beginners worldwide make similar mistakes — an enlightening perspective for PG Hackers, who found the session quite engaging.</p><h3>PostgreSQL and the AI Ecosystem</h3><p>The second afternoon session by <a href="https://postgresql.life/post/bruce_momjian/">Bruce Momjian</a>, co-founder of the PGDG and a core committee member from the start, was unexpectedly about using PostgreSQL’s multi-dimensional arrays and queries to implement <a href="https://momjian.us/main/writings/pgsql/AI.pdf">neural network inference and training</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TyK_o61xGL3SIBxL.png" /></figure><blockquote><em>Haha, some ArgParser code. I see it, Bruce 😊</em></blockquote><p>During the lunch, Bruce explained that Jonathan Katz needed a topic to introduce the vector database extension PGVector in the PostgreSQL ecosystem, so Bruce was roped in to “fill the gap.”</p><h3>PB-Level PostgreSQL Deployments</h3><p>The third afternoon session by <a href="https://postgresql.life/post/chris_travers/">Chris Travers</a> discussed their transition from using ElasticSearch for data storage — with a poor experience and high maintenance for 1PB over 30 days retention, to a horizontally scaled PostgreSQL cluster perfectly <a href="https://www.pgevents.ca/events/pgconfdev2024/sessions/session/135/slides/30/">handling 10PB of data</a>. Normally, PostgreSQL comfort levels on a single machine range from several dozen to a few hundred TB. Deployments at the PB scale, especially at 10PB, even within a horizontally scaled cluster, are exceptionally rare. While the practice itself is standard — partitioning and sharding — the scale of data managed is truly impressive.</p><h3>Highlight: When Hardware and Database Collide</h3><p>Undoubtedly, the standout presentation of the event, Margo Seltzer’s talk “<a href="https://www.pgevents.ca/events/pgconfdev2024/schedule/session/192-keynote-when-hardware-and-databases-collide/"><strong>When Hardware and Database Collide</strong></a>” was not only the most passionate and compelling talk I’ve attended live but also a highlight across all conferences.</p><p>Professor Margo Seltzer, formerly of Harvard and now at UBC, a member of the National Academy of Engineering and the creator of BerkeleyDB, delivered a powerful discourse on the core challenges facing databases today. She pinpointed that the bottleneck for databases has shifted from disk I/O to main memory speed. Emerging hardware technologies like <strong>HBM</strong> and <strong>CXL</strong> could be the solution, posing new challenges for PostgreSQL hackers to tackle.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8MEJF1tKV3ay3AIS.png" /></figure><p>This was a refreshing divergence from China’s typically monotonous academic talks, leaving a profound impact and inspiration. Once the conference video is released, I highly recommend checking out her energizing presentation.</p><h3>WetBar Social</h3><p>Following Margo’s session, the official Social Event took place at Rogue Kitchen &amp; Wetbar, just a street away from the venue at Waterfront Station, boasting views of the Pacific and iconic Vancouver landmarks.</p><p>The informal setting was perfect for engaging with new and old peers. Conversations with notable figures like Devrim, Tomasz, Yurii, and Keith were particularly enriching. As an RPM maintainer, I had an extensive and fruitful discussion with Devrim, resolving many longstanding queries.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ttP8PAoz6Qv_JERL.png" /></figure><p>The atmosphere was warm and familiar, with many reconnecting after long periods. A couple of beers in, conversations flowed even more freely among fellow PostgreSQL enthusiasts. The event concluded with an invitation from Melanie for a board game session, which I regretfully declined due to my limited English in such interactive settings.</p><h3>Day 2: Debate, Lunch, and Lighting Talks</h3><h3>Multi-Threading Postgres</h3><p>The warmth from the previous night’s socializing carried over into the next day, marked by the eagerly anticipated session on “<strong>Multi-threaded PostgreSQL</strong>,” which was packed to capacity. The discussion, initiated by Heikki, centered on the pros and cons of PostgreSQL’s process and threading models, along with detailed implementation plans and current progress.</p><p>The threading model promises numerous benefits: cheaper connections (akin to a built-in connection pool), shared relation and plan caches, dynamic adjustment of shared memory, config changes without restarts, more aggressive Vacuum operations, runtime Explain Analyze, and easier memory usage limits per connection. However, there’s significant opposition, maybe led by Tom Lane, concerned about potential bugs, loss of isolation benefits from the multi-process model, and extensive incompatibilities requiring many extensions to be rewritten.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7BBtqncBJ1SZ-gXAfea8mw.jpeg" /></figure><p>Heikki laid out a detailed plan to transition to the threading model over five to seven years, aiming for a seamless shift without intermediate states. Intriguingly, he cited Tom Lane’s critical comment in his presentation:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5O4kMMPKMOkx4NowImFjyA.jpeg" /><figcaption><em>For the record, I think this will be a disaster. There is far too much code that will get broken, largely silently, and much of it is not under our control. — regards, tom lane</em></figcaption></figure><p>Although Tom Lane smiled benignly without voicing any objections, the strongest dissent at the conference came not from him but from an extension maintainer. The elder developer, who maintained several extensions, raised concerns about compatibility, specifically regarding memory allocation and usage. Heikki suggested that extension authors should adapt their work to a new model during a transition grace period of about five years. This suggestion visibly upset the maintainer, who left the meeting in anger.</p><p>Given the proposed threading model’s significant impact on the existing extension ecosystem, I’m skeptical about this change. At the conference, I consulted on the threading model with Heikki, Tom Lane, and other hackers. The community’s overall stance is one of curious &amp; cautious observation. So far, the only progress is in PG 17, where the fork-exec-related code has been refactored and global variables marked for future modifications. Any real implementation would likely not occur until at least PG 20+.</p><h3>Hallway Track</h3><p>The sessions on the second day were slightly less intense than the first, so many attendees chose the “Hallway Track” — engaging in conversations in the corridors and lobby. I’m usually not great at networking as an introvert, but the vibrant atmosphere quickly drew me in. Eye contact alone was enough to spark conversations, like triggering NPC dialogue in an RPG. I also managed to subtly promote Pigsty to every corner of the PG community.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*AeN6g_zR30FwqNTg.jpg" /></figure><p>Despite being a first-timer at PGCon.Dev, I was surprised by the recognition and attention I received, largely thanks to the widely read article, “<a href="https://medium.com/@fengruohang/postgres-is-eating-the-database-world-157c204dcfc4">PostgreSQL is eating the Database world</a>.” Many recognized me by my badge <a href="https://vonng.com/en/">Vonng</a> / <a href="https://pigsty.io/">Pigsty</a>.</p><p>A simple yet effective networking trick is never to underestimate small gifts’ effect. I handed out gold-plated Slonik pins, PostgreSQL’s mascot, which became a coveted item at the conference. Everyone who talked with me received one, and those who didn’t have one were left asking where to get one. LOL</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ah2N7m1IZHcxO8U-.png" /></figure><p>Anyway, I’m glad to have made many new friends and connections.</p><h3>Multinational Community Lunch</h3><p>As for lunch, HighGo hosted key participants from the American, European, Japanese, and Chinese PostgreSQL communities at a Cantonese restaurant in Vancouver. The conversation ranged from serious technical discussions to lighter topics. I’ve made acquaintance with Tatsuro Yamada, who gives a talk, “<a href="https://www.pgevents.ca/events/pgconfdev2024/schedule/session/62-advice-is-seldom-welcome-but-efficacious/">Advice is seldom welcome but efficacious</a>”, and Kyotaro Horiguchi, a core contributor to PostgreSQL known for his work on WAL replication and multibyte string processing and the author of pg_hint_plan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fdL8n2NYVWmNrvXi.jpeg" /></figure><p>Another major contributor to the PostgreSQL community, <strong>Mark Wong</strong> organizes PGUS and has developed a series of PostgreSQL monitoring extensions. He also manages community merchandise like contributor coins, shirts, and stickers. He even handcrafted a charming yarn elephant mascot, which was so beloved that one was sneakily “borrowed” at the last PG Conf US.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3JegEs41XH_4_mcd.png" /></figure><p>Bruce, already a familiar face in the PG Chinese community, Andreas Scherbaum from Germany, organizer of the European PG conferences, and Miao Jian, founder of Han Gao, representing the only Chinese database company at PGCon.Dev, all shared insightful stories and discussions about the challenges and nuances of developing databases in their respective regions.</p><p>On returning to the conference venue, I had a conversation with <a href="https://www.crunchydata.com/news/jan-wieck-former-postgres-core-team-member-joins-crunchy-data">Jan Wieck</a>, a PostgreSQL Hackers Emeritus. He shared his story of participating in the PostgreSQL project from the early days and encouraged me to get more involved in the PostgreSQL community, reminding me its future depends on the younger generation.</p><h3>Making PG Hacking More Inclusive</h3><p>At PGCon.Dev, a special session on community building chaired by Robert Hass, featured three new PostgreSQL contributors sharing their journey and challenges, notably the barriers for non-native English speakers, timezone differences, and emotionally charged email communications.</p><p>Robert emphasized in a post-conference blog <a href="https://rhaas.blogspot.com/2024/06/2024pgconfdev-and-growing-community.html">his desire to see more developers from India and Japan rise to senior positions within PostgreSQL’s ranks</a>, noting the underrepresentation from these countries despite their significant developer communities.</p><blockquote><em>While we’re at it, I’d really like to see more people from India and Japan in senior positions within the project. We have very large developer communities from both countries, but there is no one from either of those countries on the core team, and they’re also underrepresented in other senior positions. At the risk of picking specific examples to illustrate a general point, there is no one from either country on the infrastructure team or the code of conduct committee. We do have a few committers from those countries, which is very good, and I was pleased to see Amit Kapila on the 2024.pgconf.dev organizing commitee, but, overall, I think we are still not where we should be. Part of getting people involved is making them feel like they are not alone, and part of it is also making them feel like progression is possible. Let’s try harder to do that.</em></blockquote><p>Frankly, the lack of mention of China in discussions about inclusivity at PGCon.Dev, in favor of India and Japan, left a bittersweet taste. But I think China deserves the snub, given its poor international community engagement.</p><p>China has hundreds of “domestic/national” databases, many mere forks of PostgreSQL, yet there’s only a single notable Chinese contributor to PostgreSQL is Richard Guo from PieCloudDB, recently promoted to PG Committer. At the conference, the Chinese presence was minimal, summing up to five attendees, including myself. It’s regrettable that China’s understanding and adoption of PostgreSQL lag behind the global standard by about 10–15 years.</p><p>I hope my involvement can bootstrap and enhance Chinese participation in the global PostgreSQL ecosystem, making their users, developers, products, and open-source projects more recognized and accepted worldwide.</p><h3>Lightning Talks</h3><p>Yesterday’s event closed with a series of lightning talks — 5 minutes max per speaker, or you’re out. Concise and punchy, the session wrapped up 11 topics in just 45 minutes. Keith shared improvements to PG Monitor, and Peter Eisentraut discussed SQL standard updates. But from my perspective, the highlight was Devrim Gündüz’s talk on PG RPMs, which lived up to his promise of a “big reveal” made at the bar the previous night, packing a 75-slide presentation into 5 lively minutes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*x-3IJ3rA7iinBtbF.png" /></figure><p>Speaking of PostgreSQL, despite being open-source, most users rely on official pre-compiled binary packages rather than building from source. I maintain 34 RPM extensions for <a href="https://pigsty.io/">Pigsty</a>, my Postgres distribution, but much of the ecosystem, including over a hundred other extensions, is managed by Devrim from the official PGDG repo. His efforts ensure quality for the world’s most advanced and popular database.</p><p>Devrim is a fascinating character — a Turkish native living in London, a part-time DJ, and the maintainer of the PGDG RPM repository, sporting a PostgreSQL logo tattoo. After an engaging chat about the PGDG repository, he shared insights on how extensions are added, highlighting the community-driven nature of PGXN and recent popular additions like pgvector, (<a href="https://github.com/pgvector/pgvector/issues/76">which I made the suggestion haha</a>).</p><p>Interestingly, with the latest Pigsty v2.7 release, four of my maintained (packaging) extensions (pgsql-http, pgsql-gzip, pg_net, pg_bigm) were adopted into the PGDG official repository. Devrim admitted to scouring Pigsty’s <a href="https://pigsty.io/docs/reference/extension/">extension list</a> for good picks, though he humorously dismissed any hopes for my Rust pgrx extensions making the cut, reaffirming his commitment to not blending Go and Rust plugins into the official repository. Our conversation was so enriching that I’ve committed myself to becoming a “PG Extension Hunter,” scouting and recommending new plugins for official inclusion.</p><h3>Day 3: Unconference</h3><p>One of the highlights of PGCon.Dev is the Unconference, a self-organized meeting with no predefined agenda, driven by attendee-proposed topics. On day three, Joseph Conway facilitated the session where anyone could pitch topics for discussion, which were then voted on by participants. My proposal for a <strong>Built-in Prometheus Metrics Exporter</strong> was merged into a broader <strong>Observability</strong> topic spearheaded by Jeremy.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DWHpmTb4pODhvr0q.png" /></figure><p>The top-voted topics were Multithreading (42 votes), Observability (35 votes), and Enhanced Community Engagement (35 votes). Observability features were a major focus, reflecting the community’s priority. I proposed integrating a contrib monitoring extension in PostgreSQL to directly expose metrics via HTTP endpoint, using pg_exporter as a blueprint but embedded to overcome the limitations of external components, especially during crash recovery scenarios.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gV-PA94lsBH_VxIl.png" /></figure><p>There’s a clear focus on observability among the community. As the author of <a href="https://github.com/Vonng/pg_exporter">pg_exporter</a>, I proposed developing a first-party monitoring extension. This extension would integrate Prometheus monitoring endpoints directly into PostgreSQL, exposing metrics via HTTP without needing external components.</p><p>The rationale for this proposal is straightforward. While pg_exporter works well, it’s an external component that adds management complexity. Additionally, in scenarios where PostgreSQL is recovering from a crash and cannot accept new connections, external tools struggle to access internal states. An in-kernel extension could seamlessly capture this information.</p><p>The suggested implementation involves a background worker process similar to the bgw_replstatus extension. This process would listen on an additional port to expose monitoring metrics through HTTP, using pg_exporter as a blueprint. Metrics would primarily be defined via a Collector configuration table, except for a few critical system indicators.</p><p>This idea garnered attention from several PostgreSQL hackers at the event. Developers from EDB and CloudNativePG are evaluating whether <a href="https://github.com/Vonng/pg_exporter">pg_exporter</a> could be directly integrated into their distributions as part of their monitoring solutions. And finally, an Observability Special Interest Group (SIG) was formed by attendees interested in observability, planning to continue discussions through a mailing list.</p><h3>Issue: Support for LoongArch Architecture</h3><p>During the last two days, I have had some discussions with PG Hackers about some Chinese-specific issues.</p><p>A notable suggestion was supporting the LoongArch architecture in the PGDG global repository, which was backed by some enthusiastically local chip and OS manufacturers. Despite the interest, The PGDG maintainer indicated a “No” due to the lack of support for LoongArch in OS Distro used in the PG community, like CentOS 7, Rocky 8/9, and Debian 10/11/12.</p><h3>Issue: Server-side Chinese Character Encoding</h3><p>Jeremy Schneider presented an insightful talk on <strong>Collations</strong> that resonated with me. He highlighted the pitfalls of not using C.UTF8 for collation, a practice I’ve advocated for based on some <a href="https://pigsty.cc/zh/blog/admin/collate/">research</a>, and which is detailed in his presentation here.</p><p>Post-talk, I discussed further with Jeremy and Peter Eisentraut the nuances of character sets/encoding in China, especially the challenges posed by the mandatory <strong>GB-18030</strong> standard, which PostgreSQL can handle on the client side but not the server side. Also, there are some issues about 20 Chinese characters not working on the convert_to + gb18030 encoding mapping.</p><h3>Closing</h3><p>The event closed with Jonathan Katz and Melanie Plageman wrapping up an exceptional conference that leaves us looking forward to next year’s PGCon.Dev 2025 in Canada, possibly in Vancouver, Toronto, Ottawa, or Montreal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*eA49mrY8MjfOn-fj.jpeg" /></figure><p>Inspired by the engagement at this conference, I’m considering presenting on Pigsty or PostgreSQL observability next year.</p><p>Notably, following the conference, Pigsty’s international CDN traffic spiked significantly, highlighting the growing global reach of our PostgreSQL distribution, which really made my day.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*KhQhZ9B8QhVibF0c.png" /></figure><blockquote><em>Pigsty CDN Traffic Growth after PGCon.Dev 2024</em></blockquote><p>Some slides are <a href="https://www.pgevents.ca/events/pgconfdev2024/sessions/">available</a> on the official site, and some blog posts about PGCon.Dev 2024 are here:</p><ul><li><a href="https://andreas.scherbaum.la/post/2024-06-14_postgresql-development-conference-2024-review/">Andreas Scherbaum PostgreSQL Development Conference 2024 — Review</a></li><li><a href="https://wiki.postgresql.org/wiki/PgCon_2024_Developer_Meeting">PgCon 2024 Developer Meeting</a></li><li><a href="https://rhaas.blogspot.com/2024/06/2024pgconfdev-and-growing-community.html">Robert Haas: 2024.pgconf.dev and Growing the Community</a></li><li><a href="https://peter.eisentraut.org/blog/2024/06/04/how-engaging-was-pgconfdev-really">How engaging was PGConf.dev really?</a></li><li><a href="https://www.highgo.ca/2024/06/11/pgconf-dev-2024-shaping-the-future-of-postgresql-in-vancouver/">Cary Huang: PGConf.dev 2024：在温哥华塑造 PostgreSQL 的未来</a></li><li><a href="https://mp.weixin.qq.com/s/C0YyE52KbLLbnG1C2FqGRg">PGCon.Dev 扩展生态峰会小记 @ 温哥华</a></li><li><a href="https://mp.weixin.qq.com/s/4t1thBCDVS8y9dHiOxPZaA">PG大会2024开幕，温哥华饭搭子驴友团呢？</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ad6edef77637" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Postgres is eating the database world]]></title>
            <link>https://medium.com/@fengruohang/postgres-is-eating-the-database-world-157c204dcfc4?source=rss-bf73e424127d------2</link>
            <guid isPermaLink="false">https://medium.com/p/157c204dcfc4</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[extension]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[infrastructure]]></category>
            <dc:creator><![CDATA[Vonng]]></dc:creator>
            <pubDate>Fri, 15 Mar 2024 03:39:59 GMT</pubDate>
            <atom:updated>2024-10-28T01:17:17.798Z</atom:updated>
            <cc:license>http://creativecommons.org/licenses/by/4.0/</cc:license>
            <content:encoded><![CDATA[<p>PostgreSQL isn’t just a simple relational database; it’s a data management framework with the potential to engulf the entire database realm. The trend of “Using Postgres for Everything” is no longer limited to a few elite teams but is becoming a mainstream best practice.</p><h3>OLAP’s New Challenger</h3><p>In a 2016 database meetup, I argued that a significant gap in the PostgreSQL ecosystem was the lack of a <strong>sufficiently good</strong> columnar storage engine for OLAP workloads. While PostgreSQL itself offers lots of analysis features, its performance in full-scale analysis on larger datasets doesn’t quite measure up to dedicated real-time data warehouses.</p><p>Consider <a href="https://benchmark.clickhouse.com/">ClickBench</a>, an analytics performance benchmark, where we’ve documented the performance of PostgreSQL, its ecosystem extensions, and derivative databases. The untuned PostgreSQL performs poorly (<strong>x1050</strong>), but it can reach (<strong>x47</strong>) with optimization. Additionally, there are three analysis-related extensions: columnar store <strong>Hydra</strong> (<strong>x42</strong>), time-series <strong>TimescaleDB</strong> (<strong>x103</strong>), and distributed <strong>Citus</strong> (<strong>x262</strong>).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*D9Q_NCCY_vjWQEeI.png" /><figcaption>Clickbench c6a.4xlarge, 500gb gp2 results in relative time</figcaption></figure><p>This performance can’t be considered bad, especially compared to pure OLTP databases like MySQL and MariaDB (<strong>x3065, x19700</strong>); however, its third-tier performance is not “good enough,” lagging behind the first-tier OLAP components like Umbra, ClickHouse, Databend, SelectDB (<strong>x3~x4</strong>) by an order of magnitude. It’s a tough spot — not satisfying enough to use, but too good to discard.</p><p>However, the arrival of <a href="https://www.paradedb.com/"><strong>ParadeDB</strong></a> and <a href="https://duckdb.org/"><strong>DuckDB</strong></a> changed the game!</p><p><strong>ParadeDB</strong>’s native PG extension <strong>pg_analytics</strong> achieves second-tier performance (<strong>x10</strong>), narrowing the gap to the top tier to just 3–4x. Given the additional benefits, this level of performance discrepancy is often acceptable — ACID, freshness and real-time data without ETL, no additional learning curve, no maintenance of separate services, not to mention its ElasticSearch grade full-text search capabilities.</p><p><strong>DuckDB</strong> focuses on pure OLAP, pushing analysis performance to the extreme (<strong>x3.2</strong>) — excluding the academically focused, closed-source database Umbra, DuckDB is arguably the fastest for practical OLAP performance. It’s not a PG extension, but PostgreSQL can fully leverage DuckDB’s analysis performance boost as an embedded file database through projects like <a href="https://github.com/alitrack/duckdb_fdw"><strong>DuckDB FDW</strong></a>.</p><p>The emergence of ParadeDB and DuckDB propels PostgreSQL’s analysis capabilities to the top tier of OLAP, filling the last crucial gap in its analytic performance.</p><h3>The Pendulum of Database Realm</h3><p>The distinction between OLTP and OLAP didn’t exist at the inception of databases. The separation of OLAP data warehouses from databases emerged in the 1990s due to traditional OLTP databases struggling to support analytics scenarios&#39; query patterns and performance demands.</p><p>For a long time, best practice in data processing involved using MySQL/PostgreSQL for OLTP workloads and syncing data to specialized OLAP systems like Greenplum, ClickHouse, Doris, Snowflake, etc., through ETL processes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*e4vzZ5k5BLRthQzb.png" /><figcaption>DDIA ch3: Republic of OLTP &amp; Kingdom of Analytics</figcaption></figure><p>Like many “specialized databases,” the strength of dedicated OLAP systems often lies in <strong>performance</strong> — achieving 1–3 orders of magnitude improvement over native PostgreSQL or MySQL. The <strong>cost</strong>, however, is redundant data, excessive data movement, lack of agreement on data values among distributed components, extra labor expense for specialized skills, extra licensing costs, limited query language power, programmability and extensibility, limited tool integration, poor data integrity and availability compared with a complete DMBS.</p><p>However, as the saying goes, “What goes around comes around”. With <a href="https://pigsty.io/blog/cloud/bonus/">hardware improving over thirty years following Moore’s Law</a>, performance has increased exponentially while costs have plummeted. In 2024, a single x86 server can have hundreds of cores (512 vCPU, <a href="https://www.amd.com/zh-hans/products/cpu/amd-epyc-9754">EPYC 9754</a> x2), several TBs of RAM, a <a href="https://www.storagereview.com/review/kioxia-cm7-gen5-enterprise-ssd-review">single</a> NVMe SSD can hold <strong>up to</strong> 64TB / 3M 4K rand IOPS / 14GB /s, and a single all-flash rack can reach several PB; object storage like S3 offers virtually unlimited storage.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EPklhaQZ0cWx1_k9.png" /><figcaption>I/O Bandwidth doubles every 3 years</figcaption></figure><p>Hardware advancements have solved the data volume and performance issue, while database software developments (PostgreSQL, ParadeDB, DuckDB) have addressed access method challenges. This puts the fundamental assumptions of the analytics sector — the so-called “big data” industry — <strong>under scrutiny</strong>.</p><p>As DuckDB’s manifesto <a href="https://motherduck.com/blog/big-data-is-dead/">“<strong>Big Data is Dead</strong>”</a> suggests, <strong>the era of big data is over</strong>. Most people don’t have that much data, and most data is seldom queried. The frontier of big data recedes as hardware and software evolve, rendering “big data” unnecessary for 99% of scenarios.</p><p>If 99% of use cases can now be handled on a single machine with standalone PostgreSQL / DuckDB (and its replicas), what’s the point of using dedicated analytics components? If every smartphone can send and receive text freely, what’s the point of pagers? (With the caveat that North American hospitals still use pagers, indicating that maybe less than 1% of scenarios might genuinely need “big data.”)</p><p>The shift in fundamental assumptions is steering the database world from a phase of diversification back to convergence, from a big bang to a mass extinction. In this process, a new era of unified, multi-modeled, super-converged databases will emerge, reuniting OLTP and OLAP. But who will lead this monumental task of reconsolidating the database field?</p><h3>PostgreSQL: The Database World Eater</h3><p>There are a plethora of niches in the database realm: time-series, geospatial, document, search, graph, vector databases, message queues, and object databases. PostgreSQL makes its presence felt across all these domains.</p><p>A case in point is the PostGIS extension, which sets the de facto standard in geospatial databases; the TimescaleDB extension awkwardly positions “generic” time-series databases; and the vector extension, <strong>PGVector</strong>, turns the dedicated vector database niche into a punchline.</p><p>This isn’t the first time; we’re witnessing it again in the oldest and largest subdomain: OLAP analytics. But PostgreSQL’s ambition doesn’t stop at OLAP; it’s eyeing the entire database world!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XmRLMYe-9kjvnghqbppEew.png" /><figcaption><em>Pigsty &amp; PGDG has 345 </em><a href="https://ext.pigsty.io/#/list"><strong><em>extensions</em></strong></a><em> available. And there are </em><a href="https://gist.github.com/joelonsql/e5aa27f8cc9bd22b8999b7de8aee9d47"><em>1000+</em></a><em> more in the ecosystem</em></figcaption></figure><p>What makes PostgreSQL so capable? Sure, it’s advanced, but so is Oracle; it’s open-source, as is MySQL. PostgreSQL’s edge comes from being <strong>both advanced and open-source</strong>, allowing it to compete with Oracle/MySQL. But its true uniqueness lies in its <strong>extreme extensibility and thriving extension ecosystem</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XErRY2DBfSm1V65H.png" /><figcaption><em>Reasons users </em><a href="https://www.timescale.com/state-of-postgres/2022"><em>choose PostgreSQL</em></a><em>:</em><strong><em> Open-Source, Reliable, Extensible</em></strong></figcaption></figure><h3>The Magic of Extreme Extensibility</h3><p>PostgreSQL isn’t just a relational database; it’s a data management framework capable of engulfing the entire database galaxy. Besides being open-source and advanced, its core competitiveness stems from <strong>extensibility</strong>, i.e., its infra’s reusability and extension&#39;s composability.</p><p>PostgreSQL allows users to develop extensions, leveraging the database’s common infra to deliver features at minimal cost. For instance, the vector database extension <a href="https://github.com/pgvector/pgvector">pgvector</a>, with just several thousand lines of code, is negligible in complexity compared to PostgreSQL’s millions of lines. Yet, this “insignificant” extension achieves complete vector data types and indexing capabilities, <a href="https://supabase.com/blog/pgvector-vs-pinecone">outperforming</a> lots of specialized vector databases.</p><p>Why? Because pgvector’s creators didn’t need to worry about the database’s general additional complexities: ACID, recovery, backup &amp; PITR, high availability, access control, monitoring, deployment, 3rd-party ecosystem tools, client drivers, etc., which require millions of lines of code to solve well. They only focused on the essential complexity of their problem.</p><p>For example, ElasticSearch was developed on the Lucene search library, while the Rust ecosystem has an improved next-gen full-text search library, <a href="https://github.com/quickwit-oss/tantivy"><strong>Tantivy</strong></a>, as a Lucene alternative. ParadeDB only needs to wrap and connect it to PostgreSQL’s interface to offer search services comparable to ElasticSearch. More importantly, it can stand on the shoulders of PostgreSQL, leveraging the entire PG ecosystem’s united strength (e.g., hybrid search with pgvector) to “unfairly” compete with another dedicated database.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rAKht1g7baIusqIS_UJErA.png" /><figcaption><a href="https://ext.pigsty.io/#/list">PostgreSQL Extension Pedia</a></figcaption></figure><p>The extensibility brings another huge advantage: the <strong>composability</strong> of extensions, allowing different extensions to work together, creating a synergistic effect where 1+1 » 2. For instance, TimescaleDB can be combined with PostGIS for spatial-temporal data support; the BM25 extension for full-text search can be combined with the PGVector extension, providing hybrid search capabilities.</p><p>Furthermore, the <strong>distributive </strong>extension <a href="https://www.citusdata.com/"><strong>Citus</strong></a> can transparently transform a standalone cluster into a horizontally partitioned distributed database cluster. This capability can be orthogonally combined with other features, making PostGIS a distributed geospatial database, PGVector a distributed vector database, ParadeDB a distributed full-text search database, and so on.</p><p>What’s more powerful is that extensions <strong>evolve independently</strong>, without the cumbersome need for main branch merges and coordination. This allows for scaling — PG’s extensibility lets numerous teams explore database possibilities in parallel, with all extensions being optional, not affecting the core functionality’s reliability. Those features that are mature and robust have the chance to be stably integrated into the main branch.</p><p>PostgreSQL achieves both foundational <strong>reliability</strong> and <strong>agile functionality</strong> through the magic of extreme extensibility, making it an outlier in the database world and changing the game rules of the database landscape.</p><h3>Game Changer in the DB Arena</h3><p><strong>The emergence of PostgreSQL has shifted the paradigms in the database domain</strong>: Teams endeavoring to craft a “new database kernel” now face a formidable trial — how to stand out against the open-source, feature-rich Postgres. What’s their unique value proposition?</p><p>Until a revolutionary hardware breakthrough occurs, the advent of practical, new, general-purpose database kernels seems unlikely. No singular database can match the overall prowess of PG, bolstered by all its extensions — not even Oracle, given PG’s ace of being open-source and free ;-)</p><p>A niche database product might carve out a space for itself if it can outperform PostgreSQL by an order of magnitude in specific aspects (typically performance). However, it usually doesn’t take long before the PostgreSQL ecosystem spawns open-source extension alternatives. Opting to develop a PG extension rather than a whole new database gives teams a crushing speed advantage in playing catch-up!</p><p>Following this logic, the PostgreSQL ecosystem is poised to snowball, accruing advantages and inevitably moving towards a monopoly, mirroring the Linux kernel’s status in server OS within a few years. Developer surveys and database trend reports confirm this trajectory.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GTKU4XL4iP6HOn_nfHqZ1w.jpeg" /><figcaption><a href="https://survey.stackoverflow.co/2024/technology#1-databases"><strong><em>StackOverflow 2024 Survey: PostgreSQL, the Decathlete</em></strong></a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hd57xnerJkpMXAsE7xhskw.png" /><figcaption><a href="https://demo.pigsty.cc/d/sf-survey"><strong><em>StackOverflow’s Database Trends Over the Past 8 Years</em></strong></a></figcaption></figure><p>PostgreSQL has long been the favorite database in HackerNews &amp; StackOverflow. Many new open-source projects default to PostgreSQL as their primary, if not only, database choice. And many new-gen companies are going All in PostgreSQL.</p><p>As “<a href="https://www.amazingcto.com/postgres-for-everything/"><strong>Radical Simplicity: Just Use Postgres</strong></a>” says, Simplifying tech stacks, reducing components, accelerating development, lowering risks, and adding more features can be achieved by <strong>“Just Use Postgres.”</strong> Postgres can replace many backend technologies, including MySQL, Kafka, RabbitMQ, ElasticSearch, Mongo, and Redis, effortlessly serving millions of users. <strong>Just Use Postgres</strong> is no longer limited to a few elite teams but becoming a mainstream best practice.</p><h3>What Else Can Be Done?</h3><p>The endgame for the database domain seems predictable. But what can we do, and what should we do?</p><p>PostgreSQL is already a near-perfect database kernel for the vast majority of scenarios, making the idea of a kernel “bottleneck” absurd. Forks of PostgreSQL and MySQL that tout kernel modifications as selling points are essentially going nowhere.</p><p>This is similar to the situation with the Linux OS kernel today; despite the plethora of Linux distros, everyone opts for the same kernel. Forking the Linux kernel is seen as creating unnecessary difficulties, and the industry frowns upon it.</p><p>Accordingly, the main conflict is no longer the database kernel itself but two directions— database <strong>extensions</strong> and <strong>services</strong>! The former pertains to internal extensibility, while the latter relates to external composability. Much like the OS ecosystem, the competitive landscape will concentrate on <strong>database distributions</strong>. In the database domain, only those distributions centered around extensions and services stand a chance for ultimate success.</p><p>Kernel remains lukewarm, with MariaDB, the fork of MySQL’s parent, nearing delisting, while AWS, profiting from offering services and extensions on top of the free kernel, thrives. Investment has flowed into numerous PG ecosystem extensions and service distributions: Citus, TimescaleDB, Hydra, PostgresML, ParadeDB, FerretDB, StackGres, Aiven, Neon, Supabase, Tembo, PostgresAI, and our own PG distro — — <a href="https://pigsty.io/">Pigsty</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DNfkLm1ynfbE_eLDXyZr_A.png" /><figcaption>PostgreSQL Ecosystem Landscape</figcaption></figure><p>A dilemma within the PostgreSQL ecosystem is the independent evolution of many extensions and tools, lacking a unifier to synergize them. For instance, Hydra releases its own package and Docker image, and so does PostgresML, each distributing PostgreSQL images with their own extensions and only their own. These images and packages are far from comprehensive database services like AWS RDS.</p><p>Even service providers and ecosystem integrators like AWS fall short in front of numerous extensions, unable to include many due to various reasons (AGPLv3 license, security challenges with multi-tenancy), thus failing to leverage the synergistic amplification potential of PostgreSQL ecosystem extensions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DDrfCcJuFvsNeTLmP2Vl_A.png" /><figcaption><em>Many important extensions are not available on Cloud RDS (PG 16, 2024–02–29), Check the full extension list for details: </em><a href="https://pigsty.io/docs/reference/extension/"><strong>Pigsty RDS &amp; PGDG</strong></a><strong> / </strong><a href="https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-extensions.html"><strong>AWS RDS PG</strong></a><strong> / </strong><a href="https://help.aliyun.com/zh/rds/apsaradb-rds-for-postgresql/extensions-supported-by-apsaradb-rds-for-postgresql"><strong>Aliyun RDS PG</strong></a></figcaption></figure><p>Extensions are the soul of PostgreSQL. A Postgres without the freedom to use extensions is like cooking without salt, a giant constrained.</p><p>Addressing this issue is one of our primary goals.</p><h3>Our Resolution: Pigsty</h3><p>Despite earlier exposure to MySQL and MSSQL, when I first used PostgreSQL in 2015, I was convinced of its future dominance in the database realm. Nearly a decade later, I’ve transitioned from a user and administrator to a contributor and developer, witnessing PG’s march toward that goal.</p><p>Interactions with diverse users revealed that the shortcoming in the database field isn’t the kernel anymore— PostgreSQL is already sufficient. The real issue is <strong>leveraging the kernel’s capabilities</strong>, which is the reason behind RDS’s booming success.</p><p>However, I believe this capability should be as accessible as free software, like the PostgreSQL kernel itself — available to every user, not just renting from cyber feudal lords.</p><p>Thus, I created <a href="https://pigsty.io/"><strong>Pigsty</strong></a>, a battery-included, local-first PostgreSQL distribution as an open-source RDS Alternative, which aims to harness the collective power of PostgreSQL ecosystem <strong>extensions</strong> and democratize access to production-grade database <strong>services</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d9EL487yZU9z4ail8uPUgw.png" /><figcaption><em>Pigsty stands for </em><strong><em>P</em></strong><em>ostgreSQL </em><strong><em>i</em></strong><em>n </em><strong><em>G</em></strong><em>reat </em><strong><em>STY</em></strong><em>le</em></figcaption></figure><p>We’ve defined six core propositions addressing the central issues in PostgreSQL database services: <strong>Extensible Postgres</strong>, <strong>Reliable Infras</strong>, <strong>Observable Graphics</strong>, <strong>Available Services</strong>, <strong>Maintainable Toolbox</strong>, and <strong>Composable Modules</strong>.</p><p>The initials of these value propositions offer another acronym for Pigsty:</p><blockquote><strong><em>P</em></strong><em>ostgres, </em><strong><em>I</em></strong><em>nfras, </em><strong><em>G</em></strong><em>raphics, </em><strong><em>S</em></strong><em>ervice, </em><strong><em>T</em></strong><em>oolbox, </em><strong><em>Y</em></strong><em>ours.</em></blockquote><blockquote><em>Your graphical Postgres infrastructure service toolbox.</em></blockquote><p><strong>Extensible PostgreSQL</strong> is the linchpin of this distribution. In the recently launched <a href="https://github.com/Vonng/pigsty/releases/tag/v2.6.0"><strong>Pigsty v2.6</strong></a>, we integrated DuckDB FDW and ParadeDB extensions, massively boosting PostgreSQL’s analytical capabilities and ensuring every user can easily harness this power.</p><p>Our aim is to integrate the strengths within the PostgreSQL ecosystem, creating a synergistic force akin to the <strong>Ubuntu</strong> of the database world. I believe the kernel debate is settled, and the real competitive frontier lies here.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fVVGuQO7u4ILmdsTSq5I4g.png" /><figcaption><a href="https://pigsty.io">Pigsty</a>: https://pigsty.io</figcaption></figure><p>Developers, your choices will shape the future of the database world. I hope my work helps you better utilize the world’s most advanced open-source database kernel: <strong>PostgreSQL</strong>.</p><blockquote><a href="https://pigsty.io/blog/pg/pg-eat-db-world/">Read in Pigsty’s Blog</a> | <a href="https://github.com/Vonng/pigsty">GitHub Repo: Pigsty</a> | <a href="https://pigsty.io/">Pigsty Website</a> | <a href="https://ext.pigsty.io/#/list">PG Extensions</a></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=157c204dcfc4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Database in Kubernetes: Is that a good idea?]]></title>
            <link>https://medium.com/@fengruohang/database-in-kubernetes-is-that-a-good-idea-daf5775b5c1f?source=rss-bf73e424127d------2</link>
            <guid isPermaLink="false">https://medium.com/p/daf5775b5c1f</guid>
            <category><![CDATA[postgres]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[Vonng]]></dc:creator>
            <pubDate>Sun, 10 Dec 2023 12:03:48 GMT</pubDate>
            <atom:updated>2024-03-15T04:12:25.499Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><a href="https://mp.weixin.qq.com/s/4a8Qy4O80xqsnytC4l9lRg"><em>WeChat Column</em></a></blockquote><p>Whether databases should be housed in Kubernetes/Docker remains highly controversial. While Kubernetes (k8s) excels in managing stateless applications, it has fundamental drawbacks with stateful services, especially databases like PostgreSQL and MySQL.</p><p>In the previous article, “<a href="https://vonng.com/cn/blog/en/db-in-k8s/">Databases in Docker: Good or Bad</a>,” we discussed the pros and cons of containerizing databases. Today, let’s delve into the trade-offs in orchestrating databases in K8S and explore why it’s not a wise decision.</p><h3>Abstract</h3><p>Kubernetes (k8s) is an exceptional container orchestration tool aimed at helping developers better manage a vast array of complex stateless applications. Despite its offerings like StatefulSet, PV, PVC, and LocalhostPV for supporting stateful services (i.e., databases), these features are still insufficient for running production-level databases that demand higher reliability.</p><p>Databases are more like “<strong>pets</strong>” than “<strong>cattle</strong>” and require careful nurturing. Treating databases as “cattle” in K8S essentially turns external disk/file system/storage services into new “database pets.” Running databases on EBS/network storage presents significant disadvantages in reliability and performance. However, using high-performance local NVMe disks will make the database bound to nodes and non-schedulable, negating the primary purpose of putting them in K8S.</p><p>Placing databases in K8S results in a <strong>“lose-lose”</strong> situation — K8S loses its simplicity in statelessness, lacking the flexibility to quickly relocate, schedule, destroy, and rebuild like purely stateless use. On the other hand, databases suffer several crucial attributes: reliability, security, performance, and complexity costs, in exchange for limited “elasticity” and utilization — something virtual machines can also achieve. For users outside public cloud vendors, the disadvantages far outweigh the benefits.</p><p>The “<strong>cloud-native frenzy</strong>,” exemplified by K8S, has become a distorted phenomenon: adopting k8s for the sake of k8s. Engineers add extra complexity to increase their irreplaceability, while managers fear being left behind by the industry and getting caught up in deployment races. Using tanks for tasks that could be done with bicycles, to gain experience or prove oneself, without considering if the problem needs such “dragon-slaying” techniques — this kind of architectural juggling will eventually lead to adverse outcomes.</p><p>Until the reliability and performance of the network storage surpass local storage, placing databases in K8S is an unwise choice. There are other ways to seal the complexity of database management, such as RDS and open-source RDS solutions like <a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247485518&amp;idx=1&amp;sn=3d5f3c753facc829b2300a15df50d237&amp;chksm=fe4b3d95c93cb4833b8e80433cff46a893f939154be60a2a24ee96598f96b32271301abfda1f&amp;scene=21#wechat_redirect"><strong>Pigsty</strong></a>, which are based on bare Metal or bare OS. Users should make wise decisions based on their situations and needs, carefully weighing the pros and cons.</p><h3><a href="https://vonng.com/cn/blog/en/db-in-k8s/#the-status-quo">The Status Quo</a></h3><p>K8S excels in orchestrating stateless application services but was initially limited to stateful services. Despite not being the intended purpose of K8S and Docker, the community’s zeal for expansion has been unstoppable. Evangelists depict K8S as the next-generation cloud operating system, asserting that databases will inevitably become regular applications within Kubernetes. Various abstractions have emerged to support stateful services: StatefulSet, PV, PVC, and LocalhostPV.</p><p>Countless cloud-native enthusiasts have attempted to migrate existing databases into K8S, resulting in a proliferation of CRDs and Operators for databases. Taking PostgreSQL as an example, there are already more than ten different K8S deployment solutions available: PGO, StackGres, CloudNativePG, PostgresOperator, PerconaOperator, CYBERTEC-pg-operator, TemboOperator, Kubegres, KubeDB, KubeBlocks, and so on. The CNCF landscape rapidly expands, turning into a playground of complexity.</p><p>However, complexity is a cost. With “cost reduction” becoming mainstream, voices of reflection have begun to emerge. Could-Exit Pioneers like DHH, who deeply utilized K8S in public clouds, abandoned it due to its excessive complexity during the transition to <a href="https://mp.weixin.qq.com/s/CicctyvV1xk5B-AsKfzPjw">self-hosted open-source solutions</a>, relying only on Docker and a Ruby tool named Kamal as alternatives. Many began to question whether stateful services like databases suit Kubernetes.</p><p>K8S itself, in its effort to support stateful applications, has become increasingly complex, straying from its original intention as a container orchestration platform. Tim Hockin, a co-founder of Kubernetes, also voiced his rare concerns at this year’s KubeCon in <a href="https://mp.weixin.qq.com/s/9Q9kze9D2LT0-G2lXSvADg">“K8s is Cannibalizing Itself!”</a>: “<strong><em>Kubernetes has become too complex; it needs to learn restraint, or it will stop innovating and lose its base</em></strong>.”</p><h3><a href="https://vonng.com/cn/blog/en/db-in-k8s/#lose-lose-situation">Lose-Lose Situation</a></h3><p>In the cloud-native realm, the analogy of “pets” versus “cattle” is often used for illustrating stateful services. “Pets,” like databases, need careful and individual care, while “cattle” represent disposable, stateless applications (Disposability).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*b42frWD1sJXthZvU.png" /></figure><blockquote><em>Cloud Native Applications 12 Factors: </em><strong><em>Disposability</em></strong></blockquote><p>One of the leading architectural goals of K8S is to <strong>treat what can be treated as cattle as cattle</strong>. The attempt to “separate storage from computation” in databases follows this strategy: splitting stateful database services into state storage outside K8S and pure computation inside K8S. The state is stored on the EBS/cloud disk/distributed storage service, allowing the “stateless” database part to be freely created, destroyed, and scheduled in K8S.</p><p>Unfortunately, databases, especially OLTP databases, heavily depend on disk hardware, and network storage’s reliability and performance still lag behind local disks by <a href="https://mp.weixin.qq.com/s/UxjiUBTpb1pRUfGtR9V3ag">orders of magnitude</a>. Thus, K8S offers the LocalhostPV option, allowing containers to use data volumes directly lies on the host operating system, utilizing high-performance/high-reliability local NVMe disk storage.</p><p>However, this presents a dilemma: should one use subpar cloud disks and tolerate poor database reliability/performance for K8S’s scheduling and orchestration capabilities? Or use high-performance local disks tied to host nodes, virtually losing all flexible scheduling abilities? The former is like stuffing an anchor into K8S’s small boat, slowing overall speed and agility; the latter is like anchoring and pinning the ship to a specific point.</p><p>Running a stateless K8S cluster is simple and reliable, as is running a stateful database on a physical machine’s bare operating system. Mixing the two, however, results in a <strong>lose-lose situation</strong>: <strong><em>K8S loses its stateless flexibility and casual scheduling abilities, while the database sacrifices core attributes like reliability, security, efficiency, and simplicity in exchange for elasticity, resource utilization, and Day1 delivery speed that are not fundamentally important to databases</em></strong>.</p><p>A vivid example of the former is the performance optimization of <a href="https://mp.weixin.qq.com/s/SCImfwEvkCPqZhLGx758Sw">PostgreSQL@K8S</a>, which KubeBlocks contributed. K8S experts employed various advanced methods to solve performance issues that did not exist on bare metal/bare OS at all. A fresh case of the latter is Didi’s <a href="https://mp.weixin.qq.com/s/FIOB_Oqefx1oez1iu7AGGg">K8S architecture juggling disaster</a>; if it weren’t for putting the stateful MySQL in K8S, would rebuilding a stateless K8S cluster and redeploying applications take 12 hours to recover?</p><h3><a href="https://vonng.com/cn/blog/en/db-in-k8s/#pros-and-cons">Pros and Cons</a></h3><p>For serious technology decisions, the most crucial aspect is weighing the pros and cons. Here, in the order of “quality, security, performance, cost,” let’s discuss the technical trade-offs of placing databases in K8S versus classic bare metal/VM deployments. I don’t want to write a comprehensive paper that covers everything. Instead, I’ll throw some specific questions for consideration and discussion.</p><p><strong>Quality</strong></p><p>K8S, compared to physical deployments, introduces additional failure points and architectural complexity, increasing the blast radius and significantly prolonging the average recovery time of failures. In <a href="https://mp.weixin.qq.com/s/kFftay1IokBDqyMuArqOpg">“Is it a Good Idea to Put Databases into Docker?”</a>, we provided an argument about reliability, which can also apply to Kubernetes — K8S and Docker introduce additional and unnecessary dependencies and failure points to databases, lacking community failure knowledge accumulation and reliability track record (MTTR/MTBF).</p><p>In the cloud vendor classification system, K8S belongs to PaaS, while RDS belongs to a more fundamental layer, IaaS. <strong>Database services have higher reliability requirements than K8S</strong>; for instance, many companies’ cloud management platforms rely on an additional CMDB database. Where should this database be placed? You shouldn’t let K8S manage things it depends on, nor should you add unnecessary extra dependencies. The <a href="https://mp.weixin.qq.com/s/OIlR0rolEQff9YfCpj3wIQ">Alibaba Cloud global epic failure</a> and <a href="https://mp.weixin.qq.com/s/FIOB_Oqefx1oez1iu7AGGg">Didi’s K8S architecture juggling disaster</a> have taught us this lesson. Moreover, maintaining a separate database system inside K8S when there’s already one outside is even more unjustifiable.</p><p><strong>Security</strong></p><p>The database in a multi-tenant environment introduces additional attack surfaces, bringing higher risks and more complex audit compliance challenges. Does K8S make your database more secure? Maybe the complexity of K8S architecture juggling will deter script kiddies unfamiliar with K8S, but for real attackers, more components and dependencies often mean a broader attack surface.</p><p>In <a href="https://mp.weixin.qq.com/s/Tvuy0kAiqh66sOwkr3WWMA">“BrokenSesame Alibaba Cloud PostgreSQL Vulnerability Technical Details”</a>, security personnel escaped to the K8S host node using their own PostgreSQL container and accessed the K8S API and other tenants’ containers and data. This is clearly a K8S-specific issue — the risk is real, such attacks have occurred, and even Alibaba Cloud, a local cloud industry leader, has been compromised.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*FhvtvVpvVTh-LbB2.png" /></figure><blockquote><em>《</em><a href="https://www.youtube.com/watch?v=d81qnGKv4EE"><em>The Attacker Perspective — Insights From Hacking Alibaba Cloud</em></a></blockquote><p><strong>Performance</strong></p><p>As stated in <a href="https://mp.weixin.qq.com/s/kFftay1IokBDqyMuArqOpg">“Is it a Good Idea to Put Databases into Docker?”</a>, whether it’s additional network overhead, Ingress bottlenecks, or underperforming cloud disks, all negatively impact database performance. For example, as revealed in <a href="https://mp.weixin.qq.com/s/SCImfwEvkCPqZhLGx758Sw">“PostgreSQL@K8s Performance Optimization”</a> , you need considerable technical prowess to make database performance in K8S barely match that on bare metal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-GlYjydRnQTKAQCg.png" /></figure><blockquote><em>Latency is measured in </em><strong><em>ms</em></strong><em>, not </em><strong><em>µs</em></strong></blockquote><p>Another misconception about efficiency is resource utilization. Unlike offline analytical businesses, critical online OLTP databases should not aim to increase resource utilization but rather deliberately lower it to enhance system reliability and user experience. If there are many fragmented businesses, resource utilization can be improved through PDB/shared database clusters. K8S’s advocated elasticity efficiency is not unique to it — KVM/EC2 can also effectively address this issue.</p><p>In terms of <strong>cost</strong>, K8S and various Operators provide a decent abstraction, encapsulating some of the complexity of database management, which is attractive for teams without DBAs. However, the complexity reduced by using it to manage databases pales in comparison to the complexity introduced by using K8S itself. For instance, random IP address drifts and automatic Pod restarts may not be a big issue for stateless applications, but for databases, they are intolerable — many companies have had to attempt to modify kubelet to avoid this behavior, thereby introducing more complexity and maintenance costs.</p><p>As stated in <a href="https://mp.weixin.qq.com/s/FIOB_Oqefx1oez1iu7AGGg">“From Reducing Costs and Smiles to Reducing Costs and Efficiency”</a> “Reducing Complexity Costs” section: <strong>Intellectual power is hard to accumulate spatially</strong>: when a database encounters problems, it needs database experts to solve them; when Kubernetes has problems, it needs K8S experts to look into them; however, when you put a database into Kubernetes, complexities combine, the state space explodes, but the intellectual bandwidth of individual database experts and K8S experts is hard to stack — you need a dual expert to solve the problem, and such experts are undoubtedly much rarer and more expensive than pure database experts. Such architectural juggling is enough to cause major setbacks for most teams, including top public clouds/big companies, in the event of a failure.</p><h3><a href="https://vonng.com/cn/blog/en/db-in-k8s/#the-cloud-native-frenzy">The Cloud-Native Frenzy</a></h3><p>An interesting question arises: if K8S is unsuitable for stateful databases, why are so many companies, including big players, rushing to do this? The reasons are not technical.</p><p>Google open-sourced its K8S battleship, modeled after its internal Borg spaceship, and managers, fearing being left behind, rushed to adopt it, thinking using K8S would put them on par with Google. Ironically, Google doesn’t use K8S; it was more likely to disrupt AWS and mislead the industry. However, most companies don’t have the manpower like Google to operate such a battleship. More importantly, their problems might need a simple vessel. Running MySQL + PHP, PostgreSQL + Go/Python on bare metal has already taken many companies to IPO.</p><p>Under <a href="https://mp.weixin.qq.com/s/1OSRcBfd58s0tgZTUZHB9g">modern hardware conditions</a>, the complexity of most applications throughout their lifecycle doesn’t justify using K8S. Yet, the “cloud-native” frenzy, epitomized by K8S, has become a distorted phenomenon: adopting k8s just for the sake of k8s. Some engineers are looking for “advanced” and “cool” technologies used by big companies to fulfill their personal goals like job hopping or promotions or to increase their job security by adding complexity, not considering if these “dragon-slaying” techniques are necessary for solving their problems.</p><p>The cloud-native landscape is filled with fancy projects. Every new development team wants to introduce something new: Helm today, Kubevela tomorrow. They talk big about bright futures and peak efficiency, but in reality, they create a mountain of architectural complexities and a playground for “YAML Boys” — tinkering with the latest tech, inventing concepts, earning experience and reputation at the expense of users who bear the complexity and maintenance costs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NoA0TNOJmbRmFsCT.png" /></figure><blockquote><em>CNCF Landscape</em></blockquote><p>The cloud-native movement’s philosophy is compelling — democratizing the elastic scheduling capabilities of public clouds for every user. K8S indeed excels in stateless applications. However, excessive enthusiasm has led K8S astray from its original intent and direction — simply doing well in orchestrating stateless applications, burdened by the ill-conceived support for stateful applications.</p><h3>Making Wise Decisions</h3><p>Years ago, when I first encountered K8S, I too was fervent — — It was at TanTan. We had over twenty thousand cores and hundreds of database clusters, and I was eager to try putting databases in Kubernetes and testing all the available Operators. However, after two to three years of extensive research and architectural design, I calmed down and abandoned this madness. Instead, I architected our database service based on bare metal/operating systems. For us, the benefits K8S brought to databases were negligible compared to the problems and hassles it introduced.</p><p>Should databases be put into K8S? It depends: for public cloud vendors who thrive on overselling resources, elasticity and utilization are crucial, which are directly linked to revenue and profit, While reliability and performance take a back seat — after all, an availability below three nines means <a href="https://vonng.com/cn/blog/cloud/sla/">compensating 25% monthly credit</a>. But for most user, including ourselves, these trade-offs hold different: One-time Day1 Setup, elasticity, and resource utilization aren’t their primary concerns; reliability, performance, Day2 Operation costs, these core database attributes are what matter most.</p><p>We open-sourced our database service architecture — an out-of-the-box PostgreSQL distribution and a local-first RDS alternative: <a href="https://vonng.com/cn/blog/db/pigsty-intro/">Pigsty</a>. We didn’t choose the so-called “build once, run anywhere” approach of K8S and Docker. Instead, we adapted to different <a href="https://mp.weixin.qq.com/s/xHG8OURTYlmnQTorFkzioA">OS distros</a> &amp; major versions, and used Ansible to achieve a K8S CRD IaC-like API to seal management complexity. This was arduous, but it was the right thing to do — the world does not need another clumsy attempt at putting PostgreSQL into K8S. Still, it does need a production database service architecture that maximizes hardware performance and reliability.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Pn4WuBUvXbpN4dGl.png" /></figure><blockquote><em>Pigsty vs StackGres</em></blockquote><p>Perhaps one day, when the reliability and performance of distributed network storage surpass local storage and mainstream databases have some native support for storage-computation separation, things might change again — K8S might become suitable for databases. But for now, I believe putting serious production OLTP databases into K8S is immature and inappropriate. I hope readers will make wise choices on this matter.</p><h3><a href="https://vonng.com/cn/blog/en/db-in-k8s/#reference">Reference</a></h3><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486572&amp;idx=1&amp;sn=274a51976bf8ae5974beb1d3173380c1&amp;chksm=fe4b39b7c93cb0a14c4d99f8ffd1e00c36b972a8058fd99e9d06e6035c4f378b6d327892260b&amp;scene=21#wechat_redirect"><strong>Database in Docker: Is that a good idea?</strong></a></p><p><a href="https://mp.weixin.qq.com/s/9Q9kze9D2LT0-G2lXSvADg"><strong>《Kubernetes创始人发声！K8s在被反噬！》</strong></a></p><p><a href="https://mp.weixin.qq.com/s/EWCblHU-vDC3ebV6ITE45A"><strong>《Docker 的诅咒：曾以为它是终极解法，最后却是“罪大恶极”？》</strong></a></p><p><a href="https://mp.weixin.qq.com/s/KFZCQFP1oB5YOrT3tHBRCQ"><strong>《从滴滴的故障我们能学到什么》</strong></a></p><p><a href="https://mp.weixin.qq.com/s/0kbWa6AnkCr5jkN4WIgu5Q"><strong>《PostgreSQL@K8s 性能优化记》</strong></a></p><p><a href="https://questdb.io/blog/databases-on-k8s/"><strong>《Running Database on Kubernetes》</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486489&amp;idx=1&amp;sn=f2be1be496de46ac5ca816ac39cfdf24&amp;chksm=fe4b39c2c93cb0d4ff50dd6962370523a6271eab478fe9174c0c7a88fc88ea05fd3e51313ad3&amp;scene=21#wechat_redirect"><strong>重新拿回计算机硬件的红利</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486527&amp;idx=1&amp;sn=8e26f644f2b908fd21c83b81d329155d&amp;chksm=fe4b39e4c93cb0f22271127a154a6ac5c45947b2051b06b7667ee5c203d136b5d2e8f6577b10&amp;scene=21#wechat_redirect"><strong>从降本增笑到真的降本增效</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486489&amp;idx=1&amp;sn=f2be1be496de46ac5ca816ac39cfdf24&amp;chksm=fe4b39c2c93cb0d4ff50dd6962370523a6271eab478fe9174c0c7a88fc88ea05fd3e51313ad3&amp;scene=21#wechat_redirect"><strong>重新拿回计算机硬件的红利</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486468&amp;idx=1&amp;sn=7fead2b49f12bc2a2a94aae942403c22&amp;chksm=fe4b39dfc93cb0c92e5d4c67241de0519ae6a23ce6f07fe5411b95041accb69e5efb86a38150&amp;scene=21#wechat_redirect"><strong>我们能从阿里云史诗级故障中学到什么</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247486366&amp;idx=1&amp;sn=c28407399af8b1ddeadf93e902ed23cc&amp;chksm=fe4b3e45c93cb753dfd3cdbdd4eacd05ae6ce7d83eadf3105718cfa20180d6c3244652d88cc7&amp;scene=21#wechat_redirect"><strong>是时候放弃云计算了吗？</strong></a></p><p><a href="http://mp.weixin.qq.com/s?__biz=MzU5ODAyNTM5Ng==&amp;mid=2247485601&amp;idx=1&amp;sn=5521562d414b547a192b3dbc45ce720f&amp;chksm=fe4b3d7ac93cb46c37f64f61593a102eb0a6c624a95fe37e0cccf2c03c766cda5ad268671e14&amp;scene=21#wechat_redirect"><strong>云SLA是不是安慰剂？</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=daf5775b5c1f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PostgreSQL：世界上最成功的数据库]]></title>
            <link>https://medium.com/@fengruohang/postgresql-%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E6%88%90%E5%8A%9F%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93-ffb265779015?source=rss-bf73e424127d------2</link>
            <guid isPermaLink="false">https://medium.com/p/ffb265779015</guid>
            <category><![CDATA[software]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[trends]]></category>
            <category><![CDATA[postgres]]></category>
            <dc:creator><![CDATA[Vonng]]></dc:creator>
            <pubDate>Fri, 30 Jun 2023 00:37:56 GMT</pubDate>
            <atom:updated>2023-06-30T00:37:56.755Z</atom:updated>
            <content:encoded><![CDATA[<p>2023 年 StackOverflow 调研结果已经新鲜出炉，来自185个国家与地区的9万名开发者给出了高质量的反馈。在今年的调研中，PostgreSQL 在数据库全部三项调研指标（流行度，喜爱度，需求度）上获得无可争议的全能冠军，成为真正意义上“最成功”的数据库 — — “<em>PostgreSQL is the Linux of Database!</em>”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TJGyed63zxw1XLRcLw9C0g.png" /><figcaption><a href="http://demo.pigsty.cc/d/sf-db-survey">http://demo.pigsty.cc/d/sf-db-survey</a></figcaption></figure><p>当我们说一个数据库“成功”时，究竟在说什么？评价一个数据库有许多标准：功能、质量、安全、性能、成本，但没有哪种可以普世泛用。不过 Succeed 既代表成功，又代表继承，所以成功与“后继有人”相通。对一项技术而言，用户的规模、喜好、需求决定了生态的繁荣程度，唯有这种最终存在意义上的神意裁决 — — 才能让所有人心服口服。而连续进行7年的 StackOverflow 年度开发者调研为我们窥见技术发展流行趋势打开了一扇窗户。</p><p><strong>PostgreSQL现在是全世界最流行的数据库<br>PostgreSQL是开发者最喜爱欣赏的数据库！<br>PostgreSQL是用户需求最为强烈的数据库！</strong></p><p>流行度代表过去，喜爱度代表现在，需求度代表将来，这三个指标很好地反映了一项技术的生命力。存量与增量，时与势都站在 PostgreSQL 一侧，恐怕在几年内恐怕都不会有任何能挑战 PostgreSQL 地位的竞争对手。<br>作为 PostgreSQL 忠实的用户，社区成员，专家，布道师与贡献者，从拥抱 PostgreSQL 的那一刻起，我就相信会有这一天，然而亲自见证这一刻，仍然让我感慨良多。遂撰此文，聊一聊这件事背后的 Why 与 What。</p><p>推荐阅读：StackOverflow 2022 往期调研结果回顾：《<a href="https://zhuanlan.zhihu.com/p/542019272">为什么PostgreSQL将成为最成功的数据库？</a>》</p><h3>数据的来源：社区调研</h3><p>数据库的用户是开发者，而没有比直接问开发者们更有代表性的调研方式了。StackOverflow 调研结果中提供了 流行，欣赏，渴望 三个结果指标，但这三项数据都来自同一个巧妙设计的问卷题目：</p><blockquote><em>“在过去一年中，您在哪些数据库环境中进行了密集的开发工作，您又希望在接下来一年在哪些数据库上工作？如果你过去一年用了这个数据库，来年还希望接着用，那么就在两个复选框上都打勾”。<br>“Which database environments have you done extensive development work in over the past year, and which do you want to work in over the next year? If you both worked with the database and want to continue to do so, please check both boxes in that row.”</em></blockquote><p>每个数据库后都有两个复选框，如果开发者在第一个框上打勾，即去年我在用此数据库，那么就会被标记为“使用者”（Used）；如果开发者在第二个框上打勾，即来年我想用这个数据库，那么会被标记为“需求者”（Wanted）；而两个框都打勾的开发者，会被标记为 “赞赏者”（Loved / Admired）。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uymSD2ealNaivf_n.jpg" /><figcaption><a href="https://survey.stackoverflow.co/2023">https://survey.stackoverflow.co/2023</a></figcaption></figure><p>使用者占总体的比例，就是流行度，或使用率，在上图左边用柱状图表示。需求者占总体的比例，就是需求度，或渴望度，在上图右边以蓝点表示。赞赏者占现有使用者的比例，就是欣赏度，或喜爱度/口碑，在上图右边以红点表示。不难看出，2023年，PostgreSQL 在流行度上甩开 MySQL，成为世界上最流行的数据库。在需求度和口碑上更是远远甩开其他数据库独树一帜。</p><p>同样的问题连续问了七年，如果我们结合这过去七年的变迁，把排名前10的主流数据库流行度 — 净喜爱度 画在一张二维散点图上，那么就能更容易地获得一些关于数据库领域的发展变迁的洞察，对形成正确的比例感很有帮助。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*RYVD8BL6ufzq3y1Tdjc9UQ.gif" /><figcaption>X轴为流行度，Y轴为净喜爱程度（2*喜爱度% — 100），图元大小与流行度与喜爱度的几何平均数成正比。</figcaption></figure><p>在 2023年的当下切面中，四个角落被四种数据库占据：右上角是最为流行且最受欢迎的 PostgreSQL，右下角是流行但不受待见的 MySQL，左上角是流行程度一般但备受喜爱的 Redis，左下角是过气且不受待见的 Oracle。在四者中间，坐落着相对中庸的 SQLite，MongoDB 与 SQL Server。</p><p>结合时间轴不难看出，PostgreSQL 的流行程度与受欢迎程度在持续增长；MySQL 的受欢迎程度变化不大但流行度暴跌；Redis 与 SQLite 整体上在进步，而 MongoDB 开始见顶回落，SQL Server 和 Oracle 这两种商业关系型数据库最近几年都在持续走下坡路。</p><p>从图中我们可以得出一个基本的判断：在未来几年中，数据库领域都不会出现足以挑战 PostgreSQL 的对手。PostgreSQL 在数据库领域的地位，已经如同 Linux 在服务器操作系统上的地位一样难以撼动。</p><h3>过去的积累：流行度</h3><blockquote><em>PostgreSQL — — 世界上最流行的数据库</em></blockquote><p>一项技术使用者占总体的比例，就是流行度。它的含义是：过去一年有多少比例的用户使用了这项技术。流行度代表过去一年的积累使用，是存量指标，也是最核心的事实指标。<br>在 2023 年， “最先进” PostgreSQL 在所有开发者中以 45.6% 的使用率，首次超过“最流行”数据库 MySQL 41.1%，领先 4.5% ，使用率是第二名 MySQL 的1.1倍。对于专业开发者（约占总样本的3/4）来说，PostgreSQL 的使用率在去年（2022）就已经超过 MySQL 了，以 46.5% vs 45.7% 领先0.8个百分点，在 2023 年，这一差距进一步拉大到 49.1% vs 40.6，领先 8.5% — — 换句话说，专业开发者中，PostgreSQL 的使用率已经是 MySQL 的 1.2 倍了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DgC11vNQAGgaVY-o" /></figure><p>过去几年，MySQL 一直霸占着数据库流行榜的榜首，洋洋得意地打起了 ”世界上最流行的开源关系型数据库“ 这一旗号。不过这次，”最流行“的桂冠真的要让给 PostgreSQL 了。在流行度上，其他数据库和 PostgreSQL / MySQL 比根本就不是一个重量级，自然就更不用说了。</p><p>更重要的的是变化趋势：在长期列入排名的十几款头部数据库中，只有 PostgreSQL 的流行度是持续上升的，保持着高歌猛进的增长势头，而其他所有的数据库使用率都在下行。此消彼长，随着时间的推移，PostgreSQL 与其他数据库的流行度差距只会进一步拉大 — — 因此在相当长的一段时间内，恐怕是看不到有任何挑战者能撼动 PostgreSQL 现在的位置了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qKSD7txrcU22lj_M" /></figure><p>流行度反映的是当下数据库的规模势能，而喜爱度反映的是未来数据库的增长潜能。</p><h3>现在的动能：喜爱度</h3><blockquote><em>PostgreSQL — — 最受开发者喜爱的数据库</em></blockquote><p>所谓“口碑”，喜爱度（Loved）或欣赏度（Admired），指的是有多少比例的用户愿意继续使用此项技术，这是一个年度的“留存率”指标，可以反映用户对一项技术的看法与评价。</p><p>2023 年， PostgreSQL 蝉联最受开发者喜爱的数据库。过去几年 Redis 一直是用户最喜欢的数据库。直到 2022 年，PostgreSQL 第一次超过 Redis，成为最受开发者喜爱的数据库。PostgreSQL 和 Redis 的口碑一直在伯仲之间（70%），并与其他后来者拉开了非常显著的差距。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MoJspSg7NI9QosiK" /></figure><p>作为一个交叉印证，在 2022 PostgreSQL 社区年度调研中，对于 PostgreSQL 的存量用户来说，使用程度加深，用量加大的比例（蓝/粉）对于用量萎缩的比例（黄绿）占据了压倒性多数，足以说明基本盘留存的稳定程度。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SwCooF3pwGQ3q0w5" /><figcaption><a href="https://www.timescale.com/state-of-postgres/2022">https://www.timescale.com/state-of-postgres/2022</a></figcaption></figure><p>Redis是简单易用的数据结构缓存服务器，经常会与关系型数据库 PostgreSQL 搭配使用，广受开发者喜爱（但流行度一般，只有20%，位列第六）。在后面的交叉分析环节我们也可以看到这两者之间有着所有数据库间最为强烈的羁绊 — — 86% 的 Redis 用户想要使用 PostgreSQL，而 30% 的 PostgreSQL 用户想要使用 Redis。</p><p>其他评价正面的数据库包括：SQLite，MongoDB，SQL Server 等。MySQL 和 ElasticSearch 的口碑在 50% 中线算毁誉参半。榜上最不受用户待见的数据库为 Access、 IBM DB2 、CouchDB，Couchbase，以及 Oracle。<br>并不是所有潜能，都可以转换为实打实的动能。用户的喜爱并不一定会付诸行动，而这就是第三项指标所要回答的问题 — — 需求度。</p><h3>未来的趋势：需求度</h3><blockquote><em>PostgreSQL — — 需求量最大的数据库</em></blockquote><p>需求者占总体的比例，就是需求率（Wanted），或渴望度（Desired）。它的含义是，接下来一年有多少比例的用户会实际选择使用此项技术。 在需求度 / 渴望度 这一项中，PostgreSQL 一骑绝尘，远远甩开其他数据库。以 42.3% 的比例连续第二年获得第一，且保持着一往无前的增长态势。不断与后来者拉开距离。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6Bp9ChzpxQFQBkcZ" /></figure><p>在 2023 年，一些数据库的需求量出现了显著增长。大概率是因为由 OpenAI ChatGPT 所引领的大语言模型AI浪潮所致：对智能的需求拉动了对数据基础设施的需求。10年前，对 JSONB/GIN 等 NoSQL 特性的支持奠定了 PostgreSQL 在互联网黄金时代的蓬勃发展，而今天，第一个构建在成熟数据库上的向量扩展 pgvector ，更是让 PostgreSQL 有了进入 AI 时代的船票，为下个十年的增长准备好了敲门砖。</p><h3>但是，为什么呢？</h3><p>PostgreSQL 在需求率， 使用率，喜爱率上都拔得头筹，天时地利人和齐备，动能势能潜能都有，足以称得上是最成功的数据库，而且在肉眼可见的几年里也不会有任何挑战者。但令人好奇的是，为<strong>什么 PostgreSQL 会如此成功 </strong>？ 其实，秘密就藏在它的 Slogan 里：“<strong>世界上最先进的开源关系型数据库”</strong><br>关系型数据库是如此的普及与重要，也许其他的数据库品类如键值，文档，搜索引擎，时序，图，向量加起来也比不上它的一个零头。以至于当大家谈起数据库时，如果没有特殊说明，默认隐指的就是”关系型数据库“。在它面前，没有其他数据库品类敢称自己为”主流“。<br>在去年的《<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485216%26idx%3D1%26sn%3D1b59c7dda5f347145c2f39d2679a274d%26scene%3D21%23wechat_redirect">为什么PostgreSQL将成为最成功的数据库？</a>》中，我们详细介绍了关系型数据库的竞争格局 — — <strong>三足鼎立</strong>：关系型数据库的生态位高度重叠，其关系可以视作零和博弈。抛开微软生态关门自嗨相对独立的商业数据库 SQL Server 不提，在当下分久必合的收敛阶段中，以 WireProtocol 计能作为“根”的数据库只有三种：Oracle，MySQL，以及PostgreSQL。关系型数据库世界里上演的是一场<strong>三国演义</strong>。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5tUeeSBbmZpPo6aU" /><figcaption>今天下三分，然 Oracle/MySQL 疲敝 ，日薄西山， PostgreSQL 高歌猛进，如日中天。此消彼长，前途无量。</figcaption></figure><blockquote><em>“Oracle 有才无德，MySQL 才浅德薄，PGSQL 德才兼备”</em></blockquote><p>Oracle 是老牌商业数据库，有着深厚的历史技术积淀，功能丰富，支持完善。广受不差钱且需要背锅侠的企业，特别是金融行业喜爱。但其费用高昂，且以讼棍行径成为知名的业界毒瘤。Microsoft SQL Server 性质与Oracle类似，都属于商业数据库。商业数据库整体受开源数据库冲击，处于缓慢衰退的状态。</p><p>MySQL 号称“最流行”，然而树大招风：前有狼后有虎，上有野爹下有逆子，处于四面楚歌的境地中：在严谨的事务处理和数据分析上，MySQL 被同为开源生态位的 PostgreSQL 甩开几条街；而在糙猛快的敏捷方法论上，MySQL 又不如新兴 NoSQL 好用；上有养父 Oracle 压制，中有兄弟 MariaDB 分家，下有逆子 TiDB/OB 等兼容 NewSQL 分羹，因此也在走下坡路。</p><p>Oracle 作为老牌商业数据库，才毋庸质疑；但其作为业界毒瘤，“德” ，亦不必多说，故曰：“有才无德”。<br>MySQL 虽有开源之功德，奈何认贼作父；且才疏学浅，功能简陋，只能干干CRUD，故曰：“才浅德薄”。<br>唯 PostgreSQL，德才兼备：既占据了开源崛起之天时，又把握了最为流行之地利，还有着先进稳定之人和。<br>正所谓：君子藏器于身，因时而动。不鸣则已，一鸣惊人！</p><h3>开源与先进</h3><p>来自 TimescaleDB 的PostgreSQL 社区年度调研也反映出，用户选择 PostgreSQL 的首要因素便是 <strong>开源</strong> 与 <strong>可靠</strong>。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a6T1_Yi9b1-ogGGQ" /><figcaption><a href="https://www.timescale.com/state-of-postgres/2022">https://www.timescale.com/state-of-postgres/2022</a></figcaption></figure><p><strong>开源</strong> — — 意味着软件本身可以免费使用，可以二次开发，没有供应商锁定，不存在“卡脖子问题”。 <strong>可靠</strong> — — 意味它能正确稳定工作，行为表现能够符合预期，而且有着长时间大规模生产环境的优异战绩。越是资深的开发者，便越是看重这两个属性。</p><p>宽泛地讲，扩展，生态，社区，协议可以归并入 “开源” 。而稳定可靠，ACID，SQL，扩展，可用性，可以总结为 “先进” 。这便正好与 PostgreSQL 的 Slogan 相呼应 — — 世界上最先进的开源关系型数据库。</p><h3>开源之德</h3><blockquote><em>PG的“德”在于开源。祖师爷级的开源项目，全世界开发者群策群力的伟大成果。协议友善BSD，生态繁荣扩展多。开枝散叶，子孙满堂，Oracle替代扛旗者.</em></blockquote><p>什么叫“德”，合乎于“道”的表现就是德。而这条“道”就是开源。PostgreSQL是历史悠久的祖师爷级开源项目，更是全世界开发者群策群力的典范成果。</p><p>很久很久以前，开发软件/信息服务需要使用非常昂贵的商业数据库软件。单花在软件授权上的费用可能就有六七位数，加之相近的硬件成本与服务订阅成本。Oracle一个 CPU 核一年的软件授权费用便高达十几万，壕如阿里也吃不消要“去IOE”。以 PostgreSQL / MySQL 为代表的的开源数据库崛起，让世界多了一个新的选择。</p><p>“不要钱” 的开源数据库可以让我们自由随意地使用数据库软件，而这一点引发了行业变革：从上万元每核·每月的商业数据库软件授权，到20块钱/核·月的纯硬件成本。数据库走入了寻常企业中，让免费提供信息服务成为可能。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pPuLIEQbAPVL0TBT" /></figure><p>开源是有大功德的：互联网的历史就是开源软件的历史，IT行业之所以有今天的繁荣，人们能享受到如此多的免费信息服务，核心原因之一就是开源软件。开源是一种真正成功的，以软件自由为目的，由开发者构成的 Communism（社区主义）：软件这种IT业的核心生产资料变为全世界开发者公有，按需分配。开发者各尽所能，人人为我，我为人人。</p><p>一个开源程序员工作时，其劳动背后可能蕴含的是数以万计顶尖开发者的智慧结晶。程序员薪资高从原理上来说是因为，开发者本质上不是一个简单的工人，而是一个指挥软件和硬件干活的包工头。程序员自己就是核心生产资料；软件来自公有社区；服务器硬件更是唾手可得；因此一个或几个高级的软件工程师，就可以很轻松地利用开源生态快速解决领域问题。</p><p>通过开源，所有社区开发者形成合力，极大降低了重复造轮子的内耗。使得整个行业的技术水平以匪夷所思的速度向前迈进。开源的势头就像滚雪球，时至今日已经势不可挡。越是底层基础的软件，开源便越占据主导优势。基本上除了一些特殊场景和路径依赖，软件特别是基础软件中，闭门造车/所谓”自力更生“已经成了业内超级大笑话。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Xtj2XOUPDcVEeDFF" /></figure><p>开源，是 PostgreSQL 对阵 Oracle 的最大底气所在。</p><p>Oracle 先进，但 PostgreSQL 也不差。PostgreSQL 是 Oracle 兼容性最好的开源数据库，原生即支持 Oracle 85% 的功能，更有 96% 功能兼容的专业发行版。但更重要的是，Oracle 价格高昂，而 PG 开源免费。压倒性的成本优势让 PG 拥有了巨大的生态位基础：它不一定要在功能先进性上超过 Oracle 才能成功 ，廉价9成正确 已经足以干翻 Oracle 。</p><p>PostgreSQL 可以视作一个开源版的“Oracle”，是唯一能真正威胁到 Oracle 的数据库。作为 ”去O“ 抗旗者，PG 可谓子孙满堂，养活了一大批 自主可控 的国产数据库公司。根据信通院统计，36% 的 “国产数据库” 直接基于PG “二开/魔改/套壳/换皮”，华为的openGuass 与 GaussDB 就是最典型的例子。重要的是，PostgreSQL 使用 BSD-Like 的 PostgreSQL 协议，是允许这种行为的 — — 你只要不打着PG的名号招摇撞骗，改个名字直接卖起来都行。这样开放的胸襟，是被Oracle收购的，使用GPL协议的 MySQL 所难以比拟的。</p><h3>先进之才</h3><blockquote><em>PG的“才”在于先进。一专多长，全栈多模：“自主可控自动驾驶时序地理空间AI向量分布式文档图谱全文检索可编程超融合联邦流批一体 HTAP Serverless 全栈式平台数据库”，单一组件即可覆盖几乎所有数据库需求。</em></blockquote><p>PostgreSQL 不仅仅是传统意义上只能做 OLTP 的单纯 “关系型数据库”，而是一个多模态数据库。对于中小企业来说，基本单一组件便足以覆盖中小型企业绝大多数场景的数据需求：OLTP，OLAP，时序，地理空间GIS，分词与全文检索，JSON/XML文档，NoSQL特性，图，向量，全都能用上。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4DfhvRxEDt4pUfXq" /><figcaption>自主可控自动驾驶时序地理空间AI向量分布式文档图谱全文检索可编程超融合联邦流批一体 HTAP Serverless 全栈式平台数据库</figcaption></figure><p>PostgreSQL 的先进，除了体现在其备受赞誉的内核稳定性上，更是体现在它强大的可扩展性里。插件系统让 PostgreSQL 不再仅仅是一个单线程演化的数据库内核，而是可以有无数并行演进的扩展插件，如同量子计算一般同时探索所有方向上的可能性。每一个数据处理的细分垂直领域，PostgreSQL 绝不会缺席。</p><p>正如：PostGIS 之于地理时空数据库，TimescaleDB 之于时序数据库，Citus 之于分布式/列存储/HTAP数据库，PGVector 之于AI向量数据库，AGE之于图数据库，PipelineDB 之于流处理；以及终极杀招 — — 使用外部数据源包装器（FDW），使用统一的 SQL 访问所有异构的外部数据库。可以说PG是真正的全栈数据库平台，比起 MySQL 这样单纯的 OLTP 数据库，它的功能要先进太多了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QK343cKQDIVJc41i" /></figure><p>在一个很可观的规模内，PostgreSQL 都可以独立扮演多面手的角色，一个组件当多种组件使。而单一数据组件选型可以极大地削减项目额外复杂度，这意味着能节省很多成本。它让十个人才能搞定的事，变成一个人就能搞定的事。 在使用“专用数据库”前切莫忘记：为了不需要的规模而设计是白费功夫，这属于过早优化的一种形式。如果真有那么一样技术可以满足你所有的需求，那么使用该技术就是最佳选择，而不是试图用多个组件来重新实现它。</p><p>以探探为例，在 250w TPS 与 200 TB 不重复TP数据的量级下，单一PostgreSQL选型依然能稳定可靠地撑起业务，并能在很可观的规模内做到一专多长。除了本职的 OLTP，PG 还在相当长的时间里兼任了缓存，OLAP，批处理，甚至消息队列的角色。当然神龟虽寿，犹有竟时。最终这些兼职功能还是要逐渐分拆出去由专用组件负责，但那已经是近千万日活时候的事了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GbffffzaTdo0WJ00" /></figure><p>PostgreSQL 的先进，更是体现在其繁荣的生态里。以数据库内核为中心，向上，有着衍生特化的变体与构建于其上的“上层数据库” — — Greenplum数据仓库，Firebase的开源替代 Supabase，专用图数据库 edgedb 等等等等。向下，有着各种开源/商业/云发行版来整合各种工具形成合力 — — 各家的RDS ，开箱即用的 Pigsty ；水平方向上，甚至还有着一些强大的拟态组件/版本，可以通过兼容 Wire Protocol 的方式来仿真其他数据库，无需修改客户端驱动就能完成数据库迁移 — — 模拟 SQL Server 的 babelfish，模拟 MongoDB 的 FerretDB，兼容 Oracle 的 EnterpriseDB / IvorySQL 都是样例。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*tqfl3CphKzIQUXa3" /><figcaption>PostgreSQL 的先进性有目共睹，这也是其对阵同为开源关系型数据库的老对手 — — MySQL 时，真正的核心竞争力。</figcaption></figure><p><strong>先进，是 PostgreSQL 压倒 MySQL 的核心竞争力。</strong></p><p>MySQL的口号是“世界上最流行的开源关系型数据库”，它的核心特点是糙猛快，基本盘是互联网公司。<br>互联网公司的典型特点是什么？追逐潮流糙猛快。糙说的是互联网公司业务场景简单（CRUD居多）；数据重要性不高，不像传统行业（例如银行）那样在意数据的一致性与正确性；可用性优先，相比停服务更能容忍数据丢乱错，而一些传统行业宁可停止服务也不能让账目出错。 猛说的则是互联网行业数据量大，它们需要的就是水泥槽罐车做海量 CRUD，而不是高铁和载人飞船。 快说的则是互联网行业需求变化多端，出活周期短，要求响应时间快，大量需求的就是开箱即用的软件全家桶（如LAMP）和简单培训就能上手干活的 CRUD Boy。于是，糙猛快的互联网公司和糙猛快的 MySQL 一拍即合，MySQL吃到了互联网崛起的一波大红利。</p><p>然而时来天地皆同力，运去英雄不自由。时过境迁，PostgreSQL 进步神速，在”快“与”猛“上 MySQL 已经不占优，现在只剩下”糙“了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dXbprNY09aeS9rEd" /><figcaption>MySQL竟然默认允许部分成功的事务提交</figcaption></figure><p>先进的因会反映为流行的果，流行的东西因为落后而过气，而先进的东西会因为先进变得流行。在这个变革的时代中，没有先进的功能打底，“流行”也也难以长久。时代所赋予的红利，也会随时代过去而退潮。调查的结果也用事实证明，MySQL 唯一能引以为豪的 “流行” 在 PostgreSQL 压倒性的 “先进” 优势前，根本维持不住。</p><p>先进与开源，就是 PostgreSQL 成功的最大法宝。Oracle 先进， MySQL 开源，PostgreSQL 先进又开源。天时地利人和齐备，何愁大业不成？</p><h3>展望未来</h3><p>PostgreSQL 数据库内核在数据库领域的生态位，类似于 Linux 操作系统内核在操作系统领域的生态位。对于数据库，至少是 OLTP 数据库来说，数据库内核之争已经尘埃落定 — — PostgreSQL 已经是一台足够完美的内核发动机。</p><p>然而，用户最终需要的不单单是一台发动机，而是整车、驾驶能力与交通服务。数据库领域竞争的焦点，已经从 Software 本身，转移到了 Software enabled Service — — 完整的数据库发行版与数据库服务。对于基于 PostgreSQL 内核的数据库发行版而言，竞争才刚刚开始。谁会成为PG的 Debian，RedHat 与 Ubuntu ？</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pW5Qnap1MKTxMvbv" /><figcaption>Pigsty —— 开箱即用，本地优先的数据库发行版与RDS PG替代</figcaption></figure><p>这便是我们做 <a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485327%26idx%3D1%26sn%3D0d02f5e504266e5dd436c64d23844735%26chksm%3Dfe4b3254c93cbb427598322952d654c3383bfe8858ec7ffaee2b9ca0c84bebe6f763748a356f%26scene%3D21%23wechat_redirect">Pigsty</a> 的初衷 — — 制作一个开箱即用的、开源免费、本地优先的 PostgreSQL 数据库发行版，让所有人都能 用好数据库， 用好 数据库。当然，限于篇幅，那就是<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485518%26idx%3D1%26sn%3D3d5f3c753facc829b2300a15df50d237%26chksm%3Dfe4b3d95c93cb4833b8e80433cff46a893f939154be60a2a24ee96598f96b32271301abfda1f%26scene%3D21%23wechat_redirect">另一篇</a>要介绍的故事了。</p><h3>参考阅读</h3><p>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485240%26idx%3D1%26sn%3D9052f03ae2ef21d9e21037fd7a1fa7fe%26chksm%3Dfe4b32e3c93cbbf522616346c1afd49e1e6edbb0898694df224fe2134a69c0c4562aab35587a%26scene%3D21%23wechat_redirect">PostgreSQL 到底有多强？</a>》 2022–08<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485216%26idx%3D1%26sn%3D1b59c7dda5f347145c2f39d2679a274d%26chksm%3Dfe4b32fbc93cbbed574358a3bcf127dd2e4f458638b46efaee1a885a5702a66a5d9ca18e3f90%26scene%3D21%23wechat_redirect">为什么PostgreSQL是最成功的数据库？</a>》2022–07<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485170%26idx%3D1%26sn%3D657c75be06557df26e4521ce64178f14%26chksm%3Dfe4b3329c93cba3f840283c9df0e836e96a410f540e34ac9b1b68ca4d6247d5f31c94e2a41f4%26scene%3D21%23wechat_redirect">StackOverflow 2022数据库年度调查</a>》2022–06<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247484604%26idx%3D1%26sn%3D357b3381e7636709fa9e5e06894b7273%26chksm%3Dfe4b3167c93cb8719b7c6b048fd300a7773c73319ba0c119359f4f8a6684cd969434c5abbdfd%26scene%3D21%23wechat_redirect">Why PostgreSQL Rocks!</a>》 2021–05<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247484591%26idx%3D1%26sn%3Da6ab13d93bfa26fca969ba163b01e1d5%26chksm%3Dfe4b3174c93cb862899cbce4b9063ed009bfe735df16bce6b246042e897d494648473eea3cea%26scene%3D21%23wechat_redirect">为什么说PostgreSQL前途无量？</a>》2021–05<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247483706%26idx%3D1%26sn%3Db842684b41ac6dde8310448ae0a81a76%26chksm%3Dfe4b34e1c93cbdf7dcfcdae5f3ddc38bc422989421266dcda957fa2b596e361815624c92b3ec%26scene%3D21%23wechat_redirect">PostgreSQL 好处都有啥？</a>》2018<br>《<a href="https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU5ODAyNTM5Ng%3D%3D%26mid%3D2247485518%26idx%3D1%26sn%3D3d5f3c753facc829b2300a15df50d237%26chksm%3Dfe4b3d95c93cb4833b8e80433cff46a893f939154be60a2a24ee96598f96b32271301abfda1f%26scene%3D21%23wechat_redirect">更好的开源RDS替代：Pigsty</a>》2023<br>《<a href="https://link.zhihu.com/?target=http%3A//demo.pigsty.cc/d/sf-db-survey">StackOverflow 7年调研数据跟踪</a>》<br>《<a href="https://link.zhihu.com/?target=https%3A//www.timescale.com/state-of-postgres/2022">PostgreSQL 社区状态调查报告 2022</a>》</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ffb265779015" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>