שיפור הביצועים של INSERT SELECT באמצעות SELECT מקביל

שימוש בהרצה מקבילית של החלק SELECT בשאילתה INSERT INTO ... SELECT יכול לשפר את ביצועי השאילתות ב-AlloyDB ל-PostgreSQL, במיוחד כשמדובר בטבלאות מחולקות ובשאילתות מורכבות.

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

איך תוכניות שאילתות מקבילות פועלות ב-PostgreSQL

ב-PostgreSQL, אופטימיזציית השאילתות יכולה ליצור תוכנית מקבילה לשאילתה שלמה או לחלק משאילתה. כשמערכת יוצרת תוכנית מקבילה, היא מוסיפה צומת Gather או Gather Merge לראש התוכנית.

הצומת הזה מתאם בין כמה תהליכי worker מקבילים. כל עובד מבצע חלק מהמשימה, למשל סריקה של חלק מטבלה. לאחר מכן, הצומת Gather אוסף את התוצאות מכל העובדים ומעביר אותן לשלב הבא של השאילתה או בחזרה ללקוח.

לדוגמה, בתוכנית השאילתה הבאה מוצג צומת Gather שמתכנן להשתמש בחמישה תהליכי עובד לסריקה מקבילית רציפה בטבלה t1.

EXPLAIN SELECT * FROM t1;

                  QUERY PLAN
-------------------------------------------------------------
 Gather  (cost=0.00..143359.76 rows=9999878 width=60)
   Workers Planned: 5
   ->  Parallel Seq Scan on t1  (cost=0.00..143359.76 rows=1999976 width=60)
(3 rows)

ביצוע מקביל של הצהרות INSERT...SELECT

‫AlloyDB משפר את INSERT INTO ... SELECTהביצועים באמצעות תהליכי עובד מרובים כדי להקביל את ההצהרה SELECT. חלוקת העבודה הזו יכולה לשפר את הביצועים של מסד הנתונים. השאילתה צריכה להיות בטוחה להרצה מקבילית, ולא צריכים להיות תנאים שמונעים הרצה מקבילית.

הרבה פעולות במסד נתונים משתמשות בהצהרות INSERT INTO ... SELECT כדי להוסיף שורות חדשות לטבלה. לרוב, החלק SELECT של ההצהרה הוא החלק הכי עתיר משאבים בשאילתה.

הפונקציונליות נשלטת על ידי פרמטרי ההגדרה הבאים:

  • enable_parallel_select_for_insert_select: הפעלה או השבתה של התכונה . הפרמטר הזה מופעל כברירת מחדל ב-PostgreSQL מגרסה 14 ואילך.
  • enable_parallel_select_for_insert_select_into_part_table: הפעלה או השבתה של התכונה שמאפשרת להוסיף נתונים לטבלאות עם חלוקה למחיצות. הפרמטר הזה מושבת כברירת מחדל ב-PostgreSQL מגרסה 16 ואילך.

כדי שהכלי לתכנון שאילתות יתייחס לתוכנית מקבילה, INSERT SELECTההצהרה צריכה להיות בטוחה לשימוש מקביל. המשמעות היא שאף חלק מהפעולה לא יכול להכיל פונקציות או ביטויים שלא ניתן להריץ בבטחה במקביל. אם נקבע שחלק כלשהו מהשאילתה לא בטוח לביצוע מקביל, האופטימיזציה חוזרת לתוכנית לא מקבילה. מידע נוסף זמין במאמר בנושא parallel-safety.

תנאים שמונעים ביצוע מקביל

אופטימיזציית השאילתות לא משתמשת בתוכנית מקבילית אם ההצהרה INSERT SELECT נחשבת כהצהרה שלא בטוח להריץ במקביל. התנאים הבאים מונעים את ההרצה המקבילה:

  • טבלת היעד היא טבלה זרה.
  • השאילתה משתמשת בביטוי טבלה נפוץ (CTE) שניתן לשינוי ומכיל הצהרה לשינוי נתונים, לדוגמה, DELETE.
  • אינדקס בטבלת היעד משתמש בביטוי או בפונקציה לא בטוחים מקבילים.
  • בעמודה בטבלת היעד מוגדר ערך ברירת מחדל שמשתמש בפונקציה לא בטוחה מקבילה.
  • טריגר בטבלת היעד משתמש בביטוי או בפונקציה לא בטוחים מקבילים.
  • בטבלת היעד יש עמודה בשם DOMAIN עם אילוץ CHECK שמשתמש בפונקציה לא בטוחה מקבילה.
  • אילוץ CHECK בטבלת היעד מכיל ביטוי או פונקציה לא בטוחים מקבילים.
  • טבלת היעד היא טבלה מחולקת למחיצות והאפשרות enable_parallel_select_for_insert_select_into_part_table מושבתת.

לפני שמתחילים

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

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות לשינוי של דגלי מסד נתונים ברמת הסשן, צריך לבקש מהאדמין להקצות לכם בפרויקט את התפקיד 'משתמש במסד נתונים' (roles/alloydb.databaseUser) בפלטפורמה לניהול הזהויות והרשאות הגישה (IAM) של AlloyDB. להסבר על מתן תפקידים, קראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

הפעלת פרמטרים של ביצוע מקביל

כדי להפעיל ביצוע מקביל של טבלאות יעד עם חלוקה למחיצות (partitioning), פועלים לפי השלבים הבאים:

  1. נכנסים לדף Clusters במסוף Google Cloud .

    כניסה לדף Clusters

  2. בוחרים אשכול מהרשימה.

  3. בתפריט הניווט, לוחצים על AlloyDB Studio.

  4. נכנסים ל-AlloyDB Studio באמצעות שם מסד הנתונים, שם המשתמש והסיסמה.

  5. מגדירים את ה-GUC‏ enable_parallel_select_for_insert_select_into_part_table לערך on.

    SET enable_parallel_select_for_insert_select_into_part_table = on;
    

    אחרי שמפעילים את הפרמטר GUC, הכלי לתכנון שאילתות בודק באופן אוטומטי תוכניות מקבילות להצהרות INSERT INTO ... SELECT שבהן היעד הוא טבלה מחולקת, בתנאי שהשאילתה מוגדרת כבטוחה להרצה מקבילה.

    בדוגמה הבאה מתקבל תוכנית EXPLAIN שכוללת צומת Gather, שמציין שהפעולה SELECT from source_table מבוצעת במקביל.

    -- Create a partitioned table
    CREATE TABLE part_table (a INT, b TEXT) PARTITION BY RANGE (a);
    CREATE TABLE part_table_1 PARTITION OF part_table FOR VALUES FROM (MINVALUE) TO (1000);
    CREATE TABLE part_table_2 PARTITION OF part_table FOR VALUES FROM (1000) TO (MAXVALUE);
    
    -- Create a source table
    CREATE TABLE source_table (c1 INT, c2 TEXT);
    INSERT INTO source_table SELECT i, 'value_' || i FROM generate_series(1, 2000) i;
    ANALYZE source_table;
    
    -- Enable the feature
    SET enable_parallel_select_for_insert_select_into_part_table = on;
    -- Optional for parallelizing the query with a small amount of data
    SET parallel_setup_cost=0;
    SET parallel_tuple_cost=0;
    SET min_parallel_table_scan_size=0;
    
    -- Run the insert with a parallelizable select
    EXPLAIN INSERT INTO part_table SELECT * FROM source_table;
    

    מתקבל הפלט הבא:

    EXPLAIN (COSTS OFF) INSERT INTO part_table SELECT * FROM source_table;
                    QUERY PLAN                   
    -----------------------------------------------
    Insert on part_table
    ->  Gather
            Workers Planned: 2
            ->  Parallel Seq Scan on source_table
    (4 rows)
    

השבתת פרמטרים של ביצוע מקביל

כדי להשבית את הפרמטרים, פועלים לפי השלבים הבאים:

  1. נכנסים לדף Clusters במסוף Google Cloud .

    כניסה לדף Clusters

  2. בוחרים אשכול מהרשימה.

  3. בתפריט הניווט, לוחצים על AlloyDB Studio.

  4. נכנסים ל-AlloyDB Studio באמצעות שם מסד הנתונים, שם המשתמש והסיסמה.

  5. כדי להשבית את הפרמטר enable_parallel_select_for_insert_select, מריצים את פקודת ה-SQL הבאה:

    SET enable_parallel_select_for_insert_select = OFF;
    
  6. כדי להשבית את הפרמטר enable_parallel_select_for_insert_select_into_part_table, מריצים את פקודת ה-SQL הבאה:

    SET enable_parallel_select_for_insert_select_into_part_table = OFF;
    

אימות של תוכנית מקבילה

כדי לוודא שהכלי לאופטימיזציה משתמש בתוכנית מקבילית, משתמשים בפקודה EXPLAIN. מחפשים את הצומת Gather ואת המאפיינים Workers Planned או Workers Launched בתוכנית השאילתה.

דוגמה לטבלה רגילה

בדוגמה הבאה של תוכנית, שישה תהליכי עובד מופעלים לביצוע של הצהרת SELECT בחיבור מקבילי של גיבוב.

EXPLAIN (ANALYZE)
INSERT INTO t1 SELECT t2.* FROM t1, t2 WHERE t1.c1 != t2.c1 AND t1.c2 = t2.c2;

                                 QUERY PLAN
------------------------------------------------------------------------------------
 Insert on t1  (cost=1209138.00..12801765.49 rows=0 width=0) (actual time=16812.677..19337.150 rows=0 loops=1)
   ->  Gather  (cost=1209138.00..12801765.49 rows=99995407 width=24) (actual time=16812.674..19337.144 rows=0 loops=1)
         Workers Planned: 6
         Workers Launched: 6
         ->  Parallel Hash Join  (...)
(...)

דוגמה לטבלה מחולקת למחיצות

בדוגמה הבאה אפשר לראות שאחרי שמפעילים את התכונה של טבלאות מחולקות, התוכנית מציגה צומת Gather עם ארבעה עובדים מתוכננים עבור SELECT.

-- First, enable the feature for partitioned tables
SET enable_parallel_select_for_insert_select_into_part_table = ON;

-- Then, explain the query
EXPLAIN (COSTS OFF) INSERT INTO part_table SELECT * FROM source_table;
                  QUERY PLAN                   
-----------------------------------------------
 Insert on part_table
   ->  Gather
         Workers Planned: 2
         ->  Parallel Seq Scan on source_table
(4 rows)

המאמרים הבאים