כתיבת שאילתות בסשנים
במאמר הזה מוסבר איך לכתוב שאילתות בסשן של BigQuery. המאמר מיועד למשתמשים שכבר יש להם הבנה כללית לגבי סשנים ב-BigQuery, והם יודעים להריץ שאילתות בסשן.
סשן שומר את המצב. מצב שנוצר בסשן נשמר וניתן לשימוש לאורך כל הסשן. לכן, אם יוצרים טבלה זמנית ברשומה של שאילתה אחת, אפשר להשתמש בטבלה הזמנית הזו ברשומות אחרות של שאילתות למשך שאר הסשן.
סשן כולל תמיכה במשתני סשן, משתני מערכת של סשן, שאילתות עם כמה הצהרות וטרנזקציות עם כמה הצהרות.
לפני שמבצעים את השלבים האלה, צריך לוודא שיש לכם את ההרשאות הנדרשות לעבודה בסשן.
שימוש במשתני מערכת בסשן
אפשר להגדיר או לאחזר נתונים ברמת הסשן באמצעות משתני המערכת הבאים:
-
@@dataset_id: המזהה של מערך הנתונים שמוגדר כברירת מחדל בפרויקט הנוכחי. אפשר להגדיר את משתני המערכת@@dataset_project_idו-@@dataset_idולהשתמש בהם ביחד. -
@@dataset_project_id: המזהה של פרויקט ברירת המחדל למערכי נתונים שמשמשים בשאילתה. אם משתנה המערכת הזה לא מוגדר, או אם הוא מוגדר ל-NULL, נעשה שימוש בפרויקט שבו מופעלת השאילתה. אפשר להגדיר את משתני המערכת@@dataset_project_idו-@@dataset_idולהשתמש בהם ביחד. -
@@query_label: תווית המשימה שרוצים להקצות לסשן. אפשר להשתמש בתווית לאורך כל הסשן, ולא רק לשאילתה ספציפית בסשן. -
@@session_id: המזהה של ההפעלה הנוכחית. -
@@time_zone: אזור הזמן שמוגדר כברירת מחדל לשימוש בפונקציות SQL שתלויות באזור זמן, כשלא מציינים אזור זמן כארגומנט.
אפשר להשתמש במשתני המערכת האלה בכל שלב במהלך הסשן, והם בתוקף למשך הסשן שנותר. אתם לא מגדירים את המשתנים האלה, אבל אפשר להקצות להם ערך חדש באמצעות ההצהרה SET.
הגודל המקסימלי של משתנה בסשן הוא 1MB, והגודל המקסימלי של כל המשתנים בסשן הוא 10MB.
הוספת תוויות לסשנים
אתם יכולים להקצות תווית של משרה לסשן. במקרה כזה, כל השאילתות העתידיות בסשן ישויכו לתווית. אפשר להשתמש בתוויות בכל שלב במהלך הסשן, והן תקפות למשך הסשן שנותר. תווית התפקיד שתקצו תופיע ביומני הביקורת.
שימוש במשתנים בסשן
אפשר ליצור, להגדיר ולאחזר נתונים ברמת הסשן באמצעות משתנים. אפשר להשתמש במשתנים בכל שלב במהלך הסשן, והם בתוקף למשך הסשן שנותר.
- כדי ליצור משתנה ברמת הסשן, משתמשים בהצהרה
DECLAREמחוץ לבלוקBEGIN...END. - כדי להגדיר משתנה בהיקף סשן אחרי שהוא נוצר, משתמשים בהצהרה
SET. - משתנה שמוצהר בתוך בלוק
BEGIN...ENDהוא לא משתנה בהיקף הסשן. - אפשר להפנות למשתנה ברמת הסשן בתוך בלוק
BEGIN...END. - אפשר להגדיר משתנה בהיקף סשן בתוך בלוק
BEGIN...END.
הגודל המקסימלי של משתנה בסשן הוא 1MB, והגודל המקסימלי של כל המשתנים בסשן הוא 10MB.
שימוש בטבלאות זמניות בסשנים
טבלה זמנית מאפשרת לכם לשמור תוצאות ביניים בטבלה. טבלה זמנית גלויה ברמת הסשן, כך שלא צריך לשמור אותה או לתחזק אותה במערך נתונים. הוא נמחק אוטומטית אחרי שסשן מסתיים. אתם מחויבים על אחסון של טבלאות זמניות בזמן שהסשן פעיל. מידע נוסף זמין במאמר שימוש בטבלאות זמניות בשאילתה עם כמה הצהרות.
שימוש בפונקציות זמניות בסשנים
פונקציה זמנית או פונקציית צבירה זמנית גלויות ברמת הסשן, כך שאין צורך לשמור אותן או לתחזק אותן במערך נתונים. הוא נמחק אוטומטית אחרי שסשן מסתיים.
עבודה עם שאילתות מרובות הצהרות בסשנים
אפשר להשתמש בשאילתות מרובות הצהרות ב-GoogleSQL בסשן. סקריפט יכול לכלול טבלאות זמניות ומשתני מערכת לכל סקריפט. סקריפטים יכולים לראות משתני סשן וטבלאות זמניות. כל המשתנים ברמה העליונה שמוצהרים בסקריפט הם גם משתני סשן.
הרצת טרנזקציות עם כמה שאילתות וכמה הצהרות בסשנים
אפשר להריץ עסקאות עם כמה הצהרות על כמה שאילתות בסשן. לדוגמה:
השאילתה הבאה מתחילה עסקה.
BEGIN TRANSACTION
בתוך הטרנזקציה, השאילתה הבאה יוצרת טבלה זמנית בשם Flights ואז מחזירה את הנתונים בטבלה הזו. השאילתה כוללת שתי הצהרות.
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
SELECT * FROM Flights;
השאילתה הבאה מבצעת את העסקה.
COMMIT
אפשר למצוא עסקה פעילה שמשפיעה על הטבלה Flights:
WITH running_transactions AS (
SELECT DISTINCT transaction_id
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
EXCEPT DISTINCT
SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND statement_type = "COMMIT_TRANSACTION"
OR statement_type = "ROLLBACK_TRANSACTION"
)
SELECT
jobs.transaction_id AS transaction_id,
project_id,
user_email,
session_info.session_id,
query
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT AS jobs, running_transactions
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND destination_table = ("Flights")
AND jobs.transaction_id = running_transactions.transaction_id;
אם רוצים לבטל עסקה שמתבצעת ויש לכם את התפקיד bigquery.admin, אתם יכולים להנפיק הצהרת ביטול באמצעות מזהה הסשן שמשויך לעסקה ב-Cloud Shell או באמצעות קריאה ל-API. כשמריצים את השאילתה באמצעות מזהה הסשן שמשויך לעסקה, מזהה הסשן מוצג בתוצאות.
סשן לדוגמה
זו דוגמה לתהליך העבודה של סשן במסוף Google Cloud :
במסוף Google Cloud , פותחים כרטיסייה חדשה בעורך ויוצרים סשן.
בכרטיסיית העורך, מוסיפים את השאילתה הבאה:
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a; SELECT * FROM Flights;מריצים את השאילתה. נוצרת טבלה זמנית בשם
Flightsוכל הנתונים מוחזרים.+-------+ | total | +-------+ | 55 | | 23 | | 3 | | 14 | | 10 | +-------+מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:
SELECT * FROM Flights LIMIT 2;מריצים את השאילתה. התוצאות של שני רשומות מוחזרות. למרות שמחקתם את השאילתה הקודמת, המידע מהשאילתה נשמר בסשן הנוכחי.
+-------+ | total | +-------+ | 55 | | 23 | +-------+מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:
DECLARE x INT64 DEFAULT 10; SELECT total * x AS total_a FROM Flights LIMIT 2; BEGIN SET x = 100; SELECT total * x AS total_b FROM Flights LIMIT 2; END; SELECT total * x AS total_c FROM Flights LIMIT 2;מריצים את השאילתה. המשתנה
xברמת הסשן משמש להגבלת מספר התוצאות שמוחזרות עבור הטבלהFlights. כדאי לבדוק מקרוב איך ההיקף משפיע על המשתנה הזה כשהוא מוצהר מחוץ להצהרתBEGIN...END, מוגדר בתוך הצהרתBEGIN...ENDואז מופנה אליו שוב מחוץ להצהרתBEGIN...END.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:
SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS default_time_zone; SET @@time_zone = "America/Los_Angeles"; SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS new_time_zone;מריצים את השאילתה. משתנה המערכת
@@time_zoneברמת הסשן משמש להקצאת אזור זמן לחותמת זמן. ההצהרה הראשונה מחזירה חותמת זמן עם אזור הזמן שמוגדר כברירת מחדל (בדוגמה הזו,UTC). ההצהרה הבאה מקצה ל-@@time_zoneערך חדש. ההצהרה השלישית מחזירה חותמת זמן עם אזור הזמן החדש.+-------------------------------+ | default_time_zone | +-------------------------------+ | 2008-12-20 15:30:00+00 | +-------------------------------+ +-------------------------------+ | new_time_zone | +-------------------------------+ | 2008-12-20 07:30:00-08 | +-------------------------------+
המאמרים הבאים
- מידע נוסף על עבודה עם סשנים, כולל איך ליצור, להשתמש, לסיים ולרשום את הסשנים.
- מידע נוסף על שאילתות עם כמה הצהרות ב-GoogleSQL
- מידע נוסף על עסקאות עם כמה הצהרות ב-GoogleSQL