PostgreSQL 14中TOAST的新壓縮演算法LZ4,它有多快?
PostgreSQL 14中TOAST的新壓縮演算法LZ4,它有多快?
對於列壓縮選項,PostgreSQL 14提供了新的壓縮方法LZ4。與TOAST中現有的PGLZ壓縮方法相比,LZ4壓縮更快。本文介紹如何使用整個選項,並和其他壓縮演算法進行效能比較。
背景
PG中,頁是儲存資料的單位,預設是8KB。一般情況下,一行資料不允許跨頁儲存。然而,有一些變長的資料型別,儲存的資料可能超出一頁大學。為了克服整個限制,大欄位域會被壓縮或者分割成多個物理行。這個技術就是TOAST:
預設情況下,如果表中有變長列,行資料的大小超過TOAST_TUPLE_THRESHOLD(預設2KB)就會觸發TOAST。首先,會先壓縮資料;壓縮後如果仍然太大,會溢位儲存。需要注意,如果 列的儲存策略指定EXTERNAL/PLAIN,壓縮會被禁止 。
PG14之前版本,TOAST僅支援一個壓縮演算法PGLZ(PG內建演算法)。但是其他壓縮演算法可能比PGLZ更快或者有更高的壓縮率。PG14中有了新壓縮選項LZ4壓縮,這是一個以速度著稱的無失真壓縮演算法。因此我們可以期望它有助於提高TOAST壓縮和解壓縮的速度。
如何使用LZ4?
為了使用LZ4壓縮特性,在編譯時需要指定--with-lz4,並且在作業系統中按照LZ4庫。通過GUC引數default_toast_compression可以指定PG例項的TOAST預設壓縮演算法。可以在postgresql.conf中配置,也可以通過SET命令僅改變當前連線:
postgres=# SET default_toast_compression=lz4; SET
在CREATE TABLE建立表時指定列壓縮演算法:
postgres=# CREATE TABLE tbl (id int, postgres(# col1 text COMPRESSION pglz, postgres(# col2 text COMPRESSION lz4, postgres(# col3 text); CREATE TABLE postgres=# \d+ tbl Table "public.tbl" Column | Type | … | Storage | Compression | … -------+---------+---+----------+-------------+ … id | integer | | plain | | col1 | text | | extended | pglz | col2 | text | | extended | lz4 | col3 | text | | extended | | Access method: heap
我們使用\d+命令可以看到所有列的壓縮演算法。如果列不支援或者沒有指定壓縮演算法,那麼會在Compression列顯示空格。上面的例子中,id列不支援壓縮演算法,col1列使用PGLZ,col2使用LZ4,col3沒有指定壓縮演算法,那麼它會使用預設的壓縮演算法。
可以通過ALTER TABLE修改列壓縮演算法,但需要注意,修改後的演算法僅影響執行整個命令後的insert資料。
postgres=# INSERT INTO tbl VALUES (1, repeat('abc',1000), repeat('abc',1000),repeat('abc',1000)); INSERT 0 1 postgres=# ALTER TABLE tbl ALTER COLUMN col1 SET COMPRESSION lz4; ALTER TABLE postgres=# INSERT INTO tbl VALUES (2, repeat('abc',1000), repeat('abc',1000),repeat('abc',1000)); INSERT 0 1 postgres=# SELECT id, postgres-# pg_column_compression(id) AS compression_colid, postgres-# pg_column_compression(col1) AS compression_col1, postgres-# pg_column_compression(col2) AS compression_col2, postgres-# pg_column_compression(col3) AS compression_col3 postgres-# FROM tbl; id | compression_colid | compression_col1 | compression_col2 | compression_col3 ---+-------------------+------------------+------------------+------------------ 1 | | pglz | lz4 | lz4 2 | | lz4 | lz4 | lz4 (2 rows)
可以看到在修改壓縮演算法前插入的行,col1仍使用PGLZ壓縮演算法,即使將壓縮演算法從PGLZ修改到了LZ4。(那麼,修改後進行解壓時使用哪個演算法呢?)
需要注意,如果從其他表掃資料插入本表,例如CREATE TABLE ...AS...或者INSERT INTO...SELECT...,插入的資料使用的壓縮演算法仍然使用原始資料的壓縮方法。pg_dump和pg_dumpall也新增了選項--no-toast-compuression,使用整個選項後,不會dump出TOAST壓縮選項。
效能比較
測試了LZ4和PGLZ壓縮率和壓縮速度。並新增了未壓縮資料的測試結果(指定儲存策略為EXTERNAL),對於未壓縮資料,沒有壓縮和解壓的耗時,但讀和寫資料的時間會增加。
測試使用的資料:PG documents(一行資料一個HTML檔案); SilesiaCorpus 提供的資料,包括HTML、Text、原始碼、可執行二進位制檔案、圖片:
測試機器使用Intel® Xeon® Silver 4210 CPU @2.20GHz with 10 cores/20 threads/2 sockets。
使用pgbench測試SQL語句執行時間,pg_table_size檢查表大學(每次執行前都執行VACUUM FULL排除死記錄的影響)。
壓縮率
PGLZ和LZ4的壓縮率都依賴於重複資料,重複的元組越多,壓縮率越高。但是如果PG評估這樣的壓縮率不好時,就不會執行壓縮,即使資料大小達到了閾值。因為壓縮並沒有高效節省磁碟空間,還會帶來解壓鎖的額外時間和資源消耗。
當前PG14中,PGLZ需要至少25%的壓縮率,LZ則僅比未壓縮資料時小即可。我比較了LZ4、PGLZ的表與未壓縮表大小。可以看到,大部分場景下,PGLZ的壓縮率稍微好點,壓縮率評價為2.23,LZ4的壓縮率為2.07。這意味著PGLZ可以節省7%的磁碟空間。
Figure 1 - Comparing table sizes (in KB)
壓縮/解壓縮速度
Insert和查詢時TOAST資料會被壓縮和解壓縮。因此,我執行一些SQL語句檢視不同壓縮演算法帶來的影響。
首先比較了INSERT語句,列使用LZ、PGLZ和未使用壓縮時的效能。可以看到與未壓縮資料比,LZ4耗費稍微多一點時間, PGLZ耗費時間更多。LZ4的壓縮時間比PGLZ平均節省20%。這是一項非常顯著的改進。
Figure 2 - Comparing INSERT performance
下面比較SELECT。與PGLZ相比,LZ4可以節省20%的時間,與未壓縮資料相比,沒有太大差別。解壓縮的消耗已經降到了很低了。
Figure 3 - Comparing SELECT performance
再比較16個客戶端的INSERT語句併發。與PGLZ相比使用LZ4的單大檔案(HTML,英文文字,原始碼,二進位制執行檔案,圖片)的壓縮效能快60%-70%。插入多個小檔案(PG文件),效能提升不大。和未壓縮的資料相比,有巨大提升,猜測使用壓縮減少了寫入磁碟的資料量。
Figure 4 - Comparing INSERT performance with 16 clients
16個客戶端的SELECT,多數場景下,LZ4效能優於PGLZ:
F igure 5 - Comparing SELECT performance with 16 clients
同樣也比較了使用字串函式的SELECT、UPDATE處理文字的速度。整個場景下LZ4優於PGLZ。LZ4壓縮演算法的資料與未壓縮資料相比,函式處理的速度幾乎一樣,LZ4演算法幾乎不會影響字串操作速度。
Figure 6 - Comparing performance using string functions
與PGLZ相比,LZ4壓縮和解壓縮TOAST資料更加高效,並提供很好的效能。和未壓縮資料相比,查詢速度幾乎一樣,和PGLZ相比,插入快80%。當然某些場景下壓縮率不太好,但如過你想要提升執行速度,強烈推薦使用LZ4演算法。
同樣需要注意,需要考慮表中的資料是否合適壓縮。如果壓縮率不好,它仍然會嘗試壓縮數,然後放棄。這將導致額外的記憶體資源浪費,並極大影響插入資料的速度。
未來
LZ4對TOAST的壓縮和解壓縮效能帶來了很大提升。除了LZ4,還有很多其他壓縮演算法比如Zstandard。支援Zstandard使用者可以得到比PGLZ更好的壓縮率。LZ4 HC具有比LZ4解壓98.5%的壓縮速度,但是可以大幅提升壓縮率。希望未來PG版本可以使用更多的壓縮演算法。
除了TOAST外,其他場景也需要壓縮。據我所知,目前開發版本已經支援WAL的LZ4壓縮,這是一項令人興奮的特性。
原文
https://www.postgresql.fastware.com/blog/what-is-the-new-lz4-toast-compression-in-postgresql-14
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2843312/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 字串壓縮(二)之LZ4字串
- Linux下lz4解壓縮命令小結Linux
- PostgreSQL TOAST 技術解析SQLAST
- 如何理解postgresql toast表SQLAST
- 壓縮演算法一覽演算法
- 壓縮字串《演算法很美》字串演算法
- Ceph Reef(18.2.X)之壓縮演算法和壓縮模式演算法模式
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- Linux中檔案的壓縮和解壓縮Linux
- java實現字元壓縮演算法Java字元演算法
- 常見壓縮演算法總結演算法
- 模型壓縮-剪枝演算法詳解模型演算法
- MSZIP 演算法是一種壓縮演算法,用於在 Microsoft Windows Installer (MSI) 檔案中壓縮和儲存檔案。它是一種基於 Lempel-Ziv 演算法(LZ77)的演算法,旨在提供高效的檔案壓縮和解壓縮。演算法ROSWindows
- linux 高效壓縮工具之xz的壓縮解壓使用Linux
- 檔案壓縮和解壓縮
- 時序資料是如何被壓縮的?具體有哪些可選擇的壓縮演算法?演算法
- ppt怎麼壓縮,ppt壓縮的技巧分享
- 藍橋杯 演算法提高 字串壓縮演算法字串
- Python實現壓縮和解壓縮Python
- linux下壓縮解壓縮命令Linux
- linux壓縮和解壓縮命令整理Linux
- JS壓縮方法及批量壓縮JS
- 關gzip壓縮,我有新發現
- 超級簡單的資料壓縮演算法—LZW演算法演算法
- 前端效能優化gzip初探(補充gzip壓縮使用演算法brotli壓縮的相關介紹)前端優化演算法
- Linux下的tar壓縮解壓縮命令詳解Linux
- Linux 常用的壓縮與解壓縮命令詳解Linux
- 貪心演算法——Huffman 壓縮編碼的實現演算法
- 啃論文俱樂部 | 壓縮演算法團隊:我們是如何開展對壓縮演算法的學習研究演算法
- Linux tar分卷壓縮與解壓縮Linux
- pigz更快的壓縮和解壓工具
- Linux壓縮解壓Linux
- CentOS 壓縮解壓CentOS
- pdf怎麼壓縮,好用的pdf壓縮工具介紹
- 一文讀懂影象壓縮演算法演算法
- 20.1 OpenSSL 字元BASE64壓縮演算法字元演算法
- CNN 模型壓縮與加速演算法綜述CNN模型演算法
- 加密的壓縮包加密