עבודה עם שאילתות מרובות הצהרות

שאילתה עם כמה הצהרות היא אוסף של הצהרות SQL שאפשר להריץ ברצף, עם מצב משותף.

במאמר הזה מוסבר איך להשתמש בשאילתות מרובות הצהרות ב-BigQuery, כולל איך לכתוב שאילתות מרובות הצהרות, איך להשתמש בטבלאות זמניות בשאילתות מרובות הצהרות, איך להפנות למשתנים בשאילתות מרובות הצהרות ואיך לנפות באגים בשאילתות מרובות הצהרות.

שאילתות עם כמה הצהרות משמשות לעיתים קרובות בפרוצדורות מאוחסנות ותומכות בהצהרות של שפה פרוצדורלית, שמאפשרות לכם לבצע פעולות כמו הגדרת משתנים והטמעה של זרימת בקרה. שאילתות עם כמה הצהרות יכולות להכיל הצהרות DDL ו-DML שיש להן תופעות לוואי, כמו יצירה או שינוי של טבלאות או נתונים בטבלה.

כתיבה, הרצה ושמירה של שאילתות עם כמה הצהרות

שאילתה מרובת הצהרות מורכבת מהצהרת SQL אחת או יותר, שמופרדות באמצעות נקודה ופסיק. אפשר להשתמש בכל הצהרת SQL תקפה בשאילתה עם כמה הצהרות. שאילתות עם כמה הצהרות יכולות לכלול גם הצהרות בשפה פרוצדורלית, שמאפשרות להשתמש במשתנים או להטמיע זרימת בקרה בהצהרות ה-SQL.

כתיבת שאילתה עם כמה הצהרות

אפשר לכתוב שאילתה עם כמה הצהרות ב-BigQuery. השאילתה הבאה של הצהרת משתנה עם כמה שאילתות משתמשת במשתנה בתוך הצהרת IF:

DECLARE day INT64;
SET day = (SELECT EXTRACT(DAYOFWEEK from CURRENT_DATE));
if day = 1 or day = 7 THEN
  SELECT 'Weekend';
ELSE
  SELECT 'Weekday';
END IF

מערכת BigQuery מפרשת כל בקשה עם כמה הצהרות כשאילתה עם כמה הצהרות, אלא אם ההצהרות מורכבות כולן מהצהרות CREATE TEMP FUNCTION ואחריהן הצהרה אחת של SELECT. לדוגמה, השאילתה הבאה לא נחשבת לשאילתה עם כמה הצהרות:

CREATE TEMP FUNCTION Add(x INT64, y INT64) AS (x + y);
SELECT Add(3, 4);

הרצת שאילתה עם כמה הצהרות

אפשר להריץ שאילתה עם כמה הצהרות באותו אופן כמו כל שאילתה אחרת, למשל במסוף Cloud de Confiance או באמצעות כלי שורת הפקודה של BigQuery.

הרצת שאילתה עם כמה הצהרות במצב ניסיון

כדי להעריך את מספר הבייטים שנקראו על ידי שאילתה עם כמה הצהרות, כדאי לבצע הרצת בדיקה. ההרצה היבשה של שאילתה עם כמה הצהרות היא הכי מדויקת בשאילתות שמכילות רק הצהרות.SELECT

הפעלה של בדיקות יבשות מתבצעת באופן מיוחד עבור סוגי השאילתות וההצהרות הבאים:

  • הצהרות CALL: ההרצה היבשה מאמתת שהפרוצדורה שנקראה קיימת ושיש לה חתימה שתואמת לארגומנטים שסופקו. התוכן של הפרוצדורה שנקראת וכל ההצהרות אחרי ההצהרה CALL לא מאומתות.
  • הצהרות DDL: ההרצה היבשה מאמתת את הצהרת ה-DDL הראשונה ואז מפסיקה. כל ההצהרות הבאות מדלגות. אין תמיכה בהרצות ניסיון של משפטי CREATE TEMP TABLE.
  • פקודות DML: ההרצה היבשה מאמתת את פקודת ה-DML ואז ממשיכה לאמת פקודות עוקבות. במקרה כזה, האומדנים של הבייטים מבוססים על הגדלים המקוריים של הטבלאות, ולא מביאים בחשבון את התוצאה של פקודת ה-DML.
  • EXECUTE IMMEDIATE statements: the dry run validates the query expression, but does not evaluate the dynamic query itself. כל ההצהרות שאחרי ההצהרה EXECUTE IMMEDIATE ייפסחו.
  • שאילתות שמשתמשות במשתנים במסנן מחיצות: ההרצה היבשה מאמתת את השאילתה הראשונית ואת ההצהרות הבאות. עם זאת, אי אפשר לחשב את ערך זמן הריצה של משתנים במסנן מחיצה באמצעות הרצת בדיקה. הפעולה הזו משפיעה על הערכת מספר הבייטים שנקראו.
  • שאילתות שמשתמשות במשתנים בביטוי של חותמת הזמן בקטע FOR SYSTEM TIME AS OF: ההרצה היבשה משתמשת בתוכן הנוכחי של הטבלה ומתעלמת מהקטע FOR SYSTEM TIME AS OF. ההבדלים האלה משפיעים על האומדן של bytes read אם יש הבדלים בגודל בין הטבלה הנוכחית לבין האיטרציה הקודמת של הטבלה.
  • הצהרות בקרה FOR, ‏ IF ו-WHILE: ההרצה היבשה נעצרת באופן מיידי. ביטויי תנאים, גופי הצהרות הבקרה וכל ההצהרות הבאות לא מאומתים.

הפעלת ניסויים מתבצעת על בסיס המאמץ המרבי, והתהליך הבסיסי כפוף לשינויים. התנאים הבאים חלים על הרצות ניסיון:

  • יכול להיות ששאילתה שהשלימה בהצלחה הרצה יבשה לא תפעל בהצלחה. לדוגמה, יכול להיות ששאילתות ייכשלו בזמן הריצה מסיבות שלא מזוהות בהרצות בדיקה.
  • יכול להיות ששאילתה שמופעלת בהצלחה לא תשלים הרצה יבשה בהצלחה. לדוגמה, יכול להיות ששאילתות ייכשלו בהרצה יבשה בגלל סיבות שזוהו בזמן ההרצה.
  • לא מובטח שריצות הרצה יבשות שמופעלות בהצלחה היום יפעלו גם בעתיד. לדוגמה, שינויים בהטמעה של הרצת בדיקה עשויים לזהות שגיאות בשאילתה שלא זוהו קודם.

שמירת שאילתה עם כמה הצהרות

כדי לשמור שאילתה עם כמה הצהרות, אפשר לעיין במאמר בנושא עבודה עם שאילתות שמורות.

שימוש במשתנים בשאילתה עם כמה הצהרות

שאילתה עם כמה הצהרות יכולה להכיל משתנים שנוצרו על ידי המשתמש ומשתני מערכת.

  • אפשר להצהיר על משתנים שנוצרו על ידי המשתמש, להקצות להם ערכים ולהפנות אליהם לאורך השאילתה.

  • אפשר להפנות למשתני מערכת בשאילתה ולהקצות ערכים לחלק מהם, אבל בניגוד למשתנים בהגדרת משתמש, לא צריך להצהיר עליהם. משתני המערכת מוטמעים ב-BigQuery.

הצהרה על משתנה שנוצר על ידי משתמש

צריך להצהיר על משתנים שנוצרו על ידי המשתמשים בתחילת השאילתה עם כמה הצהרות או בתחילת בלוק BEGIN. המשתנים שמוצהרים בתחילת שאילתת מרובת ההצהרות נמצאים בהיקף של השאילתה כולה. למשתנים שמוצהרים בתוך בלוק BEGIN יש היקף לבלוק. הם יוצאים מההקשר אחרי הצהרת END המתאימה. הגודל המקסימלי של משתנה הוא 1MB, והגודל המקסימלי של כל המשתנים שמשמשים בשאילתה עם כמה הצהרות הוא 10MB.

אפשר להצהיר על משתנה באמצעות הצהרה פרוצדורלית DECLARE באופן הבא:

DECLARE x INT64;

BEGIN
DECLARE y INT64;
-- Here you can reference x and y
END;

-- Here you can reference x, but not y

הגדרת משתנה שנוצר על ידי משתמש

אחרי שמצהירים על משתנה שנוצר על ידי המשתמש, אפשר להקצות לו ערך באמצעות SET הצהרה פרוצדורלית, כמו בדוגמה הבאה:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

הגדרת משתנה מערכת

אתם לא יוצרים משתני מערכת, אבל אתם יכולים לשנות את ערך ברירת המחדל של חלק מהם, כמו בדוגמה הבאה:

SET @@dataset_project_id = 'MyProject';

אפשר גם להגדיר משתנה מערכת ולהשתמש בו באופן מרומז בשאילתה עם כמה הצהרות. לדוגמה, בשאילתה הבאה צריך לכלול את הפרויקט בכל פעם שרוצים ליצור טבלה חדשה:

BEGIN
  CREATE TABLE MyProject.MyDataset.MyTempTableA (id STRING);
  CREATE TABLE MyProject.MyDataset.MyTempTableB (id STRING);
END;

אם אתם לא רוצים להוסיף את הפרויקט לנתיבי הטבלה כמה פעמים, אתם יכולים להקצות את מזהה הפרויקט של מערך הנתונים MyProject למשתנה המערכת @@dataset_project_id בשאילתה מרובת ההצהרות. ההקצאה הזו הופכת את MyProject לפרויקט ברירת המחדל לשאר השאילתה.

SET @@dataset_project_id = 'MyProject';

BEGIN
  CREATE TABLE MyDataset.MyTempTableA (id STRING);
  CREATE TABLE MyDataset.MyTempTableB (id STRING);
END;

באופן דומה, אפשר להגדיר את משתנה המערכת @@dataset_id כדי להקצות קבוצת נתונים כברירת מחדל לשאילתה. לדוגמה:

SET @@dataset_project_id = 'MyProject';
SET @@dataset_id = 'MyDataset';

BEGIN
  CREATE TABLE MyTempTableA (id STRING);
  CREATE TABLE MyTempTableB (id STRING);
END;

אפשר גם להפנות באופן מפורש למשתני מערכת כמו @@dataset_id בחלקים רבים של שאילתה עם כמה הצהרות. מידע נוסף זמין בדוגמאות למשתני מערכת.

הפניה למשתנה שנוצר על ידי משתמש

אחרי שמצהירים על משתנה שנוצר על ידי משתמש ומגדירים אותו, אפשר להפנות אליו בשאילתה עם כמה הצהרות. אם למשתנה ולעמודה יש שם זהה, העמודה מקבלת עדיפות.

התוצאה היא column x + column x:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

WITH Numbers AS (SELECT 50 AS x)
SELECT (x+x) AS result FROM Numbers;
+--------+
| result |
+--------+
| 100    |
+--------+

התוצאה היא column y + variable x:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

WITH Numbers AS (SELECT 50 AS y)
SELECT (y+x) AS result FROM Numbers;
+--------+
| result |
+--------+
| 60     |
+--------+

שימוש בטבלאות זמניות בשאילתה עם כמה הצהרות

טבלאות זמניות מאפשרות לשמור תוצאות ביניים בטבלה. טבלאות זמניות מנוהלות על ידי BigQuery, כך שלא צריך לשמור אותן או לתחזק אותן במערך נתונים. אתם מחויבים על אחסון של טבלאות זמניות.

אפשר ליצור טבלה זמנית ולהפנות אליה בשאילתה עם כמה הצהרות. כשמסיימים להשתמש בטבלה הזמנית, אפשר למחוק אותה ידנית כדי לצמצם את עלויות האחסון, או לחכות ש-BigQuery ימחק אותה אחרי 24 שעות.

יצירת טבלה זמנית

אפשר ליצור טבלה זמנית לשאילתה עם כמה הצהרות באמצעות ההצהרה CREATE TABLE. בדוגמה הבאה נוצרת טבלה זמנית לאחסון התוצאות של שאילתה, והטבלה הזמנית משמשת בשאילתת משנה:

-- Find the top 100 names from the year 2017.
CREATE TEMP TABLE top_names(name STRING)
AS
 SELECT name
 FROM `bigquery-public-data`.usa_names.usa_1910_current
 WHERE year = 2017
 ORDER BY number DESC LIMIT 100
;
-- Which names appear as words in Shakespeare's plays?
SELECT
 name AS shakespeare_name
FROM top_names
WHERE name IN (
 SELECT word
 FROM `bigquery-public-data`.samples.shakespeare
);

מלבד השימוש ב-TEMP או ב-TEMPORARY, התחביר זהה לתחביר של CREATE TABLE.

כשיוצרים טבלה זמנית, לא משתמשים במאפיין של פרויקט או מערך נתונים בשם הטבלה. הטבלה נוצרת באופן אוטומטי במערך נתונים מיוחד.

הפניה לטבלה זמנית

אפשר להתייחס לטבלה זמנית לפי השם שלה למשך השאילתה הנוכחית עם כמה הצהרות. הנתונים האלה כוללים טבלאות זמניות שנוצרו על ידי פרוצדורה בשאילתה מרובת ההצהרות. אי אפשר לשתף טבלאות זמניות. טבלאות זמניות נמצאות במערכי נתונים מוסתרים _script% עם שמות שנוצרו באופן אקראי. במאמר בנושא הצגת מערכי נתונים מוסבר איך להציג מערכי נתונים מוסתרים.

מחיקת טבלאות זמניות

אפשר למחוק טבלה זמנית באופן מפורש לפני שהשאילתה מרובת ההצהרות מסתיימת באמצעות ההצהרה DROP TABLE:

CREATE TEMP TABLE table1(x INT64);
SELECT * FROM table1;  -- Succeeds
DROP TABLE table1;
SELECT * FROM table1;  -- Results in an error

אחרי ששאילתה עם כמה הצהרות מסתיימת, הטבלה הזמנית קיימת למשך 24 שעות לכל היותר.

הצגת נתונים בטבלה זמנית

אחרי שיוצרים טבלה זמנית, אפשר לראות את המבנה שלה ואת הנתונים שבה. כדי לראות את מבנה הטבלה והנתונים, פועלים לפי השלבים הבאים:

  1. במסוף Cloud de Confiance , פותחים את הדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. בחלונית Explorer לוחצים על Job history.

  4. בכרטיסייה היסטוריה אישית או היסטוריית הפרויקט, לוחצים על השאילתה שיצרה את הטבלה הזמנית.

  5. בשורה טבלת יעד, לוחצים על טבלה זמנית.

הגדרת טבלאות זמניות באמצעות _SESSION

כשמשתמשים בטבלאות זמניות יחד עם מערך נתונים שמוגדר כברירת מחדל, שמות טבלאות לא מלאים מתייחסים לטבלה זמנית אם היא קיימת, או לטבלה במערך הנתונים שמוגדר כברירת מחדל. החריג הוא הצהרות CREATE TABLE, שבהן טבלת היעד נחשבת לטבלה זמנית אם ורק אם מופיעה מילת המפתח TEMP או TEMPORARY.

לדוגמה, נבחן את השאילתה הבאה עם כמה הצהרות:

-- Create table t1 in the default dataset
CREATE TABLE t1 (x INT64);

-- Create temporary table t1.
CREATE TEMP TABLE t1 (x INT64);

-- This statement selects from the temporary table.
SELECT * FROM t1;

-- Drop the temporary table
DROP TABLE t1;

-- Now that the temporary table is dropped, this statement selects from the
-- table in the default dataset.
SELECT * FROM t1;

אפשר לציין במפורש שמתייחסים לטבלה זמנית על ידי הוספת _SESSION לשם הטבלה:

-- Create a temp table
CREATE TEMP TABLE t1 (x INT64);

-- Create a temp table using the `_SESSION` qualifier
CREATE TEMP TABLE _SESSION.t2 (x INT64);

-- Select from a temporary table using the `_SESSION` qualifier
SELECT * FROM _SESSION.t1;

אם משתמשים במגביל _SESSION בשאילתה של טבלה זמנית שלא קיימת, השאילתה עם כמה הצהרות מחזירה שגיאה שמציינת שהטבלה לא קיימת. לדוגמה, אם אין טבלה זמנית בשם t3, השאילתה עם כמה הצהרות תחזיר שגיאה גם אם קיימת טבלה בשם t3 במערך הנתונים שמוגדר כברירת מחדל.

אי אפשר להשתמש ב-_SESSION כדי ליצור טבלה לא זמנית:

CREATE TABLE _SESSION.t4 (x INT64);  -- Fails

איסוף מידע על עבודת שאילתה עם כמה הצהרות

עבודת שאילתה עם כמה הצהרות מכילה מידע על שאילתה עם כמה הצהרות שהופעלה. בין המשימות הנפוצות שאפשר לבצע באמצעות נתוני העבודות: החזרת ההצהרה האחרונה שהופעלה באמצעות שאילתת ריבוי ההצהרות או החזרת כל ההצהרות שהופעלו באמצעות שאילתת ריבוי ההצהרות.

החזרת המשפט האחרון שהופעל

השיטה jobs.getQueryResults מחזירה את תוצאות השאילתה של ההצהרה האחרונה שבוצעה בשאילתה מרובת ההצהרות. אם לא בוצעה אף הצהרה, לא מוחזרות תוצאות.

החזרה של כל ההצהרות שהופעלו

כדי לקבל את התוצאות של כל ההצהרות בשאילתה עם כמה הצהרות, צריך למנות את עבודות הצאצא ולהפעיל את השיטה jobs.getQueryResults על כל אחת מהן.

ספירת משרות צאצא

שאילתות עם כמה הצהרות מורצות ב-BigQuery באמצעות jobs.insert, בדומה לכל שאילתה אחרת, כאשר השאילתות עם כמה הצהרות מצוינות כטקסט השאילתה. כשמריצים שאילתה עם כמה הצהרות, נוצרות משימות נוספות, שנקראות משימות צאצא, לכל הצהרה בשאילתה. אפשר למנות את משימות הצאצא של שאילתה מרובת-הצהרות על ידי קריאה ל-jobs.list והעברת מזהה המשימה של השאילתה מרובת-ההצהרות כפרמטר parentJobId.

ניפוי באגים בשאילתה עם כמה הצהרות

ריכזנו כאן כמה טיפים לניפוי באגים בשאילתות עם כמה הצהרות:

  • משתמשים בהצהרה ASSERT כדי לוודא שתנאי בוליאני הוא true.

  • משתמשים ב-BEGIN...EXCEPTION...END כדי לזהות שגיאות ולהציג את הודעת השגיאה ואת דוח קריסות.

  • כדי להציג תוצאות ביניים, משתמשים ב-SELECT FORMAT("....").

  • כשמריצים שאילתה עם כמה הצהרות ב Cloud de Confiance מסוף, אפשר לראות את הפלט של כל הצהרה בשאילתה. הפקודה bq query בכלי bq של שורת הפקודה מציגה גם את התוצאות של כל שלב כשמריצים שאילתה עם כמה הצהרות.

  • במסוף Cloud de Confiance , אפשר לבחור הצהרה ספציפית בתוך עורך השאילתות ולהריץ אותה.

הרשאות

ההרשאה לגשת לטבלה, למודל או למשאב אחר נבדקת בזמן ההפעלה. אם לא מבוצעת הצהרה או שלא מתבצעת הערכה של ביטוי, BigQuery לא בודק אם למשתמש שמבצע את השאילתה המורכבת יש גישה למשאבים כלשהם שהשאילתה מפנה אליהם.

בשאילתה עם כמה הצהרות, ההרשאות של כל ביטוי או הצהרה נבדקות בנפרד. לדוגמה:

SELECT * FROM dataset_with_access.table1;
SELECT * FROM dataset_without_access.table2;

אם למשתמש שמריץ את השאילתה יש גישה ל-table1 אבל אין לו גישה ל-table2, השאילתה הראשונה תצליח והשאילתה השנייה תיכשל. גם משימת השאילתה עם כמה הצהרות נכשלת.

מגבלות אבטחה

בשאלתות עם כמה הצהרות, אפשר להשתמש ב-SQL דינמי כדי ליצור הצהרות SQL בזמן ריצה. זה נוח, אבל יכול ליצור הזדמנויות חדשות לשימוש לרעה. לדוגמה, הרצת השאילתה הבאה מהווה איום אבטחה פוטנציאלי של הזרקת SQL, כי יכול להיות שהסינון של פרמטר הטבלה לא תקין, והוא מאפשר גישה לטבלאות לא רצויות והרצה שלהן.

-- Risky query vulnerable to SQL injection attack.
EXECUTE IMMEDIATE CONCAT('SELECT * FROM SensitiveTable WHERE id = ', @id);

כדי למנוע חשיפה או דליפה של מידע אישי רגיש בטבלה או הפעלה של פקודות כמו DROP TABLE למחיקת נתונים בטבלה, ההצהרות הדינמיות הפרוצדורליות של BigQuery תומכות בכמה אמצעי אבטחה שמטרתם לצמצם את החשיפה להתקפות הזרקת SQL, כולל:

  • הצהרת EXECUTE IMMEDIATE לא מאפשרת להטמיע כמה הצהרות SQL בשאילתה שלה, שהורחבה עם פרמטרים של שאילתה ומשתנים.
  • הפקודות הבאות מוגבלות ואי אפשר להפעיל אותן באופן דינמי: BEGIN/END,‏ CALL,‏ CASE,‏ IF,‏ LOOP,‏ WHILE ו-EXECUTE IMMEDIATE.

מגבלות על שדות הגדרה

אי אפשר להגדיר את שדות השאילתה להגדרת משרה הבאים בשאילתה עם כמה הצהרות:

  • clustering
  • create_disposition
  • destination_table
  • destination_encryption_configuration
  • range_partitioning
  • schema_update_options
  • time_partitioning
  • user_defined_function_resources
  • write_disposition

תמחור

התמחור של שאילתות מרובות הצהרות כולל חיובים על שאילתות (כשמשתמשים במודל חיוב על פי דרישה) ועל אחסון של טבלאות זמניות. כשמשתמשים בהזמנות, השימוש בשאילתות מכוסה על ידי החיובים על ההזמנה.

חישוב הגודל של שאילתות על פי דרישה

אם אתם משתמשים בחיוב על פי דרישה, מערכת BigQuery מחייבת על שאילתות מרובות הצהרות על סמך מספר הבייטים שעובדו במהלך ההרצה של השאילתות מרובות ההצהרות.

כדי לקבל אומדן של מספר הבייטים ששאילתה עם כמה הצהרות עשויה לעבד, אפשר להריץ הרצה יבשה.

התמחור הבא חל על שאילתות עם כמה הצהרות:

  • DECLARE: סכום הבייטים שנסרקו בכל הטבלאות שהוזכרו בביטוי DEFAULT. DECLARE דפי חשבון שלא כוללים הפניות לטבלה לא כרוכים בעלות.

  • SET: סכום הבייטים שנסרקו בכל הטבלאות שהוזכרו בביטוי. SET דפי חשבון שלא כוללים הפניות לטבלה לא כרוכים בעלות.

  • IF: סכום הבייטים שנסרקו בכל הטבלאות שאליהן יש הפניה בביטוי התנאי. ביטויים של תנאים IF ללא הפניה לטבלה לא כרוכים בעלות. לא נגבה תשלום על הצהרות בבלוק IF שלא מופעלות.

  • WHILE: סכום הבייטים שנסרקו בכל הטבלאות שאליהן יש הפניה בביטוי התנאי. הצהרות WHILE ללא הפניות לטבלה בביטוי התנאי לא כרוכות בעלות. לא תחויבו על הצהרות בבלוק WHILE שלא מופעלות.

  • CONTINUE או ITERATE: אין עלות משויכת.

  • BREAK או LEAVE: אין עלות משויכת.

  • BEGIN או END: אין עלות משויכת.

אם שאילתה עם כמה הצהרות נכשלת, העלות של כל ההצהרות עד לנקודת הכישלון עדיין חלה. לא יחולו עלויות על דף החשבון שנכשל.

לדוגמה, בדוגמת קוד לדוגמה הבאה יש הערות לפני כל הצהרה שמסבירות איזו עלות, אם בכלל, נגרמת על ידי כל הצהרה:

-- No cost, since no tables are referenced.
DECLARE x DATE DEFAULT CURRENT_DATE();
-- Incurs the cost of scanning string_col from dataset.table.
DECLARE y STRING DEFAULT (SELECT MAX(string_col) FROM dataset.table);
-- Incurs the cost of copying the data from dataset.big_table.  Once the
-- table is created, you are not charged for storage while the rest of the
-- multi-statement query runs.
CREATE TEMP TABLE t AS SELECT * FROM dataset.big_table;
-- Incurs the cost of scanning column1 from temporary table t.
SELECT column1 FROM t;
-- No cost, since y = 'foo' doesn't reference a table.
IF y = 'foo' THEN
  -- Incurs the cost of scanning all columns from dataset.other_table, if
  -- y was equal to 'foo', or otherwise no cost since it is not executed.
  SELECT * FROM dataset.other_table;
ELSE
  -- Incurs the cost of scanning all columns from dataset.different_table, if
  -- y was not equal to 'foo', or otherwise no cost since it is not executed.
  UPDATE dataset.different_table
  SET col = 10
  WHERE true;
END IF;
-- Incurs the cost of scanning date_col from dataset.table for each
-- iteration of the loop.
WHILE x < (SELECT MIN(date_col) FROM dataset.table) DO
  -- No cost, since the expression does not reference any tables.
  SET x = DATE_ADD(x, INTERVAL 1 DAY);
  -- No cost, since the expression does not reference any tables.
  IF true THEN
    -- LEAVE has no associated cost.
    LEAVE;
  END IF;
  -- Never executed, since the IF branch is always taken, so does not incur
  -- a cost.
  SELECT * FROM dataset.big_table;
END WHILE;

מידע נוסף זמין במאמר חישוב הגודל של שאילתה.

תמחור נפח אחסון

אתם מחויבים על טבלאות זמניות שנוצרות על ידי שאילתות עם כמה הצהרות. אפשר להשתמש בתצוגות TABLE_STORAGE או TABLE_STORAGE_USAGE_TIMELINE כדי לראות את נפח האחסון שבו נעשה שימוש בטבלאות הזמניות האלה. טבלאות זמניות נמצאות במערכי נתונים מוסתרים _script% עם שמות שנוצרו באופן אקראי.

מכסות

מידע על מכסות של שאילתות עם כמה הצהרות מופיע במאמר מכסות ומגבלות.

הצגת מספר השאילתות עם כמה הצהרות

אפשר לראות את מספר השאילתות הפעילות עם כמה הצהרות באמצעות התצוגה INFORMATION_SCHEMA.JOBS_BY_PROJECT. בדוגמה הבאה נעשה שימוש בתצוגה INFORMATION_SCHEMA.JOBS_BY_PROJECT כדי להציג את מספר השאילתות עם כמה הצהרות מהיום הקודם:

SELECT
  COUNT(*)
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP()
AND job_type = "QUERY"
AND state = 'RUNNING'
AND statement_type = 'SCRIPT'

מידע נוסף על שליחת שאילתות אל INFORMATION_SCHEMA.JOBS עבור שאילתות מרובות הצהרות זמין במאמר עבודת שאילתה מרובת הצהרות.