שאילתות אסינכרוניות באינדקס משני

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

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

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

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

יצירת אינדקס הפוך על סמך ערכים ומסווג עמודות

השאילתה הבאה יוצרת אינדקס הפוך על ידי חילוץ של כל צמדי המפתח/ערך מקבוצת עמודות עם סכימה גמישה. הפונקציה משתמשת ב-MAP_ENTRIES כדי לקבל מערך של כל הנתונים שמאוחסנים במשפחת העמודות stats_summary, ואז ב-UNNEST כדי להפוך כל צמד מפתח-ערך לשורה נפרדת. האינדקס שמתקבל מאפשר חיפושים מהירים על סמך stat_description ו-stat_value. אם מוסיפים סוגים חדשים של נתונים סטטיסטיים לטבלת המקור, הם נכללים אוטומטית באינדקס האסינכרוני ב-Bigtable.

SELECT
 stats.key as stat_description,
 stats.value as stat_value,
 _key as original_key,
 cell_plan as cell_plan
FROM test_table
CROSS JOIN UNNEST(MAP_ENTRIES(stats_summary)) stats
ORDER BY stat_description, stat_value, original_key

כתוצאה מכך, לכל זוג מפתח/ערך ממשפחת העמודות המקורית stats_summary יש שורה משלו בתצוגה הרציפה המגולמת:

stat_description (key) stat_value (key) original_key (key) cell_plan
connected_cell "2" phone#4c410523#20190501 { "data_plan_01gb": "true", "data_plan_05gb": "false" }
os_build PQ2A.190401.002 phone#5c10102#20190501 { "data_plan_10gb": "false" }

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

SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"

יצירת מפתח שורה חדש על סמך נתונים קיימים

בדוגמה הבאה נוצר מפתח אינדקס חדש, total_plan_capacity, על ידי סיווג של תוכניות נתונים שמאוחסנות במשפחת העמודות cell_plan. השאילתה משתמשת ב-MAP_KEYS כדי לקבל את כל המפתחות ב-cell_plan וב-ARRAY_INCLUDES_ANY כדי לסנן מפתחות ספציפיים של חבילת גלישה. אחר כך, הצהרה של CASE מגדירה את הלוגיקה להקצאת קטגוריה של total_plan_capacity שמבוססת על הנוכחות והערכים של תוכניות הנתונים האלה. כך אפשר לבצע חיפושים יעילים על סמך הקיבולת המשולבת של תוכניות הנתונים.

SELECT
 CASE
    WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'x-small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'medium'

   WHEN
     (cell_plan['data_plan_01gb'] = "false" OR cell_plan['data_plan_01gb'] IS NULL)
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'large'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'x-large'
 END as total_plan_capacity,
 _key as original_key,
 stats_summary
FROM test_table
WHERE ARRAY_INCLUDES_ANY(MAP_KEYS(cell_plan), ["data_plan_01gb", "data_plan_05gb","data_plan_10gb"])
ORDER BY total_plan_capacity, original_key

יצירת מדד שמבוסס על נתונים של תקופה

ב-Bigtable מאוחסן כל ערך של תא וחותמת הזמן שמשויכת אליו. באמצעות הדגל WITH_HISTORY=>TRUE בסעיף FROM, אפשר לאחזר את כל הגרסאות של הנתונים ואת חותמות הזמן שלהן. פונקציית הטבלה UNPACK מרחיבה את תוצאות השאילתה כך שכל ערך עם חותמת זמן מופיע בשורה נפרדת עם עמודה נפרדת _timestamp. כך אפשר ליצור אינדקס משני אסינכרוני שבו מפתח השורה החדש מבוסס על ערכי חותמת הזמן האלה, וכך לבצע במהירות חיפושים שמבוססים על טווחי זמן.

SELECT
 _timestamp as stats_timestamp,
 _key as original_key,
 stats_summary
FROM UNPACK((
 select
   _key,
   stats_summary
  FROM
 test_table (WITH_HISTORY=>TRUE)
))
ORDER BY stats_timestamp, original_key

יצירת רשומת אינדקס לפריטים ולערכים בתא JSON

לרוב משתמשים ב-Bigtable כמאגר של זוגות מפתח/ערך לעומסי עבודה גדולים, כולל נתונים בפורמטים כמו JSON. בדוגמה הבאה מוצג אופן היצירה של אינדקס משני אסינכרוני לחיפושים מהירים של נתונים שמאוחסנים ב-JSON. השאילתה משתמשת ב-JSON_EXTRACT כדי לחלץ את store_id ממחרוזת JSON בתוך משפחת העמודות transaction_information בטבלה בשם sales. האינדקס הזה מאפשר שליפה מהירה של עסקאות מכירה לפי מזהי חנות ספציפיים.

SELECT
JSON_EXTRACT(transaction_information["json"], "$.store_id") as store_id,
_key as original_key,
transaction_information
from sales
ORDER BY store_id, original_key;

המאמרים הבאים