מדריך לתרגום Oracle SQL
במאמר הזה מפורטים הדמיון וההבדלים בתחביר SQL בין Oracle לבין BigQuery, כדי לעזור לכם לתכנן את המעבר. אפשר להשתמש בתרגום SQL באצווה כדי להעביר את סקריפטים ה-SQL בכמות גדולה, או בתרגום SQL אינטראקטיבי כדי לתרגם שאילתות אד-הוק.
סוגי נתונים
בקטע הזה מוצגים סוגי נתונים מקבילים ב-Oracle וב-BigQuery.
| Oracle | BigQuery | הערות |
|---|---|---|
VARCHAR2
|
STRING
|
|
NVARCHAR2
|
STRING
|
|
CHAR
|
STRING
|
|
NCHAR
|
STRING
|
|
CLOB
|
STRING
|
|
NCLOB
|
STRING
|
|
INTEGER
|
INT64
|
|
SHORTINTEGER
|
INT64
|
|
LONGINTEGER
|
INT64
|
|
NUMBER
|
NUMERIC
|
ב-BigQuery אי אפשר להגדיר ערכים מותאמים אישית לדיוק או לקנה מידה. כתוצאה מכך, יכול להיות שעמודה ב-Oracle מוגדרת עם קנה מידה גדול יותר ממה ש-BigQuery תומך בו.
בנוסף, לפני שמירת מספר עשרוני, מערכת Oracle מעגלת אותו כלפי מעלה אם יש לו יותר ספרות אחרי הנקודה העשרונית ממה שצוין עבור העמודה המתאימה. ב-BigQuery, אפשר להטמיע את התכונה הזו באמצעות הפונקציה |
NUMBER(*, x)
|
NUMERIC
|
ב-BigQuery אי אפשר להגדיר ערכים מותאמים אישית לדיוק או לקנה מידה. כתוצאה מכך, יכול להיות שעמודה ב-Oracle מוגדרת עם קנה מידה גדול יותר ממה ש-BigQuery תומך בו.
בנוסף, לפני שמירת מספר עשרוני, מערכת Oracle מעגלת אותו כלפי מעלה אם יש לו יותר ספרות אחרי הנקודה העשרונית ממה שצוין עבור העמודה המתאימה. ב-BigQuery, אפשר להטמיע את התכונה הזו באמצעות הפונקציה |
NUMBER(x, -y)
|
INT64
|
אם משתמש מנסה לאחסן מספר עשרוני, Oracle מעגלת אותו למספר שלם. ב-BigQuery, ניסיון לאחסן מספר עשרוני בעמודה שהוגדרה כ-INT64 יוביל לשגיאה. במקרה כזה, צריך להשתמש בפונקציה ROUND().
סוגי הנתונים ב-BigQuery |
NUMBER(x)
|
INT64
|
אם משתמש מנסה לאחסן מספר עשרוני, Oracle מעגלת אותו למספר שלם. ב-BigQuery, ניסיון לאחסן מספר עשרוני בעמודה שהוגדרה כ-INT64 יוביל לשגיאה. במקרה כזה, צריך להשתמש בפונקציה ROUND().
סוגי הנתונים ב-BigQuery |
FLOAT
|
NUMERIC/FLOAT64
|
FLOAT הוא סוג נתונים מדויק, והוא סוג משנה של NUMBER ב-Oracle. ב-BigQuery, FLOAT64 הוא סוג נתונים משוער. יכול להיות שסוג הנתונים NUMERIC יתאים יותר לסוג הנתונים FLOAT ב-BigQuery.
|
BINARY_DOUBLE
|
NUMERIC/FLOAT64
|
FLOAT הוא סוג נתונים מדויק, והוא סוג משנה של NUMBER ב-Oracle. ב-BigQuery, FLOAT64 הוא סוג נתונים משוער. יכול להיות שסוג הנתונים NUMERIC יתאים יותר לסוג הנתונים FLOAT ב-BigQuery.
|
BINARY_FLOAT
|
NUMERIC/FLOAT64
|
FLOAT הוא סוג נתונים מדויק, והוא סוג משנה של NUMBER ב-Oracle. ב-BigQuery, FLOAT64 הוא סוג נתונים משוער. יכול להיות שסוג הנתונים NUMERIC יתאים יותר לסוג הנתונים FLOAT ב-BigQuery.
|
LONG
|
BYTES
|
סוג הנתונים LONG נמצא בשימוש בגרסאות קודמות, ולא מומלץ להשתמש בו בגרסאות חדשות של Oracle Database.
אפשר להשתמש בסוג הנתונים |
BLOB
|
BYTES
|
אפשר להשתמש בסוג הנתונים BYTES כדי לאחסן נתונים בינאריים באורך משתנה. אם לא מבצעים שאילתות בשדה הזה ולא משתמשים בו בניתוחים, כדאי יותר לאחסן נתונים בינאריים ב-Cloud Storage.
|
BFILE
|
STRING
|
אפשר לאחסן קבצים בינאריים ב-Cloud Storage ולהשתמש בסוג הנתונים STRING כדי להפנות לקבצים בטבלה ב-BigQuery.
|
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
BigQuery תומך בדיוק של מיקרו-שנייה (10-6) בהשוואה ל-Oracle, שתומך בדיוק בטווח של 0 עד 9.
BigQuery תומך בשם אזור זמן ממסד נתונים של TZ ובסטיית אזור זמן מ-UTC.
ב-BigQuery, צריך לבצע המרה של אזור זמן באופן ידני כדי להתאים לתכונה |
TIMESTAMP(x)
|
TIMESTAMP
|
BigQuery תומך בדיוק של מיקרו-שנייה (10-6) בהשוואה ל-Oracle, שתומך בדיוק בטווח של 0 עד 9.
BigQuery תומך בשם אזור זמן ממסד נתונים של TZ ובסטיית אזור זמן מ-UTC.
ב-BigQuery, צריך לבצע המרה של אזור זמן באופן ידני כדי להתאים לתכונה |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
BigQuery תומך בדיוק של מיקרו-שנייה (10-6) בהשוואה ל-Oracle, שתומך בדיוק בטווח של 0 עד 9.
BigQuery תומך בשם אזור זמן ממסד נתונים של TZ ובסטיית אזור זמן מ-UTC.
ב-BigQuery, צריך לבצע המרה של אזור זמן באופן ידני כדי להתאים לתכונה |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
BigQuery תומך בדיוק של מיקרו-שנייה (10-6) בהשוואה ל-Oracle, שתומך בדיוק בטווח של 0 עד 9.
BigQuery תומך בשם אזור זמן ממסד נתונים של TZ ובסטיית אזור זמן מ-UTC.
ב-BigQuery, צריך לבצע המרה של אזור זמן באופן ידני כדי להתאים לתכונה |
INTERVAL YEAR TO MONTH
|
STRING
|
אפשר לאחסן ערכי מרווח כסוג הנתונים STRING ב-BigQuery.
|
INTERVAL DAY TO SECOND
|
STRING
|
אפשר לאחסן ערכי מרווח כסוג הנתונים STRING ב-BigQuery.
|
RAW
|
BYTES
|
אפשר להשתמש בסוג הנתונים BYTES כדי לאחסן נתונים בינאריים באורך משתנה. אם לא מבצעים שאילתות בשדה הזה ולא משתמשים בו בניתוח, כדאי יותר לאחסן נתונים בינאריים ב-Cloud Storage.
|
LONG RAW
|
BYTES
|
אפשר להשתמש בסוג הנתונים BYTES כדי לאחסן נתונים בינאריים באורך משתנה. אם לא מבצעים שאילתות בשדה הזה ולא משתמשים בו בניתוח, כדאי יותר לאחסן נתונים בינאריים ב-Cloud Storage.
|
ROWID
|
STRING
|
סוגי הנתונים האלה משמשים את Oracle באופן פנימי כדי לציין כתובות ייחודיות לשורות בטבלה. באופן כללי, לא מומלץ להשתמש בשדות ROWID או UROWID באפליקציות. אבל אם זה המצב, אפשר להשתמש בסוג הנתונים STRING כדי לאחסן את הנתונים האלה.
|
עיצוב סוג
ב-Oracle SQL יש קבוצה של פורמטים שמוגדרים כפרמטרים להצגת ביטויים ונתוני עמודות, ולהמרות בין סוגי נתונים. לדוגמה, אם מגדירים את NLS_DATE_FORMAT כ-YYYY/MM/DD, התאריכים יוצגו כ-YYYY/MM/DD כברירת מחדל. מידע נוסף על הגדרות NLS זמין בתיעוד אונליין של Oracle.
ב-BigQuery אין פרמטרים של אתחול.
כברירת מחדל, BigQuery מצפה שכל נתוני המקור יהיו בקידוד UTF-8 בזמן הטעינה. אם יש לכם קובצי CSV עם נתונים בקידוד ISO-8859-1, אתם יכולים לציין במפורש את הקידוד כשאתם מייבאים את הנתונים, כדי ש-BigQuery יוכל להמיר את הנתונים ל-UTF-8 במהלך תהליך הייבוא.
אפשר לייבא רק נתונים בקידוד ISO-8859-1 או UTF-8. מערכת BigQuery מאחסנת את הנתונים ומחזירה אותם בקידוד UTF-8.
אפשר להגדיר את פורמט התאריך או אזור הזמן הרצויים בפונקציות DATE ו-TIMESTAMP.
עיצוב של חותמת זמן וסוג תאריך
כשממירים רכיבים של פורמט חותמת זמן ותאריך מ-Oracle ל-BigQuery, צריך לשים לב להבדלים באזורי הזמן בין TIMESTAMP לבין DATETIME, כפי שמסוכם בטבלה הבאה.
שימו לב שאין סוגריים בפורמטים של Oracle כי הפורמטים (CURRENT_*) הם מילות מפתח ולא פונקציות.
| Oracle | BigQuery | הערות | |
|---|---|---|---|
CURRENT_TIMESTAMP
|
יכול להיות שפרטי TIMESTAMP ב-Oracle יכללו מידע שונה על אזור זמן, שמוגדר באמצעות WITH TIME ZONE בהגדרת העמודה או בהגדרת המשתנה TIME_ZONE.
|
אם אפשר, כדאי להשתמש בפונקציה CURRENT_TIMESTAMP()
שמוגדרת בפורמט ISO. עם זאת, בפורמט הפלט תמיד מוצג אזור הזמן UTC. (מבחינה פנימית, ב-BigQuery אין אזור זמן).
חשוב לשים לב לפרטים הבאים לגבי ההבדלים בפורמט ISO:
אם רוצים להשתמש בפורמט מפורש, משתמשים בפונקציה |
|
CURRENT_DATE
|
Oracle משתמשת ב-2 סוגים של תאריכים:
SYSDATE or CURRENT_DATE
|
ב-BigQuery יש פורמט נפרד DATE שתמיד מחזיר תאריך בפורמט ISO 8601.
אי אפשר להשתמש ב- |
|
CURRENT_DATE-3
|
ערכי תאריך מיוצגים כמספרים שלמים. Oracle תומך באופרטורים אריתמטיים לסוגי תאריכים. | עבור סוגי תאריכים, משתמשים ב-DATE_ADD() או ב-DATE_ADD(). BigQuery משתמש באופרטורים אריתמטיים עבור סוגי נתונים: INT64, NUMERIC ו-FLOAT64.DATE_SUB
|
|
NLS_DATE_FORMAT
|
מגדירים את פורמט התאריך של הסשן או של המערכת. | ב-BigQuery תמיד משתמשים בפורמט ISO 8601, לכן חשוב להמיר את התאריכים והשעות של Oracle. | |
תחביר של שאילתות
בקטע הזה מוסבר על ההבדלים בתחביר של שאילתות בין Oracle לבין BigQuery.
SELECT דוחות
רוב ההצהרות של Oracle SELECT תואמות ל-BigQuery.
פונקציות, אופרטורים וביטויים
בקטעים הבאים מפורטים מיפויים בין פונקציות של Oracle לבין פונקציות מקבילות ב-BigQuery.
אופרטורים להשוואה
אופרטורים להשוואה ב-Oracle וב-BigQuery תואמים ל-ANSI SQL:2011. אופרטורי ההשוואה בטבלה הבאה זהים גם ב-BigQuery וגם ב-Oracle. אפשר להשתמש ב-REGEXP_CONTAINS במקום ב-REGEXP_LIKE ב-BigQuery.
| אופרטור | תיאור |
|---|---|
"="
|
שווה |
<>
|
לא שווה |
!=
|
לא שווה |
>
|
גדול מ- |
>=
|
גדול מ- או שווה ל- |
<
|
פחות מ- |
<=
|
קטן מ- או שווה ל- |
IN ( )
|
הערך תואם לערך ברשימה |
NOT
|
הופך את התנאי לשלילי |
BETWEEN
|
בטווח (כולל) |
IS NULL
|
NULL ערך
|
IS NOT NULL
|
לא NULL ערך
|
LIKE
|
התאמת תבניות עם % |
EXISTS
|
התנאי מתקיים אם שאילתת המשנה מחזירה לפחות שורה אחת |
האופרטורים בטבלה זהים גם ב-BigQuery וגם ב-Oracle.
ביטויים ופונקציות לוגיים
פונקציות צבירה
בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של Oracle לחישוב מצטבר, פונקציות סטטיסטיות לחישוב מצטבר ופונקציות משוערות לחישוב מצטבר, לבין הפונקציות המקבילות שלהן ב-BigQuery:
| Oracle | BigQuery |
|---|---|
ANY_VALUE(מ-Oracle 19c) |
ANY_VALUE |
APPROX_COUNT
|
HLL_COUNT set of functions with specified precision
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_AGG
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_DETAIL
|
APPROX_COUNT_DISTINCT
|
APPROX_PERCENTILE(percentile) WITHIN GROUP (ORDER BY expression)
|
APPROX_QUANTILES(expression, 100)[BigQuery לא תומך בשאר הארגומנטים שמוגדרים ב-Oracle. |
| <codeAPPROX_PERCENTILE_AGG | APPROX_QUANTILES(expression, 100)[
|
APPROX_PERCENTILE_DETAIL
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
|
APPROX_SUM
|
APPROX_TOP_SUM(expression, weight, number)
|
AVG
|
AVG
|
BIT_COMPLEMENT
|
אופרטור השלילה הבינארית: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery לא תומך ב-TYPE AS TABLE OF.
כדאי להשתמש ב-STRING_AGG() או ב-ARRAY_AGG() ב-BigQuery
|
CORR/CORR_K/
CORR_S
|
CORR
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
FIRST
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות בהגדרת המשתמש (UDF). |
GROUP_ID
|
לא בשימוש ב-BigQuery |
GROUPING
|
GROUPING
|
GROUPING_ID
|
לא בשימוש ב-BigQuery. |
LAST
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF). |
LISTAGG
|
STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
|
MAX
|
MAX
|
MIN
|
MIN
|
OLAP_CONDITION
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
OLAP_EXPRESSION
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
OLAP_EXPRESSION_BOOL
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
OLAP_EXPRESSION_DATE
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
OLAP_EXPRESSION_TEXT
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
OLAP_TABLE
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
POWERMULTISET
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
POWERMULTISET_BY_CARDINALITY
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
QUALIFY
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
REGR_AVGX
|
AVG(IF(dep_var_expr is NULLOR ind_var_expr is NULL,NULL, ind_var_expr))
|
REGR_AVGY
|
AVG(IF(dep_var_expr is NULLOR ind_var_expr is NULL,NULL, dep_var_expr))
|
REGR_COUNT
|
SUM(IF(dep_var_expr is NULLOR ind_var_expr is NULL,NULL, 1))
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
WM_CONCAT
|
STRING_AGG
|
BigQuery מציע את פונקציות הצבירה הנוספות הבאות:
פונקציות אנליטיות
בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של ניתוח נתונים ופונקציות מצטברות של Oracle לבין הפונקציות המקבילות שלהן ב-BigQuery.
| Oracle | BigQuery |
|---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
אופרטור השלילה הבינארית: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
BOOL_TO_INT
|
CAST(X AS INT64)
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUBE_TABLE
|
לא נתמך ב-BigQuery. כדאי להשתמש בכלי BI או בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-BigQuery ML |
FEATURE_DETAILS
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-BigQuery ML |
FEATURE_ID
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-BigQuery ML |
FEATURE_SET
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-BigQuery ML |
FEATURE_VALUE
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-BigQuery ML |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_CHILD_COUNT
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_COLUMN
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_DEPTH
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_DESCRIPTION
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_HAS_CHILDREN
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_LEVEL
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_MEMBER_NAME
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_ORDER
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
HIER_UNIQUE_MEMBER_NAME
|
אין תמיכה בשאילתות היררכיות ב-BigQuery. |
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
LISTAGG
|
ARRAY_AGG
|
MATCH_NUMBER
|
אפשר לבצע זיהוי וחישוב של דפוסים באמצעות ביטויים רגולריים ופונקציות מוגדרות על ידי המשתמש ב-BigQuery |
MATCH_RECOGNIZE
|
אפשר לבצע זיהוי וחישוב של דפוסים באמצעות ביטויים רגולריים ופונקציות מוגדרות על ידי המשתמש ב-BigQuery |
MAX
|
MAX
|
MEDIAN
|
PERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
|
MIN
|
MIN
|
NTH_VALUE
|
NTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_DISC
|
PRESENTNNV
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
PRESENTV
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
PREVIOUS
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
RANK(ANSI)
|
RANK
|
RATIO_TO_REPORT(expr) OVER (partition clause)
|
expr / SUM(expr) OVER (partition clause)
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE()
|
WIDTH_BUCKET
|
אפשר להשתמש בפונקציה UDF. |
פונקציות של תאריך ושעה
בטבלה הבאה מוצגים מיפויים בין פונקציות נפוצות של תאריך/שעה ב-Oracle לבין הפונקציות המקבילות ב-BigQuery.
| Oracle | BigQuery |
|---|---|
ADD_MONTHS(date, integer)
|
DATE_ADD(date, INTERVAL integer MONTH), אם התאריך הוא TIMESTAMP, אפשר להשתמש ב
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
DATE - k
|
DATE_SUB(date_expression, INTERVAL k DAY)
|
DATE + k
|
DATE_ADD(date_expression, INTERVAL k DAY)
|
DBTIMEZONE
|
BigQuery לא תומך באזור הזמן של מסד הנתונים. |
EXTRACT
|
EXTRACT(DATE), EXTRACT(TIMESTAMP)
|
LAST_DAY
|
DATE_SUB(
|
LOCALTIMESTAMP
|
אין תמיכה בהגדרות אזור הזמן ב-BigQuery. |
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEW_TIME
|
DATE(timestamp_expression, time zone)
|
NEXT_DAY
|
DATE_ADD(
|
SYS_AT_TIME_ZONE
|
CURRENT_DATE([time_zone])
|
SYSDATE
|
CURRENT_DATE()
|
SYSTIMESTAMP
|
CURRENT_TIMESTAMP()
|
TO_DATE
|
PARSE_DATE
|
TO_TIMESTAMP
|
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ
|
PARSE_TIMESTAMP
|
TZ_OFFSET
|
לא נתמך ב-BigQuery. אפשר להשתמש בפונקציה מותאמת אישית (UDF). |
WM_CONTAINSWM_EQUALSWM_GREATERTHANWM_INTERSECTIONWM_LDIFFWM_LESSTHANWM_MEETSWM_OVERLAPSWM_RDIFF |
לא נעשה שימוש בתקופות ב-BigQuery. אפשר להשתמש בפונקציות UDF כדי להשוות בין שתי תקופות. |
BigQuery מציע את הפונקציות הנוספות הבאות של תאריך ושעה:
CURRENT_DATETIMEDATE_FROM_UNIX_DATEDATE_TRUNCDATETIMEDATETIME_ADDDATETIME_DIFFDATETIME_SUBDATETIME_TRUNCFORMAT_DATEFORMAT_DATETIME
פונקציות מחרוזת
בטבלה הבאה מוצגים מיפויים בין פונקציות מחרוזות של Oracle לבין הפונקציות המקבילות שלהן ב-BigQuery:
| Oracle | BigQuery |
|---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
אין תמיכה ב-UTF-16 ב-BigQuery |
RAWTOHEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING(
|
COLLATION
|
לא קיים ב-BigQuery. BigQuery לא תומך ב-COLLATE ב-DML |
COMPOSE
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
ESCAPE_REFERENCE (UTL_I18N)
|
אין תמיכה ב-BigQuery. מומלץ להשתמש בפונקציה בהגדרת המשתמש. |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
NLS_LOWER
|
LOWER
|
NLS_UPPER
|
UPPER
|
NLSSORT
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
POSITION
|
STRPOS(string, substring)
|
PRINTBLOBTOCLOB
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. |
REGEXP_COUNT
|
ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
|
REGEXP_INSTR
|
STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))
הערה: הפונקציה מחזירה את המופע הראשון. |
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REGEXP_LIKE
|
IF(REGEXP_CONTAINS,1,0)
|
REGEXP_SUBSTR
|
REGEXP_EXTRACT, REGEXP_EXTRACT_ALL
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RIGHT
|
SUBSTR(source_string, -1, length)
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית |
STRTOK
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4
|
SUBSTR
|
TRANSLATE
|
REPLACE
|
TRANSLATE USING
|
REPLACE
|
TRIM
|
TRIM
|
UNISTR
|
CODE_POINTS_TO_STRING
|
UPPER
|
UPPER
|
|| (עמודות אנכיות)
|
CONCAT
|
BigQuery מציע את הפונקציות הנוספות הבאות למחרוזות:
BYTE_LENGTHCODE_POINTS_TO_BYTESENDS_WITHFROM_BASE32FROM_BASE64FROM_HEXNORMALIZENORMALIZE_AND_CASEFOLDREPEATSAFE_CONVERT_BYTES_TO_STRINGSPLITSTARTS_WITHSTRPOSTO_BASE32TO_BASE64TO_CODE_POINTS
פונקציות מתמטיות
בטבלה הבאה מוצגים מיפויים בין פונקציות מתמטיות של Oracle לבין הפונקציות המקבילות שלהן ב-BigQuery.
| Oracle | BigQuery |
|---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ACOSH
|
ACOSH
|
ASIN
|
ASIN
|
ASINH
|
ASINH
|
ATAN
|
ATAN
|
ATAN2
|
ATAN2
|
ATANH
|
ATANH
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
COSH
|
COSH
|
EXP
|
EXP
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
שימוש עם ISNULL
|
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית ובפונקציה RAND |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית ובפונקציה RAND |
REMAINDER
|
MOD
|
ROUND
|
ROUND
|
ROUND_TIES_TO_EVEN
|
ROUND()
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SINH
|
SINH
|
SQRT
|
SQRT
|
STANDARD_HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV
|
STDDEV |
TAN
|
TAN
|
TANH
|
TANH
|
TRUNC
|
TRUNC
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
ב-BigQuery יש פונקציות מתמטיות נוספות:
פונקציות להמרת סוגים
בטבלה הבאה מוצגים מיפויים בין פונקציות להמרת סוגים ב-Oracle לבין הפונקציות המקבילות ב-BigQuery.
| Oracle | BigQuery | |
|---|---|---|
BIN_TO_NUM
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
BINARY2VARCHAR
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
CAST
|
CAST(expr AS typename)
|
|
CHARTOROWID
|
לא נדרש ידע ספציפי ב-Oracle. | |
CONVERT
|
אין תמיכה בערכות תווים ב-BigQuery. מומלץ להשתמש בפונקציה בהגדרת המשתמש (UDF). | |
EMPTY_BLOB
|
לא נעשה שימוש ב-BLOB ב-BigQuery.
|
|
EMPTY_CLOB
|
לא נעשה שימוש ב-CLOB ב-BigQuery.
|
|
FROM_TZ
|
אין תמיכה בסוגים עם אזורי זמן ב-BigQuery. מומלץ להשתמש בפונקציה בהגדרת המשתמש וב-FORMAT_TIMESTAMP | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
לא קיים באופן מרומז ב-BigQuery. כדאי להשתמש בפונקציות UDF | |
NCHR
|
אפשר להשתמש ב-UDF כדי לקבל את התו המקביל לערך בינארי | |
NUMTODSINTERVAL
|
סוג הנתונים INTERVAL לא נתמך ב-BigQuery
|
|
NUMTOHEX
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה בהתאמה אישית (UDF) ובפונקציה TO_HEX
|
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
סוג הנתונים INTERVAL לא נתמך ב-BigQuery.
|
|
RAW_TO_CHAR
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAW_TO_NCHAR
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAW_TO_VARCHAR2
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAWTOHEX
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAWTONHEX
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAWTONUM
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAWTONUM2
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
RAWTOREF
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
REFTOHEX
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
REFTORAW
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
ROWIDTOCHAR
|
ROWID הוא סוג ספציפי ל-Oracle ולא קיים ב-BigQuery. הערך הזה צריך להיות מיוצג כמחרוזת.
|
|
ROWIDTONCHAR
|
ROWID הוא סוג ספציפי ל-Oracle ולא קיים ב-BigQuery. הערך הזה צריך להיות מיוצג כמחרוזת.
|
|
SCN_TO_TIMESTAMP
|
SCN הוא סוג ספציפי ל-Oracle ולא קיים ב-BigQuery. הערך הזה צריך להיות מיוצג כחותמת זמן.
|
|
TO_ACLIDTO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename)PARSE_DATEPARSE_TIMESTAMPמשתמשים בתחביר של המרה (cast) בשאילתה כדי לציין שסוג התוצאה של ביטוי צריך להיות מומר לסוג אחר. |
|
TREAT
|
ספציפי ל-Oracle, לא קיים ב-BigQuery. | |
VALIDATE_CONVERSION
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית | |
VSIZE
|
לא נתמך ב-BigQuery. כדאי להשתמש בפונקציה מוגדרת על ידי המשתמש (UDF) בהתאמה אישית | |
פונקציות JSON
בטבלה הבאה מוצגים מיפויים בין פונקציות JSON של Oracle לבין הפונקציות המקבילות שלהן ב-BigQuery.
| Oracle | BigQuery |
|---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש ובפונקציה TO_JSON_STRING
|
JSON_ARRAYAGG
|
כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש ובפונקציה TO_JSON_STRING
|
JSON_DATAGUIDE
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
JSON_EQUAL
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
JSON_EXIST
|
כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-JSON_EXTRACT או ב-JSON_EXTRACT_SCALAR
|
JSON_MERGEPATCH
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
JSON_OBJECT
|
לא נתמך על ידי BigQuery. |
JSON_OBJECTAGG
|
לא נתמך על ידי BigQuery. |
JSON_QUERY
|
כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-JSON_EXTRACT או ב-JSON_EXTRACT_SCALAR.
|
JSON_TABLE
|
פונקציה בהגדרת המשתמש (UDF) מותאמת אישית. |
JSON_TEXTCONTAINS
|
כדאי להשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) וב-JSON_EXTRACT או ב-JSON_EXTRACT_SCALAR.
|
JSON_VALUE
|
JSON_EXTRACT_SCALAR
|
פונקציות XML
BigQuery לא מספק פונקציות XML מרומזות. אפשר לטעון XML ל-BigQuery כמחרוזת, ולהשתמש בפונקציות מוגדרות על ידי המשתמש (UDF) כדי לנתח XML. לחלופין, אפשר לעבד את ה-XML באמצעות כלי ETL/ELT כמו Dataflow. ברשימה הבאה מוצגות פונקציות של Oracle XML:
| Oracle | BigQuery |
|---|---|
DELETEXML
|
אפשר להשתמש ב-UDF של BigQuery או בכלי ETL כמו Dataflow כדי לעבד XML. |
ENCODE_SQL_XML | |
EXISTSNODE | |
EXTRACTCLOBXML | |
EXTRACTVALUE | |
INSERTCHILDXML | |
INSERTCHILDXMLAFTER | |
INSERTCHILDXMLBEFORE | |
INSERTXMLAFTER | |
INSERTXMLBEFORE | |
SYS_XMLAGG | |
SYS_XMLANALYZE | |
SYS_XMLCONTAINS | |
SYS_XMLCONV | |
SYS_XMLEXNSURI | |
SYS_XMLGEN | |
SYS_XMLI_LOC_ISNODE | |
SYS_XMLI_LOC_ISTEXT | |
SYS_XMLINSTR | |
SYS_XMLLOCATOR_GETSVAL | |
SYS_XMLNODEID | |
SYS_XMLNODEID_GETLOCATOR | |
SYS_XMLNODEID_GETOKEY | |
SYS_XMLNODEID_GETPATHID | |
SYS_XMLNODEID_GETPTRID | |
SYS_XMLNODEID_GETRID | |
SYS_XMLNODEID_GETSVAL | |
SYS_XMLT_2_SC | |
SYS_XMLTRANSLATE | |
SYS_XMLTYPE2SQL | |
UPDATEXML | |
XML2OBJECT | |
XMLCAST | |
XMLCDATA | |
XMLCOLLATVAL | |
XMLCOMMENT | |
XMLCONCAT | |
XMLDIFF | |
XMLELEMENT | |
XMLEXISTS | |
XMLEXISTS2 | |
XMLFOREST | |
XMLISNODE | |
XMLISVALID | |
XMLPARSE | |
XMLPATCH | |
XMLPI | |
XMLQUERY | |
XMLQUERYVAL | |
XMLSERIALIZE | |
XMLTABLE | |
XMLTOJSON | |
XMLTRANSFORM | |
XMLTRANSFORMBLOB | |
XMLTYPE |
פונקציות של למידת מכונה
פונקציות של למידת מכונה (ML) ב-Oracle וב-BigQuery שונות זו מזו.
ב-Oracle נדרשים חבילת ניתוח מתקדם ורישיונות כדי להפעיל למידת מכונה במסד הנתונים.
Oracle משתמשת בחבילה DBMS_DATA_MINING ללמידת מכונה. כדי להמיר משימות של Oracle Data Miner, צריך לכתוב מחדש את הקוד כדי לעבוד עם התכונות של BigQuery.
אתם יכולים לבחור מתוך מגוון מוצרי AI של Google, כולל המוצרים והתכונות הבאים:
אתם יכולים להשתמש ב-BigQuery ML או בכלים לפיתוח ב-Vertex AI כדי לפתח, לאמן ולהעריך מודלים של למידת מכונה.
בטבלה הבאה מוצגות פונקציות של Oracle ML:
| Oracle | BigQuery |
|---|---|
CLASSIFIER
|
כאן אפשר לקרוא על אפשרויות של סיווג ורגרסיה של למידת מכונה ב-BigQuery ML |
CLUSTER_DETAILS
|
|
CLUSTER_DISTANCE
|
|
CLUSTER_ID
|
|
CLUSTER_PROBABILITY
|
|
CLUSTER_SET
|
|
PREDICTION
|
|
PREDICTION_BOUNDS
|
|
PREDICTION_COST
|
|
PREDICTION_DETAILS
|
|
PREDICTION_PROBABILITY
|
|
PREDICTION_SET
|
פונקציות אבטחה
בטבלה הבאה מפורטות הפונקציות לזיהוי המשתמש ב-Oracle וב-BigQuery:
| Oracle | BigQuery |
|---|---|
UID
|
SESSION_USER
|
USER/SESSION_USER/CURRENT_USER
|
SESSION_USER()
|
פונקציות של הגדרה או מערך
בטבלה הבאה מוצגות פונקציות של קבוצות או מערכים ב-Oracle והפונקציות המקבילות שלהן ב-BigQuery:
| Oracle | BigQuery |
|---|---|
MULTISET
|
ARRAY_AGG
|
MULTISET EXCEPT
|
ARRAY_AGG([DISTINCT] expression)
|
MULTISET INTERSECT
|
ARRAY_AGG([DISTINCT])
|
MULTISET UNION
|
ARRAY_AGG
|
פונקציות חלון
בטבלה הבאה מוצגות פונקציות חלון ב-Oracle והפונקציות המקבילות שלהן ב-BigQuery.
| Oracle | BigQuery |
|---|---|
LAG
|
LAG (value_expression[, offset [, default_expression]])
|
LEAD
|
LEAD (value_expression[, offset [, default_expression]])
|
שאילתות היררכיות או רקורסיביות
שאילתות היררכיות או רקורסיביות לא נמצאות בשימוש ב-BigQuery. אם ידוע העומק של ההיררכיה, אפשר להשיג פונקציונליות דומה באמצעות הצטרפות, כפי שמוצג בדוגמה הבאה. פתרון נוסף הוא להשתמש ב-BigQueryStorage API וב-Spark.
select
array(
select e.update.element
union all
select c1 from e.update.element.child as c1
union all
select c2 from e.update.element.child as c1, c1.child as c2
union all
select c3 from e.update.element.child as c1, c1.child as c2, c2.child as c3
union all
select c4 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4
union all
select c5 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4, c4.child as c5
) as flattened,
e as event
from t, t.events as e
בטבלה הבאה מוצגות פונקציות היררכיות ב-Oracle.
| Oracle | BigQuery |
|---|---|
DEPTH
|
ב-BigQuery לא נעשה שימוש בשאילתות היררכיות. |
PATH
|
|
SYS_CONNECT_BY_PATH (hierarchical)
|
פונקציות UTL
UTL_File
חבילה משמשת בעיקר לקריאה ולכתיבה של קבצי מערכת ההפעלה מ-PL/SQL. אפשר להשתמש ב-Cloud Storage לכל סוג של העברה זמנית של קובץ גולמי.
כדי לקרוא ולכתוב קבצים מ-Cloud Storage ואליו, צריך להשתמש בטבלאות חיצוניות ובטעינה וייצוא של BigQuery. מידע נוסף זמין במאמר מבוא למקורות נתונים חיצוניים.
פונקציות מרחביות
אתם יכולים להשתמש בניתוח נתונים גיאו-מרחביים ב-BigQuery כדי להחליף את הפונקציונליות של spatial. יש SDO_* פונקציות וסוגים ב-Oracle, כמו SDO_GEOM_KEY, SDO_GEOM_MBR ו-SDO_GEOM_MMB. הפונקציות האלה משמשות לניתוח מרחבי. אתם יכולים להשתמש בניתוח נתונים גיאו-מרחביים כדי לבצע ניתוח מרחבי.
תחביר DML
בקטע הזה מוסבר על ההבדלים בתחביר של שפת ניהול הנתונים בין Oracle לבין BigQuery.
INSERT דוחות
רוב ההצהרות של Oracle INSERT תואמות ל-BigQuery.
בטבלה הבאה מוצגים חריגים.
לסקריפטים של DML ב-BigQuery יש סמנטיקה של עקביות שונה מעט מההצהרות המקבילות ב-Oracle. סקירה כללית על בידוד תמונת מצב ועל טיפול בסשנים ובעסקאות מופיעה במקום אחר במסמך הזה, בקטע CREATE [UNIQUE] INDEX
section.
| Oracle | BigQuery |
|---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle מציעה מילת מפתח
הערה: ב-BigQuery, השמטת שמות העמודות בהצהרת |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
ב-BigQuery יש מכסות DML שמגבילות את מספר הצהרות ה-DML שאפשר להריץ מדי יום. כדי להפיק את המרב מהמכסה, כדאי להשתמש בשיטות הבאות:
|
UPDATE דוחות
הצהרות Oracle UPDATE תואמות ברובן ל-BigQuery, אבל ב-BigQuery להצהרת UPDATE חייב להיות סעיף WHERE.
מומלץ להשתמש בהצהרות DML של קבוצות במקום בהצהרות UPDATE וINSERT יחידות מרובות. לסקריפטים של DML ב-BigQuery יש סמנטיקה של עקביות ששונה מעט מהצהרות מקבילות ב-Oracle.
סקירה כללית על בידוד snapshot, ועל ניהול של סשנים ועסקאות מופיעה בקטע CREATE INDEX במסמך הזה.
בטבלה הבאה מוצגות הצהרות של Oracle UPDATE והצהרות של BigQuery שמבצעות את אותן המשימות.
ב-BigQuery, להצהרת UPDATE חייב להיות סעיף WHERE.
מידע נוסף על UPDATE ב-BigQuery זמין בדוגמאות לעדכון ב-BigQuery במאמרי העזרה בנושא DML.
DELETE ודוחות TRUNCATE
הפקודות DELETE ו-TRUNCATE הן שתי דרכים להסרת שורות מטבלה בלי להשפיע על סכימת הטבלה. לא נעשה שימוש ב-TRUNCATE ב-BigQuery.
אבל אפשר להשתמש בהצהרות DELETE כדי להשיג את אותה ההשפעה.
ב-BigQuery, להצהרת DELETE חייב להיות סעיף WHERE.
מידע נוסף על DELETE ב-BigQuery זמין בדוגמאות לשימוש ב-DELETE ב-BigQuery במאמרי העזרה בנושא DML.
| Oracle | BigQuery |
|---|---|
DELETE database.table;
|
DELETE FROM table WHERE TRUE;
|
MERGE דוחות
הצהרת MERGE יכולה לשלב פעולות INSERT, UPDATE ו-DELETE בהצהרת UPSERT אחת ולבצע את הפעולות באופן אטומי. הפעולה MERGE צריכה להתאים לשורת מקור אחת לכל היותר עבור כל שורת יעד.
התחביר של BigQuery ושל Oracle תואם לתקן ANSI.
עם זאת, לסקריפטים של DML ב-BigQuery יש סמנטיקה של עקביות שונה מעט מההצהרות המקבילות ב-Oracle.
תחביר DDL
בקטע הזה מוסבר על ההבדלים בתחביר של שפת הגדרת הנתונים (DDL) בין Oracle לבין BigQuery.
CREATE TABLE דוחות
רוב ההצהרות של Oracle CREATE TABLE תואמות ל-BigQuery, למעט האילוצים ורכיבי התחביר הבאים שלא נמצאים בשימוש ב-BigQuery:
STORAGETABLESPACEDEFAULTGENERATED ALWAYS ASENCRYPT-
PRIMARY KEY (col, ...). מידע נוסף זמין במאמרCREATE INDEX. -
UNIQUE INDEX. מידע נוסף זמין במאמרCREATE INDEX. CONSTRAINT..REFERENCESDEFAULTPARALLELCOMPRESS
מידע נוסף על CREATE TABLE ב-BigQuery זמין בדוגמאות ל-BigQuery CREATE TABLE.
אפשרויות לעמודות ומאפיינים
עמודות זהות הוצגו בגרסה Oracle 12c, שמאפשרת הגדלה אוטומטית של ערך בעמודה. השיטה הזו לא מתאימה ל-BigQuery, אבל אפשר להשתמש בשיטה הבאה כדי לבצע את הפעולה הזו. למידע נוסף על מפתחות סרוגייט (surrogate) ועל מאפיינים שמשתנים לאט (SCD), אפשר לעיין במדריכים הבאים:
| Oracle | BigQuery |
|---|---|
CREATE TABLE table (
|
INSERT INTO dataset.table SELECT
|
תגובות בעמודה
ב-Oracle משתמשים בתחביר Comment כדי להוסיף הערות לעמודות. אפשר להטמיע את התכונה הזו באופן דומה ב-BigQuery באמצעות תיאור העמודה, כמו שמוצג בטבלה הבאה:
| Oracle | BigQuery |
|---|---|
Comment on column table is 'column desc';
|
CREATE TABLE dataset.table (
|
טבלאות זמניות
Oracle תומכת בטבלאות זמניות, שמשמשות לעיתים קרובות לאחסון תוצאות ביניים בסקריפטים. Temporary (זמניות) נתמכות ב-BigQuery.
| Oracle | BigQuery |
|---|---|
CREATE GLOBAL TEMPORARY TABLE
|
CREATE TEMP TABLE temp_tab
|
האלמנטים הבאים של Oracle לא נמצאים בשימוש ב-BigQuery:
ON COMMIT DELETE ROWS;ON COMMIT PRESERVE ROWS;
יש גם כמה דרכים אחרות לדמות טבלאות זמניות ב-BigQuery:
- אורך החיים של מערך הנתונים: יוצרים מערך נתונים עם אורך חיים קצר (לדוגמה, שעה אחת), כך שכל הטבלאות שנוצרות במערך הנתונים הן למעשה זמניות (כי הן לא יישמרו מעבר לאורך החיים של מערך הנתונים). אפשר להוסיף את התחילית
tempלכל שמות הטבלאות במערך הנתונים הזה כדי לציין בבירור שהטבלאות הן זמניות. Table TTL: יוצרים טבלה עם זמן קצר לחיים (TTL) שספציפי לטבלה באמצעות הצהרות DDL שדומות לאלה:
CREATE TABLE temp.name (col1, col2, ...)
OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
WITHclause: אם נדרש טבלה זמנית רק בתוך אותו בלוק, משתמשים בתוצאה זמנית באמצעות משפטWITHאו שאילתת משנה.
CREATE SEQUENCE דוחות
לא נעשה שימוש ברצפים ב-BigQuery, אבל אפשר להשיג את אותה תוצאה באמצעות השיטה הבאה לעיבוד אצווה. למידע נוסף על מפתחות חלופיים ועל מאפיינים שמשתנים לאט (SCD), אפשר לעיין במדריכים הבאים:
INSERT INTO dataset.table
SELECT *,
ROW_NUMBER() OVER () AS id
FROM dataset.table
CREATE VIEW דוחות
בטבלה הבאה מוצגים מקבילים בין Oracle לבין BigQuery עבור הצהרת CREATE VIEW.
| Oracle | BigQuery | הערות |
|---|---|---|
CREATE VIEW view_name AS SELECT ...
|
CREATE VIEW view_name AS SELECT ...
|
|
CREATE OR REPLACE VIEW view_name AS SELECT ...
|
CREATE OR REPLACE VIEW
view_name AS
SELECT ...
|
|
| לא נתמך | CREATE VIEW IF NOT EXISTS
view_name
OPTIONS(view_option_list)
AS SELECT ...
|
יוצרת תצוגה חדשה רק אם התצוגה לא קיימת כרגע במערך הנתונים שצוין. |
CREATE MATERIALIZED VIEW דוחות
ב-BigQuery, פעולות רענון של תצוגות חומריות מתבצעות באופן אוטומטי. אין צורך להגדיר אפשרויות רענון (לדוגמה, בעת ביצוע commit או לפי לוח זמנים) ב-BigQuery. מידע נוסף זמין במאמר בנושא מבוא לתצוגות חומריות.
אם טבלת הבסיס ממשיכה להשתנות רק על ידי הוספות, השאילתה שמשתמשת בתצוגה חומרית (בין אם התצוגה מצוינת במפורש או נבחרת על ידי אופטימיזציית השאילתות) סורקת את כל התצוגה החומרית בתוספת דלתא בטבלת הבסיס מאז הרענון האחרון של התצוגה. המשמעות היא שהשאילתות מהירות וזולות יותר.
לעומת זאת, אם בוצעו עדכונים (DML UPDATE / MERGE) או מחיקות (DML DELETE, truncation, partition expiration) בטבלת הבסיס מאז הרענון האחרון של התצוגה, התצוגה החומרית לא תיסרק ולכן לא יתקבלו חיסכון בשאילתות עד לרענון הבא של התצוגה. בעצם, כל עדכון או מחיקה בטבלת הבסיס מבטלים את מצב התצוגה החומרית.
בנוסף, הנתונים ממאגר הסטרימינג של טבלת הבסיס לא נשמרים בתצוגה הממומשת. המאגר הזמני של הנתונים בסטרימינג עדיין נסרק באופן מלא, בלי קשר לשימוש בתצוגה חומרית.
בטבלה הבאה מוצגים מקבילים בין Oracle לבין BigQuery עבור הצהרת CREATE MATERIALIZED VIEW.
| Oracle | BigQuery | הערות |
|---|---|---|
CREATE MATERIALIZED VIEW view_name
|
CREATE MATERIALIZED VIEW
|
CREATE [UNIQUE] INDEX דוחות
בקטע הזה מתוארות גישות ב-BigQuery ליצירת פונקציונליות דומה לזו של אינדקסים ב-Oracle.
יצירת אינדקס לשיפור הביצועים
לא צריך להגדיר אינדקסים ב-BigQuery כי זהו מסד נתונים מבוסס-עמודות עם אופטימיזציה של שאילתות ואחסון. BigQuery מספק פונקציות כמו חלוקה למחיצות וקיבוץ וגם שדות מקוננים, שיכולות לשפר את היעילות והביצועים של השאילתות על ידי אופטימיזציה של אופן אחסון הנתונים.
יצירת אינדקסים לשמירה על עקביות (UNIQUE, PRIMARY INDEX)
ב-Oracle, אפשר להשתמש באינדקס ייחודי כדי למנוע שורות עם מפתחות לא ייחודיים בטבלה. אם תהליך מנסה להוסיף או לעדכן נתונים עם ערך שכבר נמצא באינדקס, הפעולה תיכשל בגלל הפרה של האינדקס.
מכיוון ש-BigQuery לא מספק אינדקסים מפורשים, אפשר להשתמש בהצהרת MERGE
במקום זאת כדי להוסיף רק רשומות ייחודיות לטבלת יעד מטבלת ביניים, תוך השמטת רשומות כפולות. עם זאת, אין דרך למנוע ממשתמש עם הרשאות עריכה להוסיף רשומה כפולה.
כדי ליצור שגיאה עבור רשומות כפולות ב-BigQuery, אפשר להשתמש בהצהרת MERGE מטבלת הביניים, כמו בדוגמה הבאה:
| Oracle | BigQuery | |
|---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
|
ברוב המקרים, המשתמשים מעדיפים להסיר כפילויות באופן עצמאי כדי למצוא שגיאות במערכות במורד הזרם.
BigQuery לא תומך בעמודות DEFAULT ו-IDENTITY (רצפים).
נעילה
ל-BigQuery אין מנגנון נעילה כמו ל-Oracle, והוא יכול להריץ שאילתות בו-זמנית (עד המכסה). רק להצהרות DML יש מגבלות מסוימות על פעולות בו-זמניות, ובחלק מהתרחישים יכול להיות שיידרש נעילת טבלה במהלך ההפעלה.
הצהרות SQL פרוצדורליות
בקטע הזה מוסבר איך להמיר הצהרות SQL פרוצדורליות שמשמשות בפרוצדורות מאוחסנות, בפונקציות ובטריגרים מ-Oracle ל-BigQuery.
CREATE PROCEDURE דוחות
התכונה 'תהליך מאוחסן' נתמכת כחלק מגרסת הבטא של BigQuery Scripting.
| Oracle | BigQuery | הערות |
|---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
בדומה ל-Oracle, BigQuery תומך בIN, OUT, INOUT מצבי ארגומנט. אין תמיכה במפרטי תחביר אחרים ב-BigQuery.
|
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
בקטעים הבאים מתוארות דרכים להמיר הצהרות פרוצדורליות קיימות של Oracle להצהרות סקריפטים של BigQuery עם פונקציונליות דומה.
CREATE TRIGGER דוחות
לא נעשה שימוש בטריגרים ב-BigQuery. לוגיקת אפליקציה מבוססת-שורה צריכה להיות מטופלת בשכבת האפליקציה. אפשר להפעיל את הפונקציונליות של הטריגר באמצעות כלי ההטמעה, Pub/Sub ו/או פונקציות Cloud Run במהלך ההטמעה או באמצעות סריקות רגילות.
הצהרה על משתנה והקצאת ערך למשתנה
בטבלה הבאה מוצגים משפטי Oracle DECLAREוהמשפטים המקבילים ב-BigQuery.
| Oracle | BigQuery |
|---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
הצהרות ופעולות של סמן
BigQuery לא תומך בסמנים, ולכן לא נעשה שימוש בהצהרות הבאות ב-BigQuery:
DECLARE cursor_name CURSOR [FOR | WITH] ...OPEN CUR_VAR FOR sql_str;OPEN cursor_name [USING var, ...];FETCH cursor_name INTO var, ...;CLOSE cursor_name;
הצהרות SQL דינמיות
ההצהרה הבאה של Oracle Dynamic SQL וההצהרה המקבילה שלה ב-BigQuery:
| Oracle | BigQuery |
|---|---|
EXECUTE IMMEDIATE
sql_str
|
EXECUTE IMMEDIATE
|
משפטי בקרה
בטבלה הבאה מוצגות פקודות של Oracle לניהול זרימת נתונים והפקודות המקבילות שלהן ב-BigQuery.
| Oracle | BigQuery |
|---|---|
IF condition THEN
|
IF condition THEN
|
SET SERVEROUTPUT ON;
|
DECLARE x INT64 DEFAULT 0;
|
LOOP
|
LOOP
|
WHILE boolean_expression DO
|
WHILE boolean_expression DO
|
FOR LOOP
|
לא נעשה שימוש ב-FOR LOOP ב-BigQuery. משתמשים בהצהרות אחרות של LOOP.
|
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
שימוש ב-CONTINUE עם תנאי IF.
|
GOTO
|
ההצהרה GOTO לא קיימת ב-BigQuery. משתמשים בתנאי IF.
|
מטא-נתונים והצהרות SQL של טרנזקציות
| Oracle | BigQuery |
|---|---|
GATHER_STATS_JOB
|
עדיין לא נעשה בו שימוש ב-BigQuery. |
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT;
|
עדיין לא נעשה בו שימוש ב-BigQuery. |
Alter session set isolation_level=serializable; /
|
ב-BigQuery תמיד נעשה שימוש בבידוד של תמונת מצב. פרטים נוספים זמינים בקטע עקביות ורמת בידוד של טרנזקציה במאמר הזה. |
EXPLAIN PLAN ...
|
לא בשימוש ב-BigQuery.
תכונות דומות הן הסבר על תוכנית השאילתות בממשק המשתמש באינטרנט של BigQuery והקצאת משבצות, וגם רישום ביומן ביקורת ב-Stackdriver. |
SELECT * FROM DBA_[*];
(תצוגות Oracle DBA_/ALL_/V$) |
SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;
מידע נוסף זמין במאמר מבוא ל-BigQuery INFORMATION_SCHEMA. |
SELECT * FROM GV$SESSION;
|
ב-BigQuery אין את המושג המסורתי של סשן. אפשר להציג משימות של שאילתות בממשק המשתמש או לייצא יומני ביקורת של Stackdriver אל BigQuery ולנתח יומנים של BigQuery כדי לנתח משימות. מידע נוסף זמין במאמר הצגת פרטי המשרה. |
START TRANSACTION;
|
החלפת התוכן של טבלה בפלט של שאילתה שווה לעסקה. אפשר לעשות את זה באמצעות שאילתה או פעולת העתקה.
שימוש בשאילתה:
שימוש בעותק:
|
הצהרות SQL מרובות שורות והצהרות SQL מרובות
גם Oracle וגם BigQuery תומכות בטרנזקציות (סשנים), ולכן תומכות בהצהרות שמפרידים ביניהן באמצעות נקודה ופסיק, שמופעלות יחד באופן עקבי. מידע נוסף מופיע במאמר בנושא טרנזקציות עם כמה תדפיסי חשבון.
קודי שגיאה והודעות שגיאה
קודי השגיאה של Oracle שונים מקודי השגיאה של BigQuery. אם לוגיקת האפליקציה שלכם תופסת כרגע את השגיאות, נסו לסלק את מקור השגיאה, כי BigQuery לא מחזיר את אותם קודי שגיאה.
התחייבויות עקביות ורמת בידוד של טרנזקציה
גם Oracle וגם BigQuery הן אטומיות – כלומר, הן תואמות ל-ACID ברמת כל שינוי בהרבה שורות. לדוגמה, פעולת MERGE היא אטומית, גם אם מוסיפים ומעדכנים כמה ערכים.
טרנזקציות
Oracle מספקת רמות בידוד של טרנזקציות מסוג read committed או serializable. יכול להיות שיהיו מצבים של קיפאון. הפעולות של Oracle insert append פועלות באופן עצמאי.
BigQuery גם תומך בעסקאות.
BigQuery עוזר להבטיח בקרת בו-זמניות אופטימית (הראשון שמבצע commit מנצח) באמצעות בידוד snapshot, שבו שאילתה קוראת את הנתונים האחרונים שבוצעו לפני שהשאילתה מתחילה. הגישה הזו מבטיחה את אותה רמת עקביות ברמת השורה, ברמת השינוי ובשורות שונות באותה פקודת DML, ועדיין מונעת מצבים של חסימה הדדית. במקרה של כמה הצהרות UPDATE שמופעלות על אותה טבלה, מערכת BigQuery עוברת לבקרת בו-זמניות פסימית ומכניסה לתור כמה הצהרות UPDATE, ומנסה שוב באופן אוטומטי במקרה של התנגשויות. INSERT אפשר להריץ הצהרות DML ומשימות טעינה במקביל ובאופן עצמאי כדי להוסיף נתונים לטבלאות.
חזרה לגרסה קודמת
Oracle תומכת בביטול שינויים. מכיוון שאין גבולות ברורים לעסקאות ב-BigQuery, אין מושג של ביטול מפורש ב-BigQuery. הפתרונות העקיפים הם table decorators או שימוש ב-FOR SYSTEM_TIME AS OF.
מגבלות על מסדי נתונים
כדאי לעיין במכסות והמגבלות העדכניות של BigQuery. אפשר להגדיל הרבה מהמכסות למשתמשים עם נפח גדול של נתונים על ידי פנייה ל-Cloud Customer Care. בטבלה הבאה מוצגת השוואה בין מגבלות מסד הנתונים של Oracle ו-BigQuery.
| הגבלה | Oracle | BigQuery |
|---|---|---|
| טבלאות לכל מסד נתונים | לא מוגבל | לא מוגבל |
| עמודות בכל טבלה | 1000 | 10,000 |
| גודל שורה מקסימלי | ללא הגבלה (תלוי בסוג העמודה) | 100 MB |
| האורך של שמות העמודות והטבלאות | If v12.2>= 128 Bytes
Else 30 Bytes |
16,384 תווי Unicode |
| שורות לכל טבלה | ללא הגבלה | ללא הגבלה |
| אורך מקסימלי של בקשת SQL | ללא הגבלה | 1 MB (אורך מקסימלי של שאילתת GoogleSQL לא פתורה)
12 MB (אורך מקסימלי של שאילתות מדור קודם ו-GoogleSQL שנפתרו) סטרימינג:
|
| גודל מקסימלי של בקשה ותגובה | ללא הגבלה | 10 MB (בקשה) ו-10 GB (תגובה), או כמעט ללא הגבלה אם משתמשים בעימוד או ב-Cloud Storage API. |
| מספר מקסימלי של סשנים בו-זמניים | מוגבל על ידי הפרמטרים של הסשנים או התהליכים | 100 שאילתות בו-זמניות (אפשר להגדיל את המכסה באמצעות הזמנת משבצות), 300 בקשות API בו-זמניות לכל משתמש. |
| מספר מקסימלי של טעינות בו-זמניות (מהירות) | מוגבל על ידי הפרמטרים של הסשנים או התהליכים | אין הגבלה על מספר המשימות שניתן להריץ בו-זמנית, המשימות מתווספות לתור. 100,000 משימות טעינה ליום לכל פרויקט. |
מגבלות אחרות של Oracle Database כוללות מגבלות על סוגי נתונים, מגבלות על מסדי נתונים פיזיים, מגבלות על מסדי נתונים לוגיים ומגבלות על תהליכים וזמן ריצה.