עבודה עם שאילתות מרובות הצהרות
שאילתה עם כמה הצהרות היא אוסף של הצהרות 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);
הרצת שאילתה עם כמה הצהרות
אפשר להריץ שאילתה עם כמה הצהרות באותו אופן כמו כל שאילתה אחרת, למשל במסוף Google Cloud או באמצעות כלי שורת הפקודה של BigQuery.
הרצת שאילתה עם כמה הצהרות במצב ניסיון
כדי להעריך את מספר הבייטים שנקראו על ידי שאילתה עם כמה הצהרות, כדאי לבצע הרצת בדיקה. ההרצה היבשה של שאילתה עם כמה הצהרות היא הכי מדויקת בשאילתות שמכילות רק הצהרות.SELECT
הפעלה של בדיקות יבשות מתבצעת באופן מיוחד עבור סוגי השאילתות וההצהרות הבאים:
- הצהרות
CALL: ההרצה היבשה מאמתת שהפרוצדורה שנקראה קיימת ושיש לה חתימה שתואמת לארגומנטים שסופקו. התוכן של הפרוצדורה שנקראת וכל ההצהרות אחרי ההצהרהCALLלא מאומתות. - הצהרות DDL:
ההרצה היבשה מאמתת את הצהרת ה-DDL הראשונה ואז מפסיקה. כל ההצהרות הבאות מדלגות. אין תמיכה בהרצות ניסיון של משפטי
CREATE TEMP TABLE. - פקודות DML: ההרצה היבשה מאמתת את פקודת ה-DML ואז ממשיכה לאמת פקודות עוקבות. במקרה כזה, האומדנים של הבייטים מבוססים על הגדלים המקוריים של הטבלאות, ולא מביאים בחשבון את התוצאה של פקודת ה-DML.
EXECUTE IMMEDIATEstatements: 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 שעות לכל היותר.
הצגת נתונים בטבלה זמנית
אחרי שיוצרים טבלה זמנית, אפשר לראות את המבנה שלה ואת הנתונים שבה. כדי לראות את מבנה הטבלה והנתונים, פועלים לפי השלבים הבאים:
במסוף Google Cloud , פותחים את הדף BigQuery.
בחלונית הימנית, לוחצים על כלי הניתוחים:

אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.
בחלונית Explorer לוחצים על Job history.
בכרטיסייה היסטוריה אישית או היסטוריית הפרויקט, לוחצים על השאילתה שיצרה את הטבלה הזמנית.
בשורה טבלת יעד, לוחצים על טבלה זמנית.
הגדרת טבלאות זמניות באמצעות _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("....").כשמריצים שאילתה עם כמה הצהרות ב Google Cloud מסוף, אפשר לראות את הפלט של כל הצהרה בשאילתה. הפקודה
bq queryבכלי bq של שורת הפקודה מציגה גם את התוצאות של כל שלב כשמריצים שאילתה עם כמה הצהרות.במסוף 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.
מגבלות על שדות הגדרה
אי אפשר להגדיר את שדות השאילתה להגדרת משרה הבאים בשאילתה עם כמה הצהרות:
clusteringcreate_dispositiondestination_tabledestination_encryption_configurationrange_partitioningschema_update_optionstime_partitioninguser_defined_function_resourceswrite_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 עבור שאילתות מרובות הצהרות זמין במאמר עבודת שאילתה מרובת הצהרות.