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

שאילתות עם כמה הצהרות ב-BigQuery מאפשרות להריץ אוסף של הצהרות SQL ברצף עם מצב משותף. אתם יכולים לשלב SQL סטנדרטי עם הצהרות של שפה פרוצדורלית כדי להגדיר משתנים, להטמיע זרימת בקרה ולהריץ פעולות מורכבות של שפת הגדרת נתונים (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);

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

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

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

כשמריצים שאילתה עם כמה הצהרות ב-BigQuery Studio, בחלונית Query results מוצגות התוצאות של כל הצהרה בעץ היררכי של היסטוריית ההרצה. ההרצה של השאילתה עם כמה הצהרות מוצגת כצומת הורה בעץ ההיסטוריה, עם צומתי משנה לכל הצהרה (משימת צאצא) בתוך השאילתה עם כמה הצהרות. אתם יכולים ללחוץ על צומתי משנה ספציפיים כדי לראות את הנתונים הספציפיים שהוחזרו על ידי החלק הזה של השאילתה עם כמה הצהרות, בלי לצאת מהכלי לעריכת קוד.

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

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

בהרצות יבשות, הטיפול בסוגי השאילתות וההצהרות הבאים הוא מיוחד:

  • הצהרות CALL: ההרצה היבשה מאמתת שהפרוצדורה שנקראה קיימת ושיש לה חתימה שתואמת לארגומנטים שסופקו. התוכן של הפרוצדורה שנקראה וכל ההצהרות שאחרי ההצהרה CALL לא מאומתים.
  • הצהרות DDL: ההרצה היבשה מאמתת את הצהרת ה-DDL הראשונה ואז נעצרת. המערכת מדלגת על כל ההצהרות הבאות. אין תמיכה בהרצות בדיקה של הצהרות CREATE TEMP TABLE.
  • פקודות DML: ההרצה היבשה מאמתת את פקודת ה-DML ואז ממשיכה לאמת את הפקודות הבאות. במקרה כזה, ההערכות של הבייטים מבוססות על הגדלים המקוריים של הטבלאות, ולא מביאות בחשבון את התוצאה של פקודת ה-DML.
  • EXECUTE IMMEDIATE: ההרצה היבשה מאמתת את ביטוי השאילתה, אבל לא מעריכה את השאילתה הדינמית עצמה. המערכת מדלגת על כל ההצהרות שאחרי ההצהרה EXECUTE IMMEDIATE.
  • שאילתות שמשתמשות במשתנים במסנן מחיצות: ההרצה היבשה מאמתת את השאילתה הראשונית ואת ההצהרות הבאות. עם זאת, בהרצה היבשה אי אפשר לחשב את ערך זמן הריצה של משתנים במסנן מחיצות. ההגדרה הזו משפיעה על הערכת הבייטים שנקראו.
  • שאילתות שמשתמשות במשתנים בביטוי חותמת הזמן של סעיף FOR SYSTEM TIME AS OF: ההרצה היבשה משתמשת בתוכן הנוכחי של הטבלה ומתעלמת מסעיף FOR SYSTEM TIME AS OF. הפעולה הזו משפיעה על אומדן הבייטים שנקראו אם יש הבדלים בגודל בין הטבלה הנוכחית לבין הגרסה הקודמת של הטבלה.
  • ‫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. במסוף Google Cloud , פותחים את הדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

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

  5. בשורה טבלת יעדים, לוחצים על Temporary table.

הוספת _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

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

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

החזרת ההצהרה האחרונה שבוצעה

ה-method‏ jobs.getQueryResults מחזירה את תוצאות השאילתה של ההצהרה האחרונה לביצוע בשאילתה עם כמה הצהרות. אם לא בוצעה הצהרה, לא יוחזרו תוצאות.

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

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

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

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

משימות צאצא יוצרות גם רשומות משלהן ביומן הביקורת. אירועי גישה לנתונים כמו TableDataRead ו-TableDataChange מתועדים כנגד המשימה הצאצא שמריצה את ההצהרה, ולא כנגד המשימה ההורה. למידע נוסף, קראו את הסקירה הכללית על יומני הביקורת של BigQuery.

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

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

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

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

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

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

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

הרשאות

ההרשאה לגשת לטבלה, למודל או למשאב אחר נבדקת בזמן הביצוע. אם הצהרה לא מבוצעת או ביטוי לא מוערך, 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 עם שאילתות מרובות-הצהרות, קראו את המאמר משימת שאילתה מרובת-הצהרות.