PostgreSQL4のTOASTの新しい圧縮アルゴリズムLZ14。どれくらい速くできますか?

更新:2年2023月XNUMX日

列圧縮オプションの場合、PostgreSQL14は新しい圧縮方法LZ4を提供します。 TOASTの既存のPGLZ圧縮方法と比較して、LZ4圧縮は高速です。 この記事では、オプション全体を使用して、そのパフォーマンスを他の圧縮アルゴリズムと比較する方法について説明します。

背景

PGでは、ページはデータを格納する単位であり、デフォルトは8KBです。 一般に、データの行をページ間で保存することは許可されていません。 ただし、可変長のデータ型がいくつかあり、保存されるデータは大学のXNUMXページを超える場合があります。 制限全体を克服するために、大きなフィールドは圧縮されるか、複数の物理行に分割されます。 このテクニックはTOASTです:

デフォルトでは、テーブルに可変長の列があり、行データのサイズがTOAST_TUPLE_THRESHOLD(デフォルトは2KB)を超えると、TOASTがトリガーされます。 まず、データが最初に圧縮されます。 圧縮後も大きすぎると、ストレージがオーバーフローします。 列ストレージ戦略でEXTERNAL / PLAINが指定されている場合、圧縮は禁止されることに注意してください。

PG14 より前では、TOAST は 4 つの圧縮アルゴリズム PGLZ (PG 組み込みアルゴリズム) のみをサポートしていました。 ただし、他の圧縮アルゴリズムは PGLZ よりも高速であるか、圧縮率が高い場合があります。 PG14 には新しい圧縮オプション LZXNUMX 圧縮があり、その速度で知られる可逆圧縮アルゴリズムです。 したがって、TOAST の圧縮と解凍の速度向上に役立つことが期待できます。

LZ4の使い方は?

LZ4 圧縮機能を使用するには、コンパイル時に -with-lz4 を指定し、オペレーティング システムの LZ4 ライブラリに従う必要があります。 PG インスタンスの TOAST デフォルト圧縮アルゴリズムは、GUC パラメータのdefault_toast_compression を通じて指定できます。 postgresqlでも可能です。 conf で設定します。SET コマンドを使用して現在の接続のみを変更することもできます。

postgres =#SET default_toast_compression = lz4;

セット

CREATE TABLEでテーブルを作成するときに、列圧縮アルゴリズムを指定します。

d +コマンドを使用して、すべての列の圧縮アルゴリズムを確認できます。 列が圧縮アルゴリズムをサポートしていないか、指定していない場合、[圧縮]列にスペースが表示されます。 上記の例では、id列は圧縮アルゴリズムをサポートせず、col1列はPGLZを使用し、col2はLZ4を使用し、col3は圧縮アルゴリズムを指定しないため、デフォルトの圧縮アルゴリズムを使用します。

ALTER TABLEを使用して列圧縮アルゴリズムを変更できますが、変更されたアルゴリズムは、コマンド全体が実行された後にのみ挿入データに影響することに注意してください。

postgres =#INSERT INTO tbl VALUES(1、repeat( 'abc'、1000)、repeat( 'abc'、1000)、repeat( 'abc'、1000));

挿入0

postgres =#ALTER TABLE tbl ALTER COLUMN col1 SET COMPRESSION lz4;

他の机

postgres =#INSERT INTO tbl VALUES(2、repeat( 'abc'、1000)、repeat( 'abc'、1000)、repeat( 'abc'、1000));

挿入0

postgres =#SELECT id、

postgres-#pg_column_compression(id)AScompression_colid、

postgres-#pg_column_compression(col1)AScompression_col1、

postgres-#pg_column_compression(col2)AScompression_col2、

postgres-#pg_column_compression(col3)AScompression_col3

postgres-#FROM tbl;

id♪compression_colid❤compression_col1❤compression_col2❤compression_col3

--- + --------------------------------------------------------------------------------------------------------------------------

1 4 {4} pglz セ lzXNUMX ++ lzXNUMX

2 !! {4} lz4 ++ lz4 ++ lzXNUMX

(2列)

圧縮アルゴリズムを変更する前に挿入された行では、圧縮アルゴリズムが PGLZ から LZ1 に変更された場合でも、col4 は依然として PGLZ 圧縮アルゴリズムを使用していることがわかります。 (では、変更後の解凍にはどのアルゴリズムを使用する必要がありますか?)

CREATE TABLE など、別のテーブルからデータをスキャンしてこのテーブルに挿入する場合には注意してください。 。 。 として。 。 。 または「INSERT INTO」。 。 。 選択する。 。 。 , 挿入されたデータで使用される圧縮アルゴリズムは、元のデータの圧縮方法を引き続き使用します。 pg_dump と pg_dumpall には、オプション no-toast-compuression も追加されました。 オプション全体を使用した後は、TOAST 圧縮オプションはダンプされません。

性能比較

LZ4とPGLZの圧縮率と圧縮速度をテストしました。 また、非圧縮データのテスト結果を追加しました(指定されたストレージ戦略はEXTERNALです)。 非圧縮データの場合、時間のかかる圧縮と解凍はありませんが、データの読み取りと書き込みにかかる時間が長くなります。

テストで使用されたデータ:PGドキュメント(データの行ごとにXNUMXつのHTMLファイル)。 HTML、テキスト、ソースコード、実行可能バイナリファイル、画像など、SilesiaCorpusが提供するデータ

試験機の使用インテル? Xeon? シルバー4210 CPU @ 2.20GHz、10コア/ 20スレッド/ 2ソケット。

pgbenchを使用してSQLステートメントの実行時間をテストし、pg_table_sizeを使用してテーブルユニバーシティをチェックします(デッドレコードの影響を排除するために、各実行の前にVACUUM FULLを実行します)。

圧縮比

PGLZとLZ4の圧縮率は、どちらも繰り返しデータに依存します。 タプルの繰り返し数が多いほど、圧縮率は高くなります。 ただし、PGがこのような圧縮率を不適切と評価した場合、データサイズがしきい値に達しても、圧縮は実行されません。 圧縮はディスク領域を効率的に節約しないため、解凍ロックのために余分な時間とリソースの消費ももたらします。

現在のPG14では、PGLZは少なくとも25%の圧縮率を必要としますが、LZは非圧縮データの場合よりも小さいだけです。 LZ4、PGLZテーブル、非圧縮テーブルのサイズを比較しました。 ほとんどのシナリオで、PGLZの圧縮率はわずかに優れており、圧縮率は2.23と評価され、LZ4の圧縮率は2.07であることがわかります。 これは、PGLZがディスクスペースの7%を節約できることを意味します。

図1-テーブルサイズの比較(KB単位)

圧縮/減圧速度

TOASTデータは、挿入およびクエリ中に圧縮および解凍されます。 したがって、いくつかのSQLステートメントを実行して、さまざまな圧縮アルゴリズムの影響を確認しました。

まず、LZ、PGLZ を使用する場合と圧縮を使用しない場合の INSERT ステートメントのパフォーマンスを比較します。 非圧縮データと比較すると、LZ4の方が若干時間がかかり、PGLZの方が時間がかかることが分かります。 LZ4 の圧縮時間は、PGLZ の圧縮時間より平均 20% 短くなります。 これは非常に重要な改善です。

図2-INSERTパフォーマンスの比較

以下のSELECTを比較してください。 PGLZと比較して、LZ4は20%の時間を節約でき、非圧縮データと比較して大きな違いはありません。 減圧のコストは非常に低いレベルに削減されました。

図3-SELECTパフォーマンスの比較

16クライアントの同時INSERTステートメントを比較します。 PGLZと比較して、LZ4を使用した単一の大きなファイル(HTML、英語のテキスト、ソースコード、バイナリ実行可能ファイル、画像)の圧縮パフォーマンスは、60%〜70%高速です。 複数の小さなファイル(PGファイル)を挿入すると、パフォーマンスは向上しません。 非圧縮データと比較して、大幅な改善があります。 圧縮を使用すると、ディスクに書き込まれるデータの量が減少すると推測されます。

図4-INSERTパフォーマンスと16クライアントの比較

16のクライアントSELECTを使用すると、ほとんどのシナリオでLZ4のパフォーマンスがPGLZよりも優れています。

図5-16クライアントとのSELECTパフォーマンスの比較

また、文字列関数 SELECT と UPDATE を使用したテキスト処理の速度も比較します。 シーン全体では、LZ4 の方が PGLZ よりも優れています。 非圧縮データと比較して、LZ4 圧縮アルゴリズムのデータは関数処理速度がほぼ同じであり、LZ4 アルゴリズムは文字列の演算速度にほとんど影響を与えません。

図6-文字列関数を使用したパフォーマンスの比較

PGLZと比較して、LZ4はTOASTデータをより効率的に圧縮および解凍し、優れたパフォーマンスを提供します。 非圧縮データと比較して、クエリ速度はほぼ同じであり、PGLZと比較して、挿入は80%高速です。 もちろん、一部のシナリオでは圧縮率があまり良くありませんが、実行速度を上げたい場合は、LZ4アルゴリズムを使用することを強くお勧めします。

また、テーブル内のデータが圧縮に適しているかどうかにも注意を払う必要があります。 圧縮率が良くない場合でも、数値を圧縮してあきらめようとします。これにより、追加の結果が得られます。RAMリソースが無駄になり、データの挿入速度に大きく影響します。

未来

LZ4 は、TOAST の圧縮および解凍パフォーマンスを大幅に向上させました。 LZ4 に加えて、Zstandard など、他にも多くの圧縮アルゴリズムがあります。 Zstandard をサポートするユーザーは、PGLZ よりも優れた圧縮率を得ることができます。 LZ4 HC の圧縮速度は LZ98.5 解凍より 4% ですが、圧縮率を大幅に高めることができます。 PG の将来のバージョンでは、より多くの圧縮アルゴリズムが使用できることを期待しています。

TOASTに加えて、他のシーンも圧縮する必要があります。 私の知る限り、現在の開発バージョンはすでにWALのLZ4圧縮をサポートしています。これはエキサイティングな機能です。