שימוש בתוצאות של שאילתות שנשמרו במטמון

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

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

מגבלות

השימוש במטמון השאילתות כפוף למגבלות הבאות:

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

תמחור ומכסות

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

חריגים להעברה למטמון של שאילתות

תוצאות השאילתה לא נשמרות במטמון:

  • כשמציינים טבלת יעד בהגדרות העבודה, המסוף,Google Cloud כלי שורת הפקודה של BigQuery או ה-API.
  • אם חל שינוי באחת מהטבלאות או בתצוגות הלוגיות שההפניה אליהן נעשית מאז שהתוצאות נשמרו במטמון.
  • אם לאחרונה התקבלו הוספות של נתונים בסטרימינג לאחת מהטבלאות שאליהן מתייחסת השאילתה (בטבלה יש נתונים באחסון שעבר אופטימיזציה לכתיבה), גם אם לא התקבלו שורות חדשות.
  • אם השאילתה משתמשת בפונקציות לא דטרמיניסטיות, למשל פונקציות של תאריך ושעה כמו CURRENT_TIMESTAMP() ו-CURRENT_DATE, ופונקציות אחרות כמו SESSION_USER(), היא מחזירה ערכים שונים בהתאם למועד ההפעלה של השאילתה.
  • אם אתם מריצים שאילתות על כמה טבלאות באמצעות תו כללי לחיפוש.
  • אם פג התוקף של התוצאות שנשמרו במטמון. בדרך כלל, משך החיים של המטמון הוא 24 שעות, אבל התוצאות שנשמרו במטמון הן על בסיס מאמץ מרבי ויכול להיות שהתוקף שלהן יפוג מוקדם יותר.
  • אם השאילתה מופעלת על מקור נתונים חיצוני שאינו Cloud Storage. (שאילתות GoogleSQL ב-Cloud Storage נתמכות על ידי תוצאות שאילתות שנשמרו במטמון).
  • אם השאילתה מופעלת על טבלה שמוגנת על ידי אבטחה ברמת השורה, התוצאות לא נשמרות במטמון.
  • אם השאילתה מופעלת על טבלה שמוגנת על ידי אבטחה ברמת העמודה, כולל מיסוך נתונים, יכול להיות שהתוצאות לא יישמרו במטמון.
  • אם הטקסט של השאילתה השתנה בכל דרך שהיא, כולל רווחים או הערות ששונו.

איך תוצאות שמורות במטמון מאוחסנות

כשמריצים שאילתה, נוצרת טבלת תוצאות זמנית במטמון במערך נתונים מוסתר מסוג מיוחד שנקרא מערך נתונים אנונימי. בניגוד למערכי נתונים רגילים שיורשים הרשאות ממודל היררכיית המשאבים של IAM (הרשאות פרויקט והרשאות ארגון), הגישה למערכי נתונים אנונימיים מוגבלת לבעלים. הבעלים של מערך נתונים אנונימי הוא המשתמש שהריץ את השאילתה שהפיקה את התוצאה שנשמרה במטמון. בנוסף, נבדקת ההרשאה bigquery.jobs.create בפרויקט כדי לוודא שלמשתמש יש גישה לפרויקט.

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

למרות שלמשתמש שמריץ את השאילתה יש גישה מלאה למערך הנתונים ולטבלת התוצאות שנשמרו במטמון, לא מומלץ להשתמש בהם כקלט למשימות תלויות.

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

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

שמירה במטמון בין משתמשים

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

אפשר להשתמש במטמון בין משתמשים אם אתם משתמשים במהדורת Enterprise או Enterprise Plus . אותן מגבלות וחריגים שחלים על שמירת מטמון של משתמש יחיד חלים גם על שמירת מטמון של משתמשים שונים.

השבתת אחזור תוצאות שנשמרו במטמון

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

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

אם רוצים להשבית את אחזור התוצאות שנשמרו במטמון ולאלץ הערכה בזמן אמת של שאילתת עבודה, אפשר להגדיר את המאפיין configuration.query.useQueryCache של שאילתת העבודה ל-false.

כדי להשבית את האפשרות Use cached results:

המסוף

  1. פותחים את מסוף Google Cloud .
    לדף BigQuery

  2. לוחצים על Compose new query (כתיבת שאילתה חדשה).

  3. מזינים שאילתת SQL תקינה באזור הטקסט של עורך השאילתות.

  4. לוחצים על עוד ובוחרים באפשרות הגדרות שאילתה.

    הגדרות השאילתה

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

BQ

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

 bq query \
 --nouse_cache \
 --batch \
 'SELECT
    name,
    count
  FROM
    `my-project`.mydataset.names_2013
  WHERE
    gender = "M"
  ORDER BY
    count DESC
  LIMIT
    6'

API

כדי לעבד שאילתה בלי להשתמש בתוצאות הקיימות שנשמרו במטמון, צריך להגדיר את המאפיין useQueryCache לערך false בהגדרות של משימת query.

Go

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// queryDisableCache demonstrates issuing a query and requesting that the query cache is bypassed.
func queryDisableCache(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	q := client.Query(
		"SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;")
	q.DisableQueryCache = true
	// Location must match that of the dataset(s) referenced in the query.
	q.Location = "US"

	// Run the query and print results when the query job is completed.
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	it, err := job.Read(ctx)
	for {
		var row []bigquery.Value
		err := it.Next(&row)
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintln(w, row)
	}
	return nil
}

Java

כדי לעבד שאילתה בלי להשתמש בתוצאות הקיימות שנשמרו במטמון, צריך להגדיר את האפשרות use query cache לערך false כשיוצרים QueryJobConfiguration.

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

// Sample to running a query with the cache disabled.
public class QueryDisableCache {

  public static void runQueryDisableCache() {
    String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
    queryDisableCache(query);
  }

  public static void queryDisableCache(String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query)
              // Disable the query cache to force live query evaluation.
              .setUseQueryCache(false)
              .build();

      TableResult results = bigquery.query(queryConfig);

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query disable cache performed successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

async function queryDisableCache() {
  // Queries the Shakespeare dataset with the cache disabled.

  // Create a client
  const bigquery = new BigQuery();

  const query = `SELECT corpus
    FROM \`bigquery-public-data.samples.shakespeare\`
    GROUP BY corpus`;
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    useQueryCache: false,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

PHP

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי PHPהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery PHP API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

// Construct a BigQuery client object.
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);

// Set job configs
$jobConfig = $bigQuery->query($query);
$jobConfig->useQueryCache(false);

// Extract query results
$queryResults = $bigQuery->runQuery($jobConfig);

$i = 0;
foreach ($queryResults as $row) {
    printf('--- Row %s ---' . PHP_EOL, ++$i);
    foreach ($row as $column => $value) {
        printf('%s: %s' . PHP_EOL, $column, json_encode($value));
    }
}
printf('Found %s row(s)' . PHP_EOL, $i);

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.QueryJobConfig(use_query_cache=False)
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""
query_job = client.query(sql, job_config=job_config)  # Make an API request.

for row in query_job:
    print(row)

איך מוודאים שהמטמון נמצא בשימוש

אם משתמשים בשיטה jobs.insert כדי להריץ שאילתה, אפשר להגדיר את המאפיין createDisposition של הגדרת העבודה query לערך CREATE_NEVER כדי לגרום לכך שעבודת השאילתה תיכשל אלא אם אפשר להשתמש בתוצאות שנשמרו במטמון.

אם תוצאת השאילתה לא קיימת במטמון, מוחזרת שגיאה NOT_FOUND.

BQ

משתמשים בדגל --require_cache כדי לדרוש תוצאות ממטמון השאילתות. בדוגמה הבאה, המערכת מאלצת את BigQuery לעבד את השאילתה אם התוצאות שלה קיימות במטמון:

 bq query \
 --require_cache \
 --batch \
 'SELECT
    name,
    count
  FROM
    `my-project`.mydataset.names_2013
  WHERE
    gender = "M"
  ORDER BY
    count DESC
  LIMIT
    6'

API

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

אימות השימוש במטמון

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

  • שימוש במסוף Google Cloud עוברים אל Query results ולוחצים על Job Information. בייטים שעובדו מופיע 0 B (התוצאות נשמרו במטמון).
  • משתמשים ב-BigQuery API. המאפיין cacheHit בתוצאת השאילתה מוגדר כ-true.

ההשפעה של אבטחה ברמת העמודה

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

שינוי כמו הסרה של קבוצה או משתמש מהתפקיד Data Catalog Fine Grained Reader שמשמש לתג מדיניות לא מבטל את התוקף של המטמון למשך 24 שעות. שינוי בקבוצת בקרת הגישה Data Catalog Fine Grained Reader מועבר באופן מיידי, אבל השינוי לא מבטל את התוקף של הנתונים במטמון.

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

במהלך 24 השעות אחרי שמסירים משתמש מהתפקיד Data Catalog Fine Grained Reader (קורא עם הרשאות גישה מדויקות) עבור תג מדיניות, המשתמש יכול לגשת לנתונים שנשמרו במטמון רק אם בעבר הייתה לו הרשאה לראות אותם. אם מוסיפים שורות לטבלה, המשתמש לא יכול לראות את השורות שנוספו, גם אם התוצאות נשמרות במטמון.