כתיבת שאילתות בסשנים
במאמר הזה מוסבר איך לכתוב שאילתות בסשן של 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