כתיבת שאילתות בסשנים

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

  1. במסוף Google Cloud , פותחים כרטיסייה חדשה בעורך ויוצרים סשן.

  2. בכרטיסיית העורך, מוסיפים את השאילתה הבאה:

    CREATE TEMP TABLE Flights(total INT64)  AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
    SELECT * FROM Flights;
    
  3. מריצים את השאילתה. נוצרת טבלה זמנית בשם Flights וכל הנתונים מוחזרים.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    |     3 |
    |    14 |
    |    10 |
    +-------+
    
  4. מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:

    SELECT * FROM Flights LIMIT 2;
    
  5. מריצים את השאילתה. התוצאות של שני רשומות מוחזרות. למרות שמחקתם את השאילתה הקודמת, המידע מהשאילתה נשמר בסשן הנוכחי.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    +-------+
    
  6. מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:

    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;
    
  7. מריצים את השאילתה. המשתנה x ברמת הסשן משמש להגבלת מספר התוצאות שמוחזרות עבור הטבלה Flights. כדאי לבדוק מקרוב איך הגדרת ההיקף משפיעה על המשתנה הזה כשהוא מוצהר מחוץ להצהרת BEGIN...END, מוגדר בתוך הצהרת BEGIN...END ואז מופנה אליו שוב מחוץ להצהרת BEGIN...END.

    +---------+
    | total_a |
    +---------+
    |     550 |
    |     230 |
    +---------+
    
    +---------+
    | total_b |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
    +---------+
    | total_c |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
  8. מוחקים את התוכן בכרטיסיית העורך ומוסיפים את השאילתה הבאה:

    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;
    
  9. מריצים את השאילתה. משתנה המערכת @@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        |
    +-------------------------------+
    

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