שאילתות גלובליות
שאילתות גלובליות מאפשרות להריץ שאילתות SQL שמפנות לנתונים שמאוחסנים ביותר מאזור אחד.
לדוגמה, אפשר להריץ שאילתה גלובלית שמצטרפת לטבלה שנמצאת ב-us-central1
עם טבלה שנמצאת ב-europe-central2. במאמר הזה מוסבר איך להפעיל ולהריץ שאילתות גלובליות בפרויקט.
לפני שמתחילים
מוודאים שהפעלתם את האפשרות 'שאילתות גלובליות' בפרויקט ושיש לכם את ההרשאות הנדרשות להפעלת שאילתות גלובליות.
הפעלת שאילתות גלובליות
כדי להפעיל שאילתות גלובליות בפרויקט או בארגון, משתמשים בהצהרה ALTER PROJECT SET OPTIONS או בהצהרה ALTER ORGANIZATION SET OPTIONS כדי לשנות את הגדרת ברירת המחדל.
- כדי להריץ שאילתות גלובליות באזור מסוים, צריך להגדיר את הארגומנט
enable_global_queries_executionלערךtrueבאותו אזור עבור הפרויקט שמריץ את השאילתה. - כדי לאפשר לשאילתות גלובליות להעתיק נתונים מאזור מסוים, צריך להגדיר את הארגומנט
enable_global_queries_data_accessלערךtrueבאותו אזור עבור הפרויקט שמכיל את הנתונים. - האפשרויות האלה מסומנות בכל פעם שהשאילתה ניגשת לטבלאות מרוחקות.
- אפשר להריץ שאילתות גלובליות בפרויקט אחד ולשלוף נתונים מאזורים אחרים מפרויקט אחר.
דוגמה: הגדרה של פרויקט חוצה
בדוגמה הבאה מוצג איך להריץ שאילתה בפרויקט אחד כדי לגשת לטבלה בפרויקט אחר.
נניח שיש לכם פרויקט query_project שמריץ משימות באזור us-central1, ואתם רוצים להריץ שאילתה שמתייחסת לטבלה data_project.dataset.my_table שנמצאת באזור europe-west1:
SET @@location='us-central1';
SELECT
*
FROM
`query_project.dataset.my_table`
JOIN `data_project.dataset.my_other_table` USING id;
כדי שהשאילתה עם אחזור נתונים גלובלי הזו תפעל בהצלחה, נדרשת ההגדרה הבאה:
צריך להפעיל את ההרצה של שאילתות גלובליות בפרויקט (
query_project) באזור שבו מורצת שאילתה גלובלית (us-central1):ALTER PROJECT `
query_project` SET OPTIONS ( `region-us-central1.enable_global_queries_execution` = TRUE );צריך להפעיל העתקת נתונים באמצעות שאילתות גלובליות מהפרויקט שמכיל את הנתונים (
data_project) לאזור שלו (europe-west1):ALTER PROJECT `
data_project` SET OPTIONS ( `region-europe-west1.enable_global_queries_data_access` = TRUE );
כדי ליצור תצוגות שמכילות טבלאות מרוחקות ולהשתמש בהן, צריך לפעול לפי אותם עקרונות: צריך להפעיל את enable_global_queries_execution בפרויקט שבו מריצים את השאילתות.
צריך להריץ את הפעולות האלה ALTER PROJECT בנפרד כי הן מתייחסות לפרויקטים ולאזורים שונים.
יכול להיות שיחלפו כמה דקות עד שהשינוי ייכנס לתוקף.
ההרשאה הנדרשת
כדי להפעיל שאילתה עם אחזור נתונים גלובלי, נדרשת ההרשאה bigquery.jobs.createGlobalQuery.
התפקיד BigQuery Admin הוא התפקיד המוגדר מראש היחיד שמכיל את ההרשאה הזו. כדי להעניק הרשאה להריץ שאילתות גלובליות בלי להעניק את תפקיד האדמין ב-BigQuery, פועלים לפי השלבים הבאים:
- יוצרים תפקיד בהתאמה אישית, לדוגמה BigQuery global queries executor (מריץ שאילתות גלובליות ב-BigQuery).
- הוספת
bigquery.jobs.createGlobalQueryלתפקיד הזה. - מקצים את התפקיד הזה למשתמשים או לחשבונות שירות נבחרים.
שאילתת נתונים
כדי להריץ שאילתה גלובלית, כותבים שאילתת SQL כמו שהייתם כותבים אם הנתונים היו במיקום יחיד. אם הנתונים שאליהם מתייחסת השאילתה מאוחסנים ביותר ממיקום אחד, מערכת BigQuery מנסה להריץ שאילתה גלובלית. במקרים מסוימים, BigQuery בוחר באופן אוטומטי את המיקום של השאילתה. אחרת, צריך לציין את המיקום שבו רוצים להריץ את השאילתה. נתונים שהשאילתה מפנה אליהם ולא נמצאים במיקום שנבחר מועתקים למיקום הזה.
בדוגמה הבאה מריצים שאילתה גלובלית שמאחדת טבלאות משני מערכי נתונים שונים שמאוחסנים בשני מיקומים שונים:
SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions
המיקום ייבחר אוטומטית
במקרים הבאים, המיקום שבו צריך להריץ את השאילתה נקבע באופן אוטומטי ואי אפשר לשנות אותו:
- שאילתות בשפת שינוי נתונים (הצהרות
INSERT,UPDATE,DELETE) תמיד מופעלות במיקום של טבלת היעד. - שאילתות בשפת הגדרת נתונים (DDL), כמו הצהרת
CREATE TABLE AS SELECT, תמיד מבוצעות במיקום שבו נוצר או משתנה משאב. - שאילתות עם טבלת יעד שצוינה תמיד מופעלות במיקום שבו נמצאת טבלת היעד.
בחירת מיקום
באופן כללי, אתם קובעים איפה השאילתות הגלובליות יופעלו. כדי לקבל את ההחלטה הזו, צריך לשקול את הדברים הבאים:
שאילתות גלובליות מעתיקות באופן זמני נתונים ממיקום אחד למיקום אחר. אם לארגון שלכם יש דרישות לגבי מיקום הנתונים, ואתם לא רוצים שהנתונים ממיקום א' ייצאו ממיקום א', אתם צריכים להגדיר את מיקום השאילתה ל-א'.
כדי להקטין את כמות הנתונים שמועברים בין מיקומים ולהפחית את עלות השאילתה, מריצים את השאילתה באזור שבו מאוחסנת רוב כמות הנתונים שמופיעה בשאילתה.
נניח שיש לכם חנות וירטואלית ואתם שומרים רשימה של המוצרים שלכם במיקום us-central1, אבל העסקאות מתבצעות באזור us-south1. אם יש יותר עסקאות ממוצרים בקטלוג, צריך להריץ את השאילתה באזור us-south1.
הסבר על שאילתות גלובליות
כדי להריץ שאילתות גלובליות בצורה יעילה וחסכונית, חשוב להבין את המנגנון שמאחורי ההרצה שלהן.
כדי להשתמש בנתונים שנמצאים במיקומים שונים, צריך לשכפל אותם למיקום אחד. התרשים הבא הוא אבסטרקציה של תהליך העבודה של שאילתה גלובלית שמבוצעת על ידי BigQuery:
- קובעים איפה צריך להריץ את השאילתה – בהצהרה של המשתמש או באופן אוטומטי. המיקום הזה נקרא מיקום ראשי, וכל שאר המיקומים שאליהם מתייחסת השאילתה הם מרוחקים.
- מריצים שאילתת משנה בכל אזור מרוחק כדי לאסוף את הנתונים שנדרשים להשלמת השאילתה באזור הראשי.
- מעתיקים את הנתונים האלה ממיקומים מרוחקים למיקום הראשי.
- שמירת הנתונים בטבלאות זמניות במיקום הראשי למשך 24 שעות.
- מריצים שאילתה סופית עם כל הנתונים שנאספו במיקום הראשי.
- החזרת תוצאות השאילתה.
מערכת BigQuery מנסה לצמצם את כמות הנתונים שמועברים בין אזורים. דוגמה:
SET @@location = 'EU';
SELECT
t1.col1, t2.col2
FROM
eu_dataset.table1 t1
JOIN us_dataset.table2 t2 using col3
WHERE
t2.col4 = 'ABC'
ב-BigQuery אין צורך לשכפל את כל הטבלה t2 מארה"ב לאיחוד האירופי.
מספיק להעביר רק את העמודות המבוקשות (col2 ו-col3) ורק את השורות שתואמות לתנאי WHERE (t2.col4 = 'ABC'). עם זאת, המנגנונים האלה, שנקראים pushdowns, תלויים במבנה השאילתה, ולפעמים כמות הנתונים שמועברת עשויה להיות גדולה.
מומלץ לבדוק שאילתות גלובליות על קבוצת משנה קטנה של נתונים ולוודא שהנתונים מועברים רק כשצריך.
ניראות (observability)
כדי לראות את טקסט השאילתה שנשלח לאזור המרוחק, בודקים את היסטוריית העבודות. למשרה המרוחקת יש אותו מזהה משרה כמו לשאילתה המקורית, עם הסיומת _xregion.
השבתת שאילתות גלובליות
כדי להשבית שאילתות גלובליות בפרויקט או בארגון, משתמשים ב-ALTER PROJECT SET OPTIONS statement או ב-ALTER ORGANIZATION SET OPTIONS statement כדי לשנות את הגדרת ברירת המחדל.
- כדי להשבית שאילתות גלובליות באזור מסוים, מגדירים את הארגומנט
enable_global_queries_executionלערךfalseאוNULLבאזור הזה. - כדי למנוע משאילתות גלובליות להעתיק נתונים מאזור מסוים, צריך להגדיר את הארגומנט
enable_global_queries_data_accessלערךfalseאוNULLבאותו אזור.
בדוגמה הבאה מוצג איך משביתים שאילתות גלובליות ברמת הפרויקט:
ALTER PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.enable_global_queries_execution` = false, `region-REGION.enable_global_queries_data_access` = false );
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: שם הפרויקט שרוצים לשנות -
REGION: שם האזור שבו רוצים להשבית את השאילתות הגלובליות
יכול להיות שיחלפו כמה דקות עד שהשינוי ייכנס לתוקף.
תמחור
העלות של שאילתה גלובלית מורכבת מהרכיבים הבאים:
- עלות החישוב של כל שאילתת משנה במיקומים מרוחקים, על סמך מודל התמחור שלכם במיקומים האלה
- עלות החישוב של השאילתה הסופית באזור שבו היא מופעלת, על סמך מודל התמחור שלכם באותו אזור
- העלות של העתקת נתונים בין מיקומים שונים, בהתאם לתמחור של רפליקציית נתונים
- העלות של אחסון נתונים שהועתקו מאזורים מרוחקים לאזור הראשי (למשך 24 שעות), בהתאם לתמחור האחסון
מכסות
מידע על מכסות שקשורות לשאילתות גלובליות זמין במאמר Query jobs.
מגבלות
- פרטי ההפעלה וגרף ההפעלה של שאילתה לא מציגים את מספר הבייטים שעברו עיבוד והועברו ממיקומים מרוחקים. המידע הזה מופיע בעבודות העתקה שאפשר למצוא בהיסטוריית העבודות. למזהה המשימה של משימת העתקה שנוצרה על ידי שאילתה גלובלית יש את מזהה המשימה של משימת השאילתה כקידומת.
- אין תמיכה בשאילתות גלובליות במצב סביבת ארגז חול.
- שאילתות גלובליות לא אפשריות כשמשתמשים בנקודות קצה אזוריות.
- השהייה בשאילתות גלובליות גבוהה יותר מאשר בשאילתות באזור יחיד, כי נדרש זמן להעברת נתונים בין אזורים.
- שאילתות גלובליות לא משתמשות במטמון כדי למנוע העברת נתונים בין אזורים.
- אי אפשר לשלוח שאילתות לגבי עמודות פסאודו, כמו
_PARTITIONTIME, באמצעות שאילתות גלובליות. - אי אפשר להריץ שאילתות גלובליות על עמודות מסוג
RANGE. - אי אפשר לשלוח שאילתות לעמודות באמצעות שמות עמודות גמישים עם שאילתות גלובליות.
- אי אפשר לשלוח שאילתה לגבי תצוגות של
INFORMATION_SCHEMAמאזור מרוחק בשאילתה גלובלית. - אין תמיכה בתצוגות מורשות ובשגרות מורשות גלובליות (כשניתנת הרשאה לתצוגה או לשגרה במיקום אחד לגשת למערך נתונים במיקום אחר). במקום זאת, יוצרים תצוגות מורשות באזור שבו הנתונים נמצאים ומריצים שאילתות על התצוגות המורשות באמצעות שאילתות גלובליות.
- אין תמיכה בתצוגות חומריות של שאילתות גלובליות.
- אם השאילתה הגלובלית מפנה לעמודות
STRUCT, לא מוחלים שיפורים על אף אחת מהשאילתות המשניות המרוחקות. כדי לשפר את הביצועים, כדאי ליצור תצוגה באזור המרוחק שמסננת עמודותSTRUCTומחזירה רק את השדות הנדרשים כעמודות נפרדות. - הביצוע של שאילתות גלובליות לא מתבצע באופן אטומי. במקרים שבהם שכפול הנתונים מצליח, אבל השאילתה הכוללת נכשלת, עדיין תחויבו על שכפול הנתונים.
- טבלאות זמניות שנוצרות באזורים מרוחקים כחלק מהרצת שאילתות גלובליות מוצפנות רק באמצעות מפתחות הצפנה בניהול הלקוח (CMEK) אם מפתח CMEK שהוגדר להצפנת התוצאות של השאילתה הגלובלית (ברמת הטבלה, מערך הנתונים או הפרויקט) הוא גלובלי. כדי לוודא שטבלאות זמניות מרוחקות תמיד מוגנות באמצעות CMEK, צריך להגדיר מפתח KMS כברירת מחדל לפרויקט שבו מופעלות שאילתות גלובליות באזור המרוחק.
- אין תמיכה בשאילתות גלובליות ב-Assured Workloads.
- שאילתה גלובלית אחת יכולה לגשת לעד 10 טבלאות מרוחקות בכל אזור.