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

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

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

נתוני שאילתות

כדי לשלוח שאילתה לכמה מסדי נתונים ל-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. בכרטיסייה Query, מזינים את השאילתה הבאה:

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

    אם יש רשומות זמינות לשאילתות לכמה מסדי נתונים ב-BigQuery, רשימה של רשומות שדומה לרשימה הבאה תופיע ב-Query results.

    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

פתרון בעיות

בקטע הזה מתוארות שגיאות פוטנציאליות שעלולות להתרחש כששולחים שאילתה לכמה מסדי נתונים אל 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"‏ (roles/alloydb.client). למידע נוסף, קראו את המאמר מתן גישה לחשבון השירות.

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