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

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

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

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

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

הצומת הזה מתאם בין כמה תהליכי עבודה מקבילים. כל תהליך עבודה מבצע חלק מהמשימה, למשל סריקה של חלק מטבלה. לאחר מכן, הצומת 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צריכה להיות בטוחה להרצה מקבילית. כלומר, אף חלק בפעולה לא יכול להכיל פונקציות או ביטויים שלא ניתן להריץ במקביל בצורה בטוחה. אם ייקבע שחלק כלשהו בשאילתה לא בטוח להרצה מקבילית, האופטימיזציה תעבור לתוכנית לא מקבילית. מידע נוסף זמין במאמר בנושא בטיחות להרצה מקבילית.

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

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

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

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

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

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

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

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

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

  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 מתוך 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)

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