מבוא לשאילתות לכמה מסדי נתונים
בדף הזה מוסבר איך להשתמש בשאילתות מאוחדות, ומפורטות הנחיות לשאילתות של נתונים מ-Spanner, מ-AlloyDB ומ-Cloud SQL מתוך BigQuery.
שאילתות מאוחדות מאפשרות לשלוח הצהרת שאילתה למסדי נתונים של AlloyDB, Spanner או Cloud SQL ולקבל את התוצאה כטבלה זמנית. שאילתות מאוחדות משתמשות ב-BigQuery Connection API כדי ליצור חיבור ל-AlloyDB, ל-Spanner או ל-Cloud SQL.
בשאילתה, משתמשים בפונקציה EXTERNAL_QUERY כדי לשלוח הצהרת שאילתה למסד הנתונים החיצוני, באמצעות דיאלקט ה-SQL של מסד הנתונים הזה.
התוצאות מומרות לסוגי נתונים של GoogleSQL.
מאגרי נתונים נתמכים
אפשר להשתמש בשאילתות מאוחדות עם מאגרי הנתונים הבאים:
תהליך עבודה
- מזהים את Google Cloud הפרויקט שכולל את מקור הנתונים שרוצים לשלוח לו שאילתה.
bigquery.adminמשתמש יוצר משאב חיבור ב-BigQuery.- משתמש אדמין מעניק למשתמש ב'הרשאה להשתמש במשאב החיבור'.
- אם האדמין והמשתמש ב' הם אותו אדם, אין צורך להעניק הרשאה.
- משתמש ב' כותב שאילתה ב-BigQuery עם פונקציית ה-SQL החדשה
EXTERNAL_QUERY.
חלופות לשאילתות לכמה מסדי נתונים: טבלאות וקבוצות נתונים חיצוניות
אפשרות נוספת לשליחת שאילתות למסדי נתונים תפעוליים כמו Bigtable, Spanner, Cloud Storage, Google Drive ו-Salesforce Data Cloud היא שימוש בטבלאות ובמערכי נתונים חיצוניים. מערכי נתונים וטבלאות חיצוניים מאפשרים לכם להציג טבלאות וסכימות ולשאול אותן בלי להשתמש בפונקציית SQL EXTERNAL_QUERY. לא צריך להחזיר את הנתונים ל-BigQuery, ואפשר להשתמש בתחביר של BigQuery במקום לכתוב בדיאלקט הספציפי של SQL במסד הנתונים של SQL.
אזורים נתמכים
רשימת המיקומים הנתמכים מופיעה בסעיפים הבאים:
AlloyDB ו-Cloud SQL
שאילתות מאוחדות נתמכות רק באזורים שבהם נתמכים גם מקור הנתונים החיצוני וגם BigQuery.
אתם יכולים ליצור חיבור ולהריץ שאילתה לכמה מסדי נתונים בין אזורים לפי הכללים הבאים:
אזורים יחידים
אפשר להריץ שאילתה על משאב באזור יחיד ב-BigQuery רק אם המשאב נמצא באותו אזור.
לדוגמה, אם מערך הנתונים נמצא ב-us-east4, אפשר להריץ שאילתות על מופעי Cloud SQL או על מופעי AlloyDB שנמצאים ב-us-east4. מיקום עיבוד השאילתה הוא אזור יחיד ב-BigQuery.
מספר אזורים
אפשר להריץ שאילתות ב-BigQuery במספר אזורים כדי לגשת לכל אזור של מקור נתונים באותו אזור גיאוגרפי גדול (ארה"ב, האיחוד האירופי). מיקומים מרובי-אזורים לא זמינים למופעי Cloud SQL, כי הם משמשים רק לגיבויים.
שאילתה שמופעלת במספר אזורים בארה"ב ב-BigQuery יכולה לשלוח שאילתה לכל אזור יחיד באזור הגיאוגרפי של ארה"ב, כמו
us-central1,us-east4אוus-west2.שאילתה שמופעלת במספר אזורים באיחוד האירופי ב-BigQuery יכולה לשלוח שאילתה לכל אזור יחיד במדינות החברות באיחוד האירופי, כמו
europe-north1אוeurope-west3.המיקום שבו השאילתה פועלת חייב להיות זהה למיקום של משאב החיבור. לדוגמה, שאילתות שמופעלות מאזור גיאוגרפי נרחב יותר שכולל מספר אזורים בארה"ב חייבות להשתמש בחיבור שנמצא באזור גיאוגרפי נרחב יותר שכולל מספר אזורים בארה"ב.
ביצועי השאילתה משתנים בהתאם למידת הקרבה בין קבוצת הנתונים לבין מקור הנתונים החיצוני. לדוגמה, שאילתה לכמה מסדי נתונים בין מערך נתונים באזור ארה"ב שכולל מספר אזורים לבין מכונת Cloud SQL באזור us-central1 תהיה מהירה. עם זאת, אם תריצו את אותה שאילתה בין אזור במספר אזורים בארה"ב לבין מופע Cloud SQL ב-us-east4, הביצועים עשויים להיות איטיים יותר.
המיקום לעיבוד שאילתות הוא מיקום במספר אזורים, US או EU.
Spanner
Spanner תומך בהגדרות אזוריות ובהגדרות של מספר אזורים. אפשר להריץ שאילתות במופע Spanner באזור נתמך כלשהו של Spanner מ-BigQuery באזור יחיד או במספר אזורים. פרטים נוספים זמינים במאמר בנושא שאילתות חוצות אזורים.
מיפוי של סוגי נתונים
כשמריצים שאילתה לכמה מסדי נתונים, הנתונים ממקור הנתונים החיצוני מומרים לסוגי GoogleSQL. מידע נוסף מופיע במאמר שאילתות מאוחדות ב-Cloud SQL.
מכסות ומגבלות
- שאילתות מאוחדות בין אזורים. אם המיקום של עיבוד השאילתות ב-BigQuery שונה מהמיקום של מקור הנתונים החיצוני, מדובר בשאילתה חוצת-אזורים. בכל פרויקט אפשר להריץ שאילתות חוצות אזורים בהיקף של עד TB אחד ביום. הנה דוגמה לשאילתה חוצת-אזורים.
- מופע Cloud SQL נמצא במיקום
us-west1, והחיבור ל-BigQuery מבוסס על מספר אזורים בארה"ב. מיקום עיבוד השאילתות ב-BigQuery הואUS.
- מופע Cloud SQL נמצא במיקום
- Quota. המשתמשים צריכים לשלוט במכסת השאילתות במקור הנתונים החיצוני, כמו Cloud SQL או AlloyDB. אין הגדרת מכסה נוספת לשאילתות מאוחדות. כדי לבודד את עומס העבודה, מומלץ לשלוח שאילתות רק למסד נתונים משוכפל לקריאה.
- מספר הבייטים המקסימלי שיחויבו. השדה הזה לא נתמך בשאילתות מאוחדות. אי אפשר לחשב את הבייטים שמחויבים עליהם לפני שמריצים בפועל את השאילתות המאוחדות.
- מספר החיבורים. שאילתה לכמה מסדי נתונים יכולה לכלול עד 10 חיבורים ייחודיים.
- Cloud SQL MySQL ו-PostgreSQL. בכפוף למכסות ולמגבלות.
מגבלות
שאילתות מאוחדות כפופות למגבלות הבאות:
ביצועים. שאילתה לכמה מסדי נתונים כנראה לא תהיה מהירה כמו שאילתה שמופנית רק לאחסון ב-BigQuery. מערכת BigQuery צריכה להמתין עד שמסד הנתונים של המקור יבצע את השאילתה החיצונית ויעביר נתונים ממקור הנתונים החיצוני ל-BigQuery באופן זמני. בנוסף, יכול להיות שמסד הנתונים של המקור לא עבר אופטימיזציה לשאילתות ניתוח מורכבות.
ביצועי השאילתה משתנים גם בהתאם למידת הקרבה בין קבוצת הנתונים לבין מקור הנתונים החיצוני. מידע נוסף זמין במאמר בנושא אזורים נתמכים.
שאילתות משותפות הן לקריאה בלבד. השאילתה החיצונית שמופעלת במסד הנתונים של המקור חייבת להיות לקריאה בלבד. לכן, אין תמיכה בהצהרות DML או DDL.
סוגי נתונים שלא נתמכים. אם השאילתה החיצונית מכילה סוג נתונים שלא נתמך ב-BigQuery, השאילתה תיכשל באופן מיידי. אפשר להמיר את סוג הנתונים שלא נתמך לסוג נתונים אחר שנתמך.
מפתחות הצפנה בניהול הלקוח (CMEK). ההגדרה של CMEK מתבצעת בנפרד ל-BigQuery ולמקורות נתונים חיצוניים. אם מגדירים את מסד הנתונים של המקור לשימוש ב-CMEK אבל לא ב-BigQuery, הטבלה הזמנית שמכילה את התוצאות של שאילתה לכמה מסדי נתונים מוצפנת באמצעות Google-owned and Google-managed encryption key.
תמחור
אם אתם משתמשים במודל התמחור על פי דרישה, אתם מחויבים על מספר הבייטים שמוחזרים מהשאילתה החיצונית כשמבצעים שאילתות מאוחדות מ-BigQuery. מידע נוסף זמין במאמר תמחור של ניתוח נתונים על פי דרישה.
אם אתם משתמשים במהדורות BigQuery, החיוב מתבסס על מספר הסלוטים שבהם אתם משתמשים. מידע נוסף זמין במאמר בנושא תמחור של קיבולת מחשוב.
העברת פעולות SQL למטה
שאילתות מאוחדות כפופות לטכניקת האופטימיזציה שנקראת SQL pushdowns.
הם משפרים את הביצועים של שאילתה על ידי העברת פעולות כמו סינון למקור הנתונים החיצוני, במקום לבצע אותן ב-BigQuery.
צמצום כמות הנתונים שמועברת ממקור הנתונים החיצוני יכול לקצר את זמן הביצוע של השאילתה ולהפחית את העלויות. העברות של SQL כוללות הסרת עמודות (סעיפים SELECT) והעברות של מסננים (סעיפים WHERE).
כשמשתמשים בפונקציה EXTERNAL_QUERY, המערכת מבצעת SQL pushdown על ידי כתיבה מחדש של השאילתה המקורית.
בדוגמה הבאה, נעשה שימוש בפונקציה EXTERNAL_QUERY כדי לתקשר עם מסד נתונים של Cloud SQL:
SELECT COUNT(*) FROM ( SELECT * FROM EXTERNAL_QUERY("CONNECTION_ID", "select * from operations_table") ) WHERE a = 'Y' AND b NOT IN ('COMPLETE','CANCELLED');
מחליפים את CONNECTION_ID במזהה של החיבור ל-BigQuery.
בלי העברת פעולות ל-SQL, השאילתה הבאה נשלחת ל-Cloud SQL:
SELECT * FROM operations_table
כשמריצים את השאילתה הזו, כל הטבלה נשלחת בחזרה ל-BigQuery, למרות שצריך רק חלק מהשורות והעמודות.
בעזרת SQL pushdowns, השאילתה הבאה נשלחת ל-Cloud SQL:
SELECT `a`, `b` FROM ( SELECT * FROM operations_table) t WHERE ((`a` = 'Y') AND (NOT `b` IN ('COMPLETE', 'CANCELLED')))
כשמריצים את השאילתה הזו, רק שתי עמודות והשורות שתואמות לתנאי הסינון נשלחות בחזרה ל-BigQuery.
העברת שאילתות SQL למטה חלה גם כשמריצים שאילתות מאוחדות עם מערכי נתונים חיצוניים של Spanner.
אפשר לבדוק את הפעולות שבוצעו (אם יש כאלה) בתוכנית השאילתה.
מגבלות
יש הגבלות שונות על SQL pushdowns, והן משתנות בהתאם למקור הנתונים החיצוני ולאופן שבו שולחים שאילתות לנתונים.
מגבלות על איחוד שאילתות כשמשתמשים ב-EXTERNAL_QUERY
- העברת שאילתות SQL מתבצעת רק בשאילתות מאוחדות מהצורה
SELECT * FROM T. - יש תמיכה רק בגיזום עמודות ובדחיפת מסננים. בפרט, אין תמיכה בפעולות הבאות: compute, join, limit, order by ו-aggregation pushdowns.
- במקרים של העברת סינון למקור הנתונים, הערכים המילוליים צריכים להיות אחד מהסוגים הבאים:
BOOL, INT64, FLOAT64, STRING, DATE,DATETIME, TIMESTAMP. אין תמיכה במחרוזות ליטרליות שהן מבנים. - העברת פונקציות SQL מתבצעת רק עבור פונקציות שנתמכות גם על ידי BigQuery וגם על ידי מסד נתונים של יעד.
- העברת פעולות SQL אל מסד הנתונים נתמכת רק ב-AlloyDB, ב-Cloud SQL וב-Spanner.
- אין תמיכה ב-SQL pushdowns ב-SAP Datasphere.
מגבלות על איחוד שאילתות כשמשתמשים במערכי נתונים חיצוניים של Spanner
- יש תמיכה בקיצוץ עמודות, במסננים, בחישובים ובדחיפה של צבירה חלקית. באופן ספציפי, אין תמיכה ב-pushdown של פעולות join, limit ו-order by.
- במקרים של העברת סינון למקורות נתונים, ליטרלים צריכים להיות אחד מהסוגים הבאים:
BOOL, INT64, FLOAT64, STRING, DATE,DATETIME, TIMESTAMP, BYTEאו מערכים. אין תמיכה במחרוזות ליטרליות שהן מבנים. - העברת פונקציות SQL מתבצעת רק עבור פונקציות שנתמכות גם ב-BigQuery וגם ב-Spanner.
פונקציות נתמכות לפי מקור נתונים
אלה פונקציות SQL נתמכות לפי מקור נתונים. אין תמיכה בפונקציות ב-SAP Datasphere.
Cloud SQL MySQL
- אופרטורים לוגיים:
AND,OR,NOT. - אופרטורים להשוואה:
=,>,>=,<,<=,<>,IN,BETWEEN,IS NULL. - אופרטורים חשבוניים:
+, -, *(רק עבורINT64ו-FLOAT64).
Cloud SQL PostgreSQL ו-AlloyDB
- אופרטורים לוגיים:
AND,OR,NOT. - אופרטורים להשוואה:
=,>,>=,<,<=,<>,IN,BETWEEN,IS NULL. - אופרטורים אריתמטיים:
+,-,*,/(רק לסוגיםINT64,FLOAT64ו-DATE, למעט חיסורDATE).
Spanner – ניב PostgreSQL
- אופרטורים לוגיים:
AND,OR,NOT. - אופרטורים להשוואה:
=,>,>=,<,<=,<>,IN,BETWEEN,IS NULL. - אופרטורים אריתמטיים:
+, -, *, /(רק עבורINT64, FLOAT64, NUMERIC). כשמשתמשים במערכי נתונים חיצוניים, בנוסף:
- העברת חישובים למטה (pushdown)
- Partial Aggregate pushdown
- פונקציות מחרוזת
- פונקציות מתמטיות
- פונקציות Cast
- פונקציות מערך
כשמריצים שאילתות, צריך לצפות לסמנטיקה של GoogleSQL ולא לסמנטיקה של PostgreSQL. לדוגמה:
NULLערכים ממוינים קודם בסדר עולה כברירת מחדל, בניגוד ל-PostgreSQL שבה הם ממוינים אחרונים כברירת מחדל.ערכים של PostgreSQL
NUMERICשנקראים מ-Spanner מטופלים בהתאם למיפוי הסוגים מ-Spanner ל-BigQuery. לדוגמה, אם בעמודה מספרית יש את הערך1.1234567891, השאילתה הבאה מחזירה 0 שורות: אבל ההצהרה הבאה מחזירה שורה אחת על סמך הסמנטיקה של GoogleSQL:SELECT * FROM EXTERNAL_QUERY("CONNECTION_ID", "SELECT * from operations_table where numeric_col = 1.123456789")
SELECT * from operations_table where numeric_col = 1.123456789
ההתנהגות של נורמליזציה של אובייקט JSON שונה. ב-Spanner
JSON, המפתחות ממוינים בסדר לקסיקוגרפי, אבל ב-PostgreSQLPG JSONB, הם ממוינים קודם לפי אורך המפתח ואז בסדר לקסיקוגרפי עם אורך מפתח שווה.
Spanner – ניב GoogleSQL
- אופרטורים לוגיים:
AND,OR,NOT. - אופרטורים להשוואה:
=,>,>=,<,<=,<>,IN,BETWEEN,IS NULL. - אופרטורים אריתמטיים:
+, -, *, /(רק עבורINT64, FLOAT64, NUMERIC). - אופרטורים אריתמטיים בטוחים:
SAFE_ADD, SAFE_SUBTRACT, SAFE_MULTIPLY, SAFE_DIVIDE(רק עבורINT64, FLOAT64, NUMERIC). - כשמשתמשים במערכי נתונים חיצוניים, בנוסף:
- Compute pushdown,
- Partial Aggregate pushdown,
- פונקציות String,
- פונקציות מתמטיות,
- פונקציות Cast,
- פונקציות מערך.
עבודה עם כללי מיון במקורות נתונים חיצוניים
יכול להיות שלעמודה במקור נתונים חיצוני מוגדר אוסף כללים (collation) (לדוגמה, לא תלוי-רישיות). כשמריצים שאילתה לכמה מסדי נתונים, מסד הנתונים המרוחק לוקח בחשבון את אוסף הכללים (collation) שהוגדר.
בדוגמה הבאה יש עמודה flag עם אוסף כללים (collation) לא תלוי-רישיות במקור הנתונים החיצוני:
SELECT * FROM EXTERNAL_QUERY("CONNECTION_ID", "select * from operations_table where flag = 'Y'")
מחליפים את CONNECTION_ID במזהה של החיבור ל-BigQuery.
השאילתה הקודמת מחזירה שורות שבהן flag הוא y או Y כי השאילתה מופעלת במקור הנתונים החיצוני.
עם זאת, אם מוסיפים מסנן לשאילתה הראשית בפדרציית שאילתות עם מקורות נתונים של Cloud SQL, SAP Datasphere או AlloyDB, השאילתה מופעלת בצד של BigQuery עם ברירת המחדל של השוואת מחרוזות. לדוגמה, השאילתה הבאה:
SELECT * FROM ( SELECT * FROM EXTERNAL_QUERY("CONNECTION_ID", "select * from operations_table") ) WHERE flag = 'Y'
בגלל אוסף הכללים (collation) שמתבצע ב-BigQuery כברירת מחדל, והוא תלוי-אותיות רישיות, השאילתה שלמעלה מחזירה רק שורות שבהן הערך של הדגל הוא Y, ומסננת שורות שבהן הערך של הדגל הוא y. כדי להפוך את סעיף WHERE ללא תלוי-רישיות, מציינים את אוסף הכללים (collation) בשאילתה:
SELECT * FROM ( SELECT * FROM EXTERNAL_QUERY("CONNECTION_ID", "select * from operations_table") ) WHERE COLLATE(flag, 'und:ci') = 'Y'
המאמרים הבאים
- איך שולחים שאילתות לנתוני Spanner
- איך יוצרים מערכי נתונים חיצוניים של Spanner
- איך שולחים שאילתות לנתוני Cloud SQL
- איך שולפים נתונים מ-AlloyDB
- איך שולחים שאילתות לנתונים ב-SAP Datasphere