אלגוריתם הדחיסה החדש של TOAST LZ4 ב-PostgreSQL 14. כמה מהר זה יכול להיות?

עדכון: 2 ביולי 2023

עבור אפשרויות דחיסה של עמודות, PostgreSQL 14 מספק שיטת דחיסה חדשה LZ4. בהשוואה לשיטת הדחיסה הקיימת PGLZ ב-TOAST, דחיסת LZ4 מהירה יותר. מאמר זה מתאר כיצד להשתמש באפשרות כולה ולהשוות את הביצועים שלה עם אלגוריתמי דחיסה אחרים.

רקע

ב-PG, הדף הוא יחידת אחסון הנתונים, וברירת המחדל היא 8KB. באופן כללי, אסור לאחסן שורה של נתונים על פני דפים. עם זאת, ישנם כמה סוגי נתונים באורך משתנה, והנתונים המאוחסנים עשויים לחרוג מעמוד אחד של האוניברסיטה. על מנת להתגבר על כל המגבלה, השדה הגדול ידחס או יפוצל למספר שורות פיזיות. הטכניקה הזו היא TOAST:

כברירת מחדל, אם יש בטבלה עמודות באורך משתנה, וגודל נתוני השורה חורג מ-TOAST_TUPLE_THRESHOLD (ברירת מחדל של 2KB), TOAST יופעל. ראשית, הנתונים יידחסו תחילה; אם הוא עדיין גדול מדי לאחר הדחיסה, האחסון יעלה על גדותיו. יש לציין שאם אסטרטגיית אחסון העמודות מציינת EXTERNAL/PLAIN, הדחיסה תהיה אסורה.

לפני PG14, TOAST תומך רק באלגוריתם דחיסה אחד PGLZ (אלגוריתם מובנה ב-PG). אבל אלגוריתמי דחיסה אחרים עשויים להיות מהירים יותר מ-PGLZ או בעלי יחס דחיסה גבוה יותר. קיימת אפשרות דחיסה חדשה של LZ4 ב-PG14, שהוא אלגוריתם דחיסה ללא הפסדים הידוע במהירות שלו. אז אנחנו יכולים לצפות שזה יעזור להגביר את המהירות של דחיסה ופירוק TOAST.

כיצד להשתמש ב-LZ4?

על מנת להשתמש בתכונת הדחיסה של LZ4, עליך לציין -with-lz4 בעת ההידור, ולעקוב אחר ספריית LZ4 במערכת ההפעלה. ניתן לציין את אלגוריתם ברירת המחדל של דחיסה של TOAST של מופע PG באמצעות פרמטר GUC default_toast_compression. יכול להיות ב-postgresql. הגדר ב-conf, אתה יכול גם לשנות רק את החיבור הנוכחי באמצעות הפקודה SET:

postgres=# SET ברירת המחדל_toast_compression=lz4;

SET

ציין את אלגוריתם דחיסת העמודות בעת יצירת טבלה ב-CREATE TABLE:

אנו יכולים להשתמש בפקודה d+ כדי לראות את אלגוריתם הדחיסה עבור כל העמודות. אם העמודה לא תומכת או לא מציינת את אלגוריתם הדחיסה, אז יוצג רווח בעמודת הדחיסה. בדוגמה שלמעלה, עמודת המזהה אינה תומכת באלגוריתם הדחיסה, העמודה col1 משתמשת ב-PGLZ, col2 משתמשת ב-LZ4, ו-col3 לא מציינת את אלגוריתם הדחיסה, ואז היא תשתמש באלגוריתם הדחיסה המוגדר כברירת מחדל.

ניתן לשנות את אלגוריתם דחיסת העמודות דרך ALTER TABLE, אך יש לציין שהאלגוריתם המשונה משפיע על נתוני ההוספה רק לאחר ביצוע הפקודה כולה.

postgres=# INSERT INTO tbl VALUEs (1, חזור('abc',1000), חזור('abc',1000), חזור('abc',,))',

הכנס 0 1

postgres=# ALTER TABLE tbl ALTER COLUMN col1 SET דחיסה lz4;

לוח אלטר

postgres=# INSERT INTO tbl VALUEs (2, חזור('abc',1000), חזור('abc',1000), חזור('abc',,))',

הכנס 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-# מ-tbl;

id | compression_colid | compression_col1 | compression_col2 | compression_col3

- - -----

1 | | pglz | lz4 | lz4

2 | | lz4 | lz4 | lz4

(2 שורות)

אתה יכול לראות שעבור שורות שהוכנסו לפני שינוי אלגוריתם הדחיסה, col1 עדיין משתמש באלגוריתם הדחיסה PGLZ, גם אם אלגוריתם הדחיסה שונה מ-PGLZ ל-LZ4. (אז באיזה אלגוריתם יש להשתמש לביטול דחיסה לאחר שינוי?)

שים לב שאם אתה סורק נתונים מטבלה אחרת ומכניס אותם לטבלה זו, כגון CREATE TABLE. . . כפי ש. . . או INSERT INTO. . . בחר. . . , אלגוריתם הדחיסה המשמש את הנתונים שהוכנסו עדיין משתמש בשיטת הדחיסה של הנתונים המקוריים. pg_dump ו-pg_dumpall הוסיפו גם את האפשרות-no-toast-compuression. לאחר השימוש בכל האופציה, אפשרות הדחיסה של TOAST לא תישלל.

השוואה בין ביצועים

בדק את קצב הדחיסה ומהירות הדחיסה של LZ4 ו- PGLZ. והוסיף את תוצאות הבדיקה של נתונים לא דחוסים (אסטרטגיית האחסון שצוינה היא חיצונית). עבור נתונים לא דחוסים, אין דחיסה ופירוק זמן שגוזלים זמן, אבל הזמן לקריאה ולכתיבה של נתונים יגדל.

נתונים ששימשו במבחן: מסמכי PG (קובץ HTML אחד לכל שורת נתונים); נתונים שסופקו על ידי SilesiaCorpus, כולל HTML, טקסט, קוד מקור, קבצים בינאריים הניתנים להפעלה ותמונות

בדיקת שימוש במכונהאינטל? 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 כדי לראות את ההשפעה של אלגוריתמי דחיסה שונים.

ראשית, השווה את הביצועים של הצהרת INSERT, בעת שימוש ב-LZ, PGLZ, ולא באמצעות דחיסה. ניתן לראות שבהשוואה לנתונים לא דחוסים, LZ4 לוקח קצת יותר זמן, ו-PGLZ לוקח יותר זמן. זמן הדחיסה של LZ4 נמוך ב-20% מזה של PGLZ בממוצע. זהו שיפור משמעותי ביותר.

איור 2 - השוואת ביצועי INSERT

השווה את SELECT למטה. בהשוואה ל-PGLZ, LZ4 יכול לחסוך 20% מהזמן, ואין הרבה הבדל בהשוואה לנתונים לא דחוסים. עלות הדקומפרסיה הופחתה לרמה נמוכה מאוד.

איור 3 - השוואת ביצועי SELECT

השווה את הצהרות INSERT במקביל של 16 לקוחות. בהשוואה ל-PGLZ, ביצועי הדחיסה של קבצים גדולים בודדים (HTML, טקסט באנגלית, קוד מקור, קבצי הפעלה בינאריים, תמונות) באמצעות LZ4 מהירים ב-60% -70%. הכנס מספר קבצים קטנים (קבצי PG), הביצועים אינם משופרים. בהשוואה לנתונים לא דחוסים, יש שיפור עצום. משערים ששימוש בדחיסה מפחית את כמות הנתונים הנכתבים לדיסק.

איור 4 - השוואת ביצועי INSERT עם 16 לקוחות

עם 16 לקוח SELECTs, LZ4 מתפקד טוב יותר מאשר PGLZ ברוב התרחישים:

איור 5 - השוואת ביצועי SELECT עם 16 לקוחות

זה גם משווה את מהירות עיבוד הטקסט באמצעות פונקציות מחרוזת SELECT ו-UPDATE. LZ4 עדיף על PGLZ בכל הסצנה. בהשוואה לנתונים הלא דחוסים, לנתונים של אלגוריתם הדחיסה LZ4 יש כמעט אותה מהירות עיבוד פונקציות, ואלגוריתם LZ4 כמעט ולא משפיע על מהירות פעולת המחרוזת.

איור 6 - השוואת ביצועים באמצעות פונקציות מחרוזת

בהשוואה ל-PGLZ, LZ4 דוחס ומפרק את נתוני TOAST בצורה יעילה יותר ומספק ביצועים טובים. בהשוואה לנתונים לא דחוסים, מהירות השאילתה כמעט זהה, ובהשוואה ל-PGLZ, ההכנסה מהירה ב-80%. כמובן שקצב הדחיסה לא טוב במיוחד בחלק מהתרחישים, אבל אם אתה רוצה להגביר את מהירות הביצוע, מומלץ מאוד להשתמש באלגוריתם LZ4.

כמו כן צריך לשים לב, צריך לשקול האם הנתונים בטבלה מתאימים לדחיסה. אם יחס הדחיסה לא טוב, הוא עדיין ינסה לדחוס את המספר ואז לוותר. זה יביא לתוספתRAMבזבוז משאבים, ומשפיעים מאוד על מהירות הכנסת הנתונים.

עתיד

LZ4 שיפר מאוד את ביצועי הדחיסה והדחיסה של TOAST. בנוסף ל-LZ4, ישנם אלגוריתמי דחיסה רבים אחרים כגון Zstandard. משתמשים התומכים ב-Zstandard יכולים לקבל יחס דחיסה טוב יותר מאשר PGLZ. ל-LZ4 HC יש ​​מהירות דחיסה של 98.5% ממהירות דחיסה של LZ4, אבל זה יכול להגביר מאוד את קצב הדחיסה. מקווה שהגרסה העתידית של PG יכולה להשתמש באלגוריתמי דחיסה נוספים.

בנוסף ל-TOAST, צריך לדחוס גם סצנות אחרות. עד כמה שידוע לי, גרסת הפיתוח הנוכחית כבר תומכת בדחיסת LZ4 של WAL, שהיא תכונה מרגשת.