הרצת שאילתות מאוחדות ב-Oracle

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

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

מגבלות

שאילתות מאוחדות של Oracle כפופות למגבלות הבאות:

  • אפשר להריץ רק שאילתות לקריאה בלבד באמצעות הפונקציה EXTERNAL_QUERY. אין תמיכה בהצהרות של שפת הגדרת נתונים (DDL) ושל שפת טיפול בנתונים (DML).
  • אפשר לגשת לאיחוד רק דרך הפונקציה EXTERNAL_QUERY. אין תמיכה ביצירת טבלאות חיצוניות או מערכי נתונים קבועים ב-BigQuery שממופים ישירות לטבלאות Oracle.
  • יכול להיות שזמן האחזור של שאילתה מאוחדת יהיה ארוך יותר באופן משמעותי מאשר הרצת השאילתה ישירות ב-Oracle.
  • יכול להיות ששירות החיבור הבסיסי יעביר חיבורים לא פעילים למצב שינה. השאילתה הראשונה שמשתמשת בחיבור ל-Oracle אחרי תקופה של חוסר פעילות עשויה להימשך יותר מדקה, בזמן שהמחבר מבצע אתחול.
  • אין תמיכה בקישור בין רשתות שכנות (peering) ב-DNS. צריך להתחבר באמצעות כתובת IP או שם מארח שניתן לפתור באופן מלא ברשת ה-VPC.
  • בשאילתת Oracle SQL צריך לציין כינויים מפורשים לעמודות שמכילות תוצאות או ביטויים של פונקציות (לדוגמה, SELECT COUNT(*) AS total_count). ביטויים ללא כינויים יוצרים שמות של עמודות עם תווים מיוחדים שלא תקינים בהגדרות הסכימה של הטבלה ב-BigQuery.
  • אם השימוש ב-Compute Engine API בפרויקט השאילתה מוגבל על ידי VPC Service Controls, השאילתה המאוחדת נכשלת אם החיבור משתמש במחבר רשת. מוודאים שמוגדרים כללים מתאימים לתעבורת נתונים נכנסת ויוצאת ב-VPC Service Controls.
  • אין תמיכה בהעברות SQL נוספות ל-Oracle. מסננים וצבירות בשאילתת BigQuery החיצונית לא נדחפים למטה אל השאילתה הפנימית בתוך הפונקציה EXTERNAL_QUERY. כדי להגביל את השורות והעמודות שמועברות ברשת, צריך לציין פרדיקטים והיטלי עמודות ישירות בתוך הצהרת Oracle SQL הפנימית.

  • יש תמיכה רק באימות באמצעות שם משתמש וסיסמה של מסד נתונים של Oracle. אין תמיכה בספקי זהויות של צד שלישי, ב-Kerberos, ב-RADIUS ובאימות IAM של Oracle Cloud Infrastructure (OCI).

  • אין תמיכה בסוגי Oracle מורכבים או קנייניים, כמו סוגים בהגדרת משתמש (UDT), סוגים מרחביים (SDO_GEOMETRY), סוגי אוספים (VARRAY, טבלאות בתצוגת עץ), SYS.ANYDATA, REF, BFILE ועמודות JSON בינאריות (OSON). כדי לשלוח שאילתה לעמודה בינארית מסוג JSON, צריך להמיר אותה לטקסט בשאילתה (לדוגמה, באמצעות JSON_SERIALIZE(column_name) או JSON_QUERY).

  • עמודות NUMBER לא מוגבלות וביטויים מספריים מחושבים ממופים ל-STRING ב-BigQuery כדי לשמור על דיוק מלא בלי קיטוע או גלישה. עמודות NUMBER(p, s) מוגבלות ממופות ל-NUMERIC (כשהדיוק קטן מ-38 או שווה לו, והקנה מידה קטן מ-9 או שווה לו) או ל-BIGNUMERIC (כשהקנה מידה גדול מ-9 או שהספרות השלמות גדולות מ-29).

  • עמודות CHAR(n) ו-NCHAR(n) באורך קבוע שומרות על ריפוד רווחים לבנים בסוף עד לאורך n כשהן ממופות ל-STRING ב-BigQuery.

  • תאריכים וחותמות זמן שלפני 15 באוקטובר 1582 עשויים להשתנות ב-10 ימים בגלל המעבר ההיסטורי ללוח השנה הגרגוריאני. כדי לשמור על תאריכים היסטוריים מדויקים לפני שנת 1582, צריך להמיר אותם ל-VARCHAR2 בהצהרת EXTERNAL_QUERY.

גרסאות וסביבות נתמכות של Oracle

איחוד שאילתות תומך במסדי נתונים של Oracle בסביבות הפריסה הבאות:

  • Oracle Database@Google Cloud
  • Oracle Exadata Database Service
  • מכונות Oracle מקומיות שמחוברות ל- Google Cloud באמצעות Cloud VPN,‏ Cloud Interconnect או כתובת IP ציבורית דרך האינטרנט

איחוד שאילתות תומך בגרסאות הבאות של Oracle:

  • ‫Oracle Database 23.x‏ (23ai)
  • Oracle Database 21.x
  • ‫Oracle Database 19.x‏ (19c)

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

מוודאים שהאדמין ב-BigQuery יצר חיבור ל-Oracle ושיתף אותו איתכם.

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

כדי לקבל את ההרשאות שנדרשות לשליחת שאילתות ל-Oracle, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד משתמש בחיבורים של BigQuery (roles/bigquery.connectionUser) בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

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

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

הדוגמה הבאה היא שאילתה מאוחדת שמצרפת רשומות של לקוחות ב-BigQuery בשם mydataset.customers עם רשומות של הזמנות בזמן אמת ממסד נתונים של Oracle:

SELECT
  bq_cust.customer_id,
  bq_cust.customer_name,
  oracle_orders.order_id,
  oracle_orders.order_status,
  oracle_orders.order_total
FROM
  mydataset.customers AS bq_cust
JOIN
  EXTERNAL_QUERY(
    'projects/my-project/locations/us-central1/connections/oracle_prod_conn',
    '''SELECT customer_id, order_id, order_status, order_total
       FROM orders
       WHERE order_date >= SYSDATE - 1''') AS oracle_orders
  ON bq_cust.customer_id = oracle_orders.customer_id;

הצגת סכימה של טבלת Oracle

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

רשימה של כל הטבלאות הנגישות

SELECT *
FROM EXTERNAL_QUERY(
  'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID',
  '''SELECT owner, table_name, tablespace_name, status
     FROM all_tables
     ORDER BY owner, table_name''');

הצגת עמודות וסוגי נתונים בטבלה

SELECT *
FROM EXTERNAL_QUERY(
  'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID',
  '''SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
     FROM all_tab_columns
     WHERE owner = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME'
     ORDER BY column_id''');

מיפוי סוגי נתונים

כשמריצים שאילתה מאוחדת, BigQuery ממיר את הנתונים מ-Oracle לסוגי נתונים של GoogleSQL לפי הטבלה הבאה:

סוג הנתונים ב-Oracle סוג הנתונים ב-BigQuery
סוגים מספריים
NUMBER(p, s) (p ≤ 38, s ≤ 9) NUMERIC
NUMBER(p, s) (s > 9 או p > 38) BIGNUMERIC
‫NUMBER (סולם דירוג לא מוגבל או צף) STRING
FLOAT, FLOAT(p) FLOAT64
BINARY_FLOAT FLOAT64
BINARY_DOUBLE FLOAT64
סוגי תווים ומחרוזות
CHAR(n) STRING
NCHAR(n) STRING
VARCHAR2(n) STRING
NVARCHAR2(n) STRING
CLOB STRING
NCLOB STRING
LONG STRING
סוגים בינאריים
RAW(n) BYTES
BLOB BYTES
LONG RAW BYTES
סוגי תאריך, שעה ומרווח
DATE DATETIME
TIMESTAMP, TIMESTAMP(p) DATETIME
TIMESTAMP WITH TIME ZONE TIMESTAMP
TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP
INTERVAL YEAR TO MONTH STRING
INTERVAL DAY TO SECOND STRING
סוגי זיהוי של שורות
ROWID STRING
UROWID STRING
סוגים מובנים למחצה, וקטורים ו-XML
JSON (טקסטואלי / OSON עם סריאליזציה של טקסט) STRING
VECTOR STRING
XMLTYPE STRING

תמחור

העלות של הרצת שאילתה מאוחדת מבוססת על שלושה גורמים:

  • עלות החישוב של הרצת השאילתה ב-Oracle (החיוב מתבצע על ידי ספק מסד הנתונים של Oracle או סביבת האירוח)
  • עלות רוחב הפס של העברת תוצאות השאילתה מ-Oracle ל-BigQuery (חיובים על תעבורת נתונים יוצאת ברשת מספק האירוח של מסד הנתונים)
  • עלות המחשוב של הרצת השאילתה ב-BigQuery

העלויות שקשורות ל-Oracle משתנות בהתאם לסוג השירות של Oracle ולסביבת האירוח שבה אתם משתמשים. כדי להגביל את עלות רוחב הפס, מומלץ לכתוב את השאילתה בהצהרה EXTERNAL_QUERY כך שהיא לא תכלול את כל העמודות והשורות שלא נדרשות לחישוב התוצאה הסופית.

אין עלות נוספת להרצת שאילתות מאוחדות ב-BigQuery. מידע נוסף על התמחור ב-BigQuery

אם החיבור שלכם משתמש ברכיבי רשת של Google Cloud , יכול להיות שיחולו גם המחירים הבאים:

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