שאילתות אסינכרוניות באינדקס משני
במסמך הזה מופיעות דוגמאות לדפוסי שאילתות נפוצים ליצירת אינדקסים משניים אסינכרוניים ב-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;