שאילתות לכמה מסדי נתונים ב-AlloyDB

כאנליסטים של נתונים, אתם יכולים להריץ שאילתות על נתונים ב-AlloyDB ל-PostgreSQL מ-BigQuery באמצעות שאילתות מאוחדות.

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

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

שאילתות על נתונים

כדי לשלוח שאילתה לכמה מסדי נתונים ל-AlloyDB משאילת GoogleSQL, משתמשים בפונקציה EXTERNAL_QUERY.

נניח שאתם מאחסנים טבלת לקוחות ב-BigQuery וטבלת מכירות ב-AlloyDB, ואתם רוצים לבצע הצטרפות בין שתי הטבלאות בשאילתה אחת. בדוגמה הבאה מורצת שאילתה לכמה מסדי נתונים לטבלת AlloyDB בשם orders, והתוצאות מצורפות לטבלה ב-BigQuery בשם mydataset.customers.

שאילתת הדוגמה כוללת 3 חלקים:

  1. מריצים את השאילתה החיצונית SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id במסד הנתונים של AlloyDB כדי לקבל את תאריך ההזמנה הראשון של כל לקוח באמצעות הפונקציה EXTERNAL_QUERY.

  2. מצטרפים לטבלת תוצאות השאילתה החיצונית עם טבלת הלקוחות ב-BigQuery באמצעות customer_id.

  3. בוחרים את נתוני הלקוח ואת תאריך ההזמנה הראשונה בתוצאה הסופית.

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'us.connection_id',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

הצגת סכימת טבלה ב-AlloyDB

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

-- List all tables in a database.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.tables;");
-- List all columns in a table.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.columns where table_name='x';");

מעקב אחרי שאילתות מאוחדות ב-BigQuery

כשמריצים שאילתה לכמה מסדי נתונים ב-AlloyDB,‏ BigQuery מוסיף לשאילתה הערה שדומה להערה הבאה:

/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */

אם אתם עוקבים אחרי יומנים כדי לראות את השימוש בשאילתות, ההערה הבאה יכולה לעזור לכם לזהות שאילתות שמגיעות מ-BigQuery.

  1. עוברים לדף Logs Explorer.

    כניסה לדף Logs Explorer

  2. בכרטיסייה שאילתה, מזינים את השאילתה הבאה:

    resource.type="alloydb.googleapis.com/Instance"
    textPayload=~"Federated query from BigQuery"
    
  3. לוחצים על Run query.

    אם יש רשומות שזמינות לשאילתות מאוחדות ב-BigQuery, רשימה של רשומות שדומה לרשימה הבאה תופיע בתוצאות השאילתה.

    YYYY-MM-DD hh:mm:ss.millis UTC [3210064]: [4-1]
    db=DATABASE, user=USER_ACCOUNT
    STATEMENT: SELECT 1 FROM (SELECT FROM company_name_table) t;
    /* Federated query from BigQuery.
    Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID
    */
    
    YYYY-MM-DD hh:mm:ss.millis UTC [3210532]: [2-1]
    db=DATABASE, user=USER_ACCOUNT
    STATEMENT: SELECT "company_id", "company type_id" FROM
    (SELECT FROM company_name_table) t;
    /* Federated query from BigQuery.
    Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID
    */
    

    מידע נוסף על Cloud Logging זמין במאמר Cloud Logging.

פתרון בעיות

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

הבעיה: החיבור לשרת מסד הנתונים נכשל עם השגיאה: Invalid table-valued function EXTERNAL_QUERY Connect to PostgreSQL server failed: server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request.

פתרון: מוודאים שהשתמשתם בפרטי כניסה תקינים ופעלתם לפי כל הדרישות המוקדמות בזמן שיצרתם את החיבור ל-AlloyDB. בודקים אם לחשבון השירות שנוצר באופן אוטומטי כשנוצר חיבור ל-AlloyDB יש את התפקיד AlloyDB Client ‏ (roles/alloydb.client). מידע נוסף מופיע במאמר הענקת גישה לחשבון השירות.

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