בדף הזה מוסבר איך לעבוד עם JSON באמצעות Spanner.
סוג הנתונים JSON הוא סוג נתונים חצי מובנה שמשמש להחזקת נתונים בפורמט JSON (JavaScript Object Notation). המפרטים של פורמט JSON מתוארים ב-RFC 7159.
קובץ JSON יכול להיות שימושי להשלמת סכימה יחסית של נתונים דלילים או של נתונים עם מבנה לא מוגדר או משתנה. עם זאת, הכלי לאופטימיזציה של שאילתות מסתמך על המודל הרלציוני כדי לסנן, לצרף, לצבור ולמיין ביעילות בקנה מידה נרחב. לשאילתות ב-JSON יש פחות אופטימיזציות מובנות ופחות אפשרויות לבדיקה ולשיפור הביצועים.
מפרטים
סוג ה-JSON ב-Spanner מאחסן ייצוג מנורמל של מסמך ה-JSON של הקלט.
- אפשר להוסיף עד 80 רמות של קינון ב-JSON.
- רווחים לבנים לא נשמרים.
- אין תמיכה בתגובות. העסקאות או השאילתות עם הערות ייכשלו.
- האיברים באובייקט JSON ממוינים בסדר לקסיקוגרפי.
- הסדר של רכיבי מערך JSON נשמר.
- אם לאובייקט JSON יש מפתחות כפולים, רק המפתח הראשון נשמר.
- הסוג והערך של סוגים פרימיטיביים (מחרוזת, בוליאני, מספר ו-null) נשמרים.
- ערכים מסוג מחרוזת נשמרים בדיוק כמו שהם.
- ערכים מסוג מספר נשמרים, אבל יכול להיות שהייצוג הטקסטואלי שלהם ישתנה כתוצאה מתהליך הנורמליזציה. לדוגמה, אם מספר הקלט הוא 10000, יכול להיות שהייצוג המנורמל שלו יהיה 1e+4. הסמנטיקה של שמירת ערכים מספריים היא כדלקמן:
- מספרים שלמים חתומים בטווח [INT64_MIN, INT64_MAX] נשמרים.
- מספרים שלמים לא מסומנים בטווח [0, UINT64_MAX] נשמרים.
- ערכי Double שאפשר להמיר ממחרוזת ל-Double ולמחרוזת בלי לאבד את הדיוק העשרוני נשמרים. אם לא ניתן לבצע את ההמרה של ערך מסוג double, העסקה או השאילתה ייכשלו.
- לדוגמה,
SELECT JSON '2.2412421353246235436'נכשל. - פתרון עקיף שפועל הוא
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'), שמחזירJSON '2.2412421353246237'.
- לדוגמה,
- משתמשים בפונקציות
TO_JSON(),JSON_OBJECT()ו-JSON_ARRAY()כדי ליצור מסמכי JSON ב-SQL. הפונקציות האלה מטמיעות את המירכאות והתווים הנדרשים לביטול בריחה.
הגודל המקסימלי המותר של המסמך אחרי הנורמליזציה הוא 10MB.
מאפיין המציין אם ערך יכול להיות ריק (nullability)
ערכי JSON null מטופלים כערכי SQL שאינם NULL.
לדוגמה:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
קידוד
מסמכי JSON צריכים להיות מקודדים ב-UTF-8. אם יש טרנזקציות או שאילתות עם מסמכי JSON שמקודדים בפורמטים אחרים, תוחזר שגיאה.
יצירת טבלה עם עמודות JSON
אפשר להוסיף עמודת JSON לטבלה בזמן יצירת הטבלה. ערכים מסוג JSON יכולים להיות ניתנים לאיפוס.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
הוספה והסרה של עמודות JSON מטבלאות קיימות
אפשר גם להוסיף עמודת JSON לטבלאות קיימות או להסיר אותה מהן.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
בדוגמה הבאה מוצג איך להוסיף עמודה JSON בשם VenueDetails לטבלה Venues באמצעות ה-CLI של gcloud וספריות הלקוח של Spanner.
gcloud
gcloud spanner databases ddl update DATABASE_ID \ --instance=INSTANCE_ID \ --ddl="ALTER TABLE Venues ADD COLUMN VenueDetails JSON;"
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
שינוי נתוני JSON
בדוגמה הבאה מוצג איך לעדכן נתונים ב-JSON באמצעות ה-CLI של gcloud וספריות הלקוח של Spanner.
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="UPDATE Venues SET VenueDetails = JSON '{\"rating\": 9, \"open\": true}' WHERE VenueId = 1"
C++
C++
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
C#
C#
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Go
Go
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Java
Java
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
Node.js
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
PHP
PHP
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Python
Python
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Ruby
Ruby
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
אינדקס של נתוני JSON
כדי להאיץ את השאילתות של נתוני JSON, אפשר להשתמש באינדקסים משניים ובאינדקסים של חיפוש עם נתוני ה-JSON. Spanner לא תומך בשימוש בעמודות מסוג JSON כמפתחות באינדקסים משניים.
שימוש באינדקס משני
אינדקסים משניים שימושיים כשמסננים ערכים סקלריים במסמך JSON. כדי להשתמש באינדקסים משניים עם JSON, צריך ליצור עמודה שנוצרה שמחלצת את הנתונים הסקלריים הרלוונטיים וממירה את הנתונים לסוג SQL מתאים. לאחר מכן אפשר ליצור אינדקס משני בעמודה שנוצרה. האינדקס מאיץ שאילתות שעומדות בדרישות ומופעלות מול העמודה שנוצרה.
בדוגמה הבאה, יוצרים אינדקס VenuesByCapacity שהמסד נתונים משתמש בו כדי למצוא את המקומות עם קיבולת של יותר מ-1,000. במקום לבדוק כל שורה, Spanner משתמש באינדקס כדי לאתר את השורות הרלוונטיות, וכך משפר את ביצועי השאילתה, במיוחד בטבלאות גדולות.
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
שימוש באינדקסים של חיפוש
אינדקסים של חיפוש שימושיים כשמבצעים שאילתות על מסמכי JSON שהם דינמיים או מגוונים. בניגוד לאינדקסים משניים, אפשר ליצור אינדקסים לחיפוש בכל מסמך JSON שמאוחסן בעמודת JSON. אינדקס החיפוש מותאם אוטומטית לשינויים במסמכי JSON, בין שורות שונות ולאורך זמן.
בדוגמה הבאה, יוצרים VenuesByVenueDetails אינדקס חיפוש שבו מסד הנתונים משתמש כדי למצוא את המקומות עם פרטים ספציפיים כמו גודל ושעות פעילות. במקום לבדוק כל שורה, Spanner משתמש באינדקס כדי לאתר את השורות הרלוונטיות, וכך משפר את ביצועי השאילתה, במיוחד בטבלאות גדולות.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
מידע נוסף זמין במאמר בנושא אינדקסים של חיפושים ב-JSON.
שאילתת נתוני JSON
בדוגמה הבאה מוצגות שאילתות על נתוני JSON באמצעות ה-CLI של gcloud וספריות לקוח של Spanner.
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="SELECT VenueId, VenueDetails FROM Venues \ WHERE JSON_VALUE(VenueDetails, '$.rating') = '9'"
C++
C++
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
C#
C#
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Go
Go
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Java
Java
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
Node.js
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
PHP
PHP
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Python
Python
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Ruby
Ruby
מידע על התקנת ספריית הלקוח של Spanner ושימוש בה מופיע במאמר ספריות הלקוח של Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
הגבלות
- אי אפשר להשתמש בעמודות JSON בסעיף
ORDER BY. - אי אפשר להשתמש בעמודות מסוג JSON כמפתחות ראשיים או כמפתחות באינדקסים משניים. מידע נוסף זמין במאמר בנושא אינדקס של נתוני JSON.
המאמרים הבאים
- סוג הנתונים JSON
- פונקציות JSON
- אופרטורים של JSON: