PostgreSQLの最新かつ最高のリリースであるv11は、今週公開される予定です。このバージョンの新機能について簡単に説明します。
改善点の最大のセットは、パーティションのサポートです。 Postgres 11は以下をサポートします:
- 行を更新すると、パーティション間で行を移動できます
- デフォルトのパーティション
- 自動インデックス作成
- 外部キー制約はパーティションテーブルでサポートされています
- 一意のインデックス
- アグリゲーションをパーティションにプッシュダウン
- ハッシュによるパリティ
- リモートサーバー(postgres_fdw)のパーティションの子を更新できます
- INSERT..ONCONFLICTはパーティションテーブルでサポートされています
- より効率的なクエリプランとより高速なクエリ実行
これらの改善点について詳しくは、こちらをご覧ください。
並列処理の増加に関連して、全面的に多くの改善があります。結合、結合、「CREATE..AS SELECT」を使用したテーブルとビューの作成、btreeインデックスの作成、およびこれらの変更によるメリットがあります。
これは、Postgres11でのインデックス作成パフォーマンスの改善に関する記事です。
JIT準拠のクエリ
11ではデフォルトで無効になっていますが、LLVMベースのクエリのJITコンパイルがPostgresに組み込まれています。サーバーは、LLVMを使用して特定のクエリ(実行の見積もりがしきい値よりも高いクエリ)をコンパイルすることを選択できるようになり、クエリが高速化されました。このコンパイルは自動的に行われ、アプリケーションに対して透過的です。
ここにいくつかの数字があります。
PostgreSQLではなく他のRDBMSで利用可能なカバーインデックスが追加されました。これにより、次のようなインデックスを作成できます(新しい構文):
CREATE INDEX empid_idx ON employees(empid) INCLUDE (empname);
このようなインデックスには、インデックス自体に追加の属性(ここでは「empname」)が含まれており、次のようなクエリを満たすことができます。
SELECT empname FROM employees WHERE empid BETWEEN 1000 and 2000;
完全にインデックスのみのスキャンを使用し、ヒープにはまったく触れません。
インデックスのカバーについて詳しくは、こちらをご覧ください。
ストアドプロシージャは、他のRDBMSに追いつくPostgreSQLのもう1つのインスタンスです。もちろん、これらはPostgreSQLが長い間サポートしてきた保存された関数に似ていますが、プロシージャを使用する場合にのみ可能な1つの大きなことは、トランザクション制御です。保存されたプロシージャ内からトランザクションをコミットおよびロールバックできます。
CREATEPROCEDUREdocumentationをご覧ください。
テーブルを変更してDEFAULT値を持つ新しいNOTNULL列を追加することは、サーバーがテーブル全体を書き換える原因となったため、PostgreSQLでは少し面倒でした。v11では、次のようなDDLステートメントを使用できるようになりました。
ALTER TABLE users ADD COLUMN foo_factor integer NOT NULL DEFAULT 42;
一定時間で実行します。これが実行されても行は変更されず、代わりに「遅延」して更新されます。
この機能の詳細については、こちらをご覧ください。
SHA関数
そして最後に、SHA関数にのみpgcryptoを使用していた方は、PostgreSQL11に組み込まれているものを使用するように切り替えることができます。
bench=# \df pg_catalog.sha*
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+------
pg_catalog | sha224 | bytea | bytea | func
pg_catalog | sha256 | bytea | bytea | func
pg_catalog | sha384 | bytea | bytea | func
pg_catalog | sha512 | bytea | bytea | func
(4 rows)
bench=# SELECT sha256('hello');
sha256
--------------------------------------------------------------------
\x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
(1 row)