YugabyteDB is a PostgreSQL-compatible distributed database that supports the majority of PostgreSQL syntax. This means that existing applications built on PostgreSQL can often be migrated to YugabyteDB without changing application code.

Because YugabyteDB is PostgreSQL compatible, it works with the majority of PostgreSQL database tools such as various language drivers, ORM tools, schema migration tools, and many more third-party database tools.

PostgreSQL compatibility has two aspects:

  • Feature compatibility

    Compatibility refers to whether YugabyteDB supports all the features of PostgreSQL and behaves as PostgreSQL does. With full PostgreSQL compatibility, you should be able to take an application running on PostgreSQL and run it on YugabyteDB without any code changes. The application will run without any errors, but it may not perform well because of the distributed nature of YugabyteDB.

  • Performance parity

    Performance parity refers to the capabilities of YugabyteDB that allow applications running on PostgreSQL to run with predictable performance on YugabyteDB. In other words, the performance degradation experienced by small and medium scale applications going from a single server database to a distributed database should be predictable and bounded.

Enhanced PostgreSQL Compatibility Mode

To test and take advantage of features developed for PostgreSQL compatibility in YugabyteDB that are currently in EA , you can enable Enhanced PostgreSQL Compatibility Mode (EPCM). When this mode is turned on, YugabyteDB is configured to use all the latest features developed for feature and performance parity. EPCM is available in v2024.1 and later.

After turning this mode on, as you upgrade universes, YugabyteDB will automatically enable new designated PostgreSQL compatibility features.

As features included in the PostgreSQL compatibility mode transition from EA to GA in subsequent versions of YugabyteDB, they become enabled by default on new universes, and are no longer managed under EPCM on your existing universes after the upgrade.

Note

If you have set these features independent of EPCM, you cannot use EPCM.

Conversely, if you are using EPCM on a universe, you cannot set any of the features independently.

Planned Feature Flag/Configuration Parameter EA
Efficient communication
between PostgreSQL and DocDB
pg_client_use_shared_memory v2024.2
Parallel query Planned

Released

The following features are currently available in EPCM.

Read committed

Flag: yb_enable_read_committed_isolation=true

Read Committed isolation level handles serialization errors and avoids the need to retry errors in the application logic. Read Committed provides feature compatibility, and is the default isolation level in PostgreSQL. When migrating applications from PostgreSQL to YugabyteDB, read committed is the preferred isolation level.

To learn about read committed isolation, see Read Committed.

Cost-based optimizer

Configuration parameter: yb_enable_base_scans_cost_model=true

Cost-based optimizer (CBO) creates optimal execution plans for queries, providing significant performance improvements both in single-primary and distributed PostgreSQL workloads. This feature reduces or eliminates the need to use hints or modify queries to optimize query execution. CBO provides improved performance parity.

When enabling this parameter, you must run ANALYZE on user tables to maintain up-to-date statistics.

When enabling the cost models, ensure that packed row for colocated tables is enabled by setting the --ysql_enable_packed_row_for_colocated_table flag to true.

Wait-on-conflict concurrency

Flag: enable_wait_queues=true

Enables use of wait queues so that conflicting transactions can wait for the completion of other dependent transactions, helping to improve P99 latencies. Wait-on-conflict concurrency control provides feature compatibility, and uses the same semantics as PostgreSQL.

To learn about concurrency control in YugabyteDB, see Concurrency control.

Batched nested loop join

Configuration parameter: yb_enable_batchednl=true

Batched nested loop join (BNLJ) is a join execution strategy that improves on nested loop joins by batching the tuples from the outer table into a single request to the inner table. By using batched execution, BNLJ helps reduce the latency for query plans that previously used nested loop joins. BNLJ provides improved performance parity.

To learn about join strategies in YugabyteDB, see Join strategies.

Default ascending indexing

Configuration parameter: yb_use_hash_splitting_by_default=false

Enable efficient execution for range queries on data that can be sorted into some ordering. In particular, the query planner will consider using an index whenever an indexed column is involved in a comparison using one of the following operators: < <= = >= >.

Also enables retrieving data in sorted order, which can eliminate the need to sort the data.

Default ascending indexing provides feature compatibility and is the default in PostgreSQL.

YugabyteDB bitmap scan

Configuration parameter: yb_enable_bitmapscan=true

Bitmap scans use multiple indexes to answer a query, with only one scan of the main table. Each index produces a "bitmap" indicating which rows of the main table are interesting. Bitmap scans can improve the performance of queries containing AND and OR conditions across several index scans. YugabyteDB bitmap scan provides feature compatibility and improved performance parity. For YugabyteDB relations to use a bitmap scan, the PostgreSQL parameter enable_bitmapscan must also be true (the default).

Planned

The following features are planned for EPCM in future releases.

Efficient communication between PostgreSQL and DocDB

Configuration parameter: pg_client_use_shared_memory=true

Enable more efficient communication between YB-TServer and PostgreSQL using shared memory. This feature provides improved performance parity.

Parallel query

Enables the use of PostgreSQL parallel queries. Using parallel queries, the query planner can devise plans that leverage multiple CPUs to answer queries faster. Parallel query provides feature compatibility and improved performance parity.

Enable EPCM

YugabyteDB

To enable EPCM in YugabyteDB:

  • Pass the enable_pg_parity_early_access flag to yugabyted when starting your cluster.

For example, from your YugabyteDB home directory, run the following command:

./bin/yugabyted start --enable_pg_parity_early_access

Note: When enabling the cost models, ensure that packed row for colocated tables is enabled by setting the --ysql_enable_packed_row_for_colocated_table flag to true.

YugabyteDB Anywhere

To enable EPCM in YugabyteDB Anywhere v2024.1, see the Release notes.

To enable EPCM in YugabyteDB Anywhere v2024.2 or later:

  • When creating a universe, turn on the Enable Enhanced Postgres Compatibility option.

    You can also change the setting on deployed universes using the More > Edit Postgres Compatibility option.

Flag settings

Setting Enhanced Postgres Compatibility overrides any flags you set individually for the universe. The G-Flags tab will however continue to display the setting that you customized.

YugabyteDB Aeon

To enable EPCM in YugabyteDB Aeon:

  1. When creating a cluster, choose a track with database v2024.1.0 or later.
  2. Select the Enhanced Postgres Compatibility option (on by default).

You can also change the setting on the Settings tab for deployed clusters.

Unsupported PostgreSQL features

Because YugabyteDB is a distributed database, supporting all PostgreSQL features in a distributed system is not always feasible. This section documents the known list of differences between PostgreSQL and YugabyteDB. You need to consider these differences while porting an existing application to YugabyteDB.

The following PostgreSQL features are not supported in YugabyteDB:

Unsupported PostgreSQL feature Track feature request GitHub issue
LOCK TABLE to obtain a table-level lock #5384
Table inheritance #5956
Exclusion constraints #3944
Deferrable constraints #1709
Constraint Triggers #4700
GiST indexes #1337
Events (Listen/Notify) #1872
XML Functions #1043
XA syntax #11084
ALTER TYPE #1893
CREATE CONVERSION #10866
Primary/Foreign key constraints on foreign tables #10698, #10699
GENERATED ALWAYS AS STORED columns #10695
Multi-column GIN indexes #10652
CREATE ACCESS METHOD #10693
DESC/HASH on GIN indexes (ASC supported) #10653
CREATE SCHEMA with elements #10865
Index on citext column #9698
ABSTIME type #15637
transaction ids (xid)
YugabyteDB uses Hybrid logical clocks instead of transaction ids.
#15638
DDL operations within transaction #1404
Some ALTER TABLE variants #1124
UNLOGGED table #1129
Indexes on complex datatypes such as INET, CITEXT, JSONB, ARRAYs, and so on. #9698, #23829, #17017
%TYPE syntax in Functions/Procedures/Triggers #23619
Storage parameters on indexes or constraints #23467
REFERENCING clause for triggers #1668
BEFORE ROW triggers on partitioned tables #24830