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

כתיבת שאילתות בסשן של 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        |
    +-------------------------------+
    

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