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

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

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

מגבלות

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

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

תמחור ומכסות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

המסוף

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

  2. לוחצים על Compose new query.

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

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

  5. בקטע Cache preference, מבטלים את הסימון של Use cached results.

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 במדריך למתחילים של 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

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

איך לוודא שהמטמון פועל

אם אתם משתמשים ב-method‏ 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 החזיר תוצאה באמצעות המטמון, אפשר להשתמש באחת מהשיטות הבאות:

  • להשתמש ב-BigQuery API. המאפיין cacheHit בתוצאת השאילתה מוגדר כ-true.