בדף הזה מוסבר איך לבצע קריאות ב-Spanner מחוץ להקשר של טרנזקציות לקריאה בלבד ולקריאה וכתיבה. אם אחד מהמצבים הבאים רלוונטי, כדאי לעיין בדף עסקאות:
אם אתם צריכים לכתוב, בהתאם לערך של קריאה אחת או יותר, אתם צריכים לבצע את הקריאה כחלק מעסקת קריאה-כתיבה. מידע נוסף זמין במאמר בנושא עסקאות קריאה-כתיבה.
אם אתם מבצעים כמה קריאות שדורשות תצוגה עקבית של הנתונים, כדאי לבצע את הקריאות כחלק מעסקה לקריאה בלבד. מידע נוסף זמין במאמר בנושא עסקאות לקריאה בלבד.
סוגי קריאה
Spanner מאפשר לכם לקבוע את רמת העדכניות של הנתונים כשאתם קוראים נתונים, באמצעות שני סוגים של קריאות:
- קריאה חזקה היא קריאה בחותמת זמן נוכחית, ויש הבטחה שיוצגו בה כל הנתונים שנשמרו עד תחילת הקריאה. ב-Spanner, ברירת המחדל היא שימוש בקריאות חזקות כדי להציג בקשות קריאה.
- קריאה בעבר היא קריאה שמתבצעת בחותמת זמן שכבר חלפה. אם האפליקציה שלכם רגישה לזמן אחזור אבל סובלנית לנתונים לא עדכניים, קריאות לא עדכניות יכולות לשפר את הביצועים.
כדי לבחור את סוג הקריאה הרצוי, מגדירים חסימה של חותמת הזמן בבקשת הקריאה. כדאי להשתמש בשיטות המומלצות הבאות כשבוחרים חותמת זמן:
כדאי לבחור קריאות חזקות כשאפשר. זהו חותם הזמן שמוגדר כברירת מחדל לקריאות ב-Spanner, כולל עסקאות לקריאה בלבד. קריאות חזקות מבטיחות את ההשפעות של כל העסקאות שבוצעו לפני תחילת הפעולה, ללא קשר לרפליקה שמקבלת את הקריאה. לכן, קריאות חזקות מפשטות את קוד האפליקציה והופכות את האפליקציות לאמינות יותר. מידע נוסף על מאפייני העקביות של Spanner זמין במאמר TrueTime and External Consistency.
אפשרות נוספת היא להעניק לאזורים שאינם אזורים ראשיים, לאזורים עם הרשאות קריאה וכתיבה או לאזורים עם הרשאות קריאה בלבד את הסטטוס read lease region, כדי לצמצם את זמן האחזור של קריאה בעסקאות לקריאה בלבד שנדרש בהן מודל עקביות חזק. כדי לעשות את זה, משתמשים בהסכמי שכירות לקריאה ב-Spanner. אזורי חכירה לקריאה עוזרים למסד הנתונים להפחית את זמן האחזור של קריאה חזקה במקרים של מכונות בשני אזורים או במספר אזורים. עם זאת, פעולות כתיבה יחוו השהיה ארוכה יותר כשמשתמשים בהרשאת קריאה.
אם השהייה הופכת קריאות חזקות ללא מעשיות במצבים מסוימים, כדאי להשתמש בקריאות לא עדכניות (עדכניות מוגבלת או עדכניות מדויקת) כדי לשפר את הביצועים במקומות שבהם לא צריך שהקריאות יהיו עדכניות ככל האפשר. כמו שמתואר בדף שכפול, 15 שניות הוא ערך סביר של נתונים לא עדכניים לשימוש כדי להשיג ביצועים טובים.
קריאת נתונים באמצעות תפקיד במסד נתונים
אם אתם משתמשים בבקרת גישה ברמת גרנולריות גבוהה, אתם צריכים לבחור תפקיד במסד הנתונים כדי להריץ הצהרות ושאילתות של SQL, וכדי לבצע פעולות על שורות במסד הנתונים. התפקיד שבחרתם יישאר בתוקף לאורך כל הסשן, עד שתשנו אותו.
הוראות לביצוע קריאה באמצעות תפקיד במסד נתונים מופיעות במאמר גישה למסד נתונים עם בקרת גישה ברמת גרנולריות גבוהה.
שיטות קריאה יחידות
Spanner תומך בשיטות קריאה יחידות (כלומר, קריאה מחוץ להקשר של טרנזקציה) במסד נתונים עבור:
- ביצוע הקריאה כהצהרת שאילתת SQL או באמצעות API לקריאה של Spanner.
- ביצוע קריאה חזקה משורה אחת או מכמה שורות בטבלה.
- ביצוע קריאה בעבר משורה אחת או מכמה שורות בטבלה.
- קריאה משורה אחת או מכמה שורות באינדקס משני.
אם רוצים להפנות קריאות בודדות לרפליקה או לאזור ספציפיים בהגדרת מופע מרובה אזורים או בהגדרה אזורית בהתאמה אישית עם אזורים אופציונליים לקריאה בלבד, אפשר לעיין במאמר בנושא קריאות מופנות.
בקטעים הבאים מוסבר איך להשתמש בשיטות קריאה באמצעות ספריות לקוח של Spanner.
הפעלת שאילתה
בדוגמה הבאה מוצג איך להריץ הצהרת שאילתת SQL על מסד נתונים.
GoogleSQL
C++
משתמשים ב-ExecuteQuery() כדי להריץ הצהרת שאילתת SQL על מסד נתונים.
C#
אפשר להשתמש ב-ExecuteReaderAsync() כדי להריץ שאילתות במסד הנתונים.
Go
משתמשים ב-Client.Single().Query כדי להריץ שאילתות במסד הנתונים.
Java
משתמשים ב-ReadContext.executeQuery כדי להריץ שאילתות במסד הנתונים.
Node.js
משתמשים ב-Database.run כדי להריץ שאילתות במסד הנתונים.
PHP
משתמשים ב-Database::execute כדי להריץ שאילתות במסד הנתונים.
Python
משתמשים ב-Database.execute_sql כדי להריץ שאילתות במסד הנתונים.
Ruby
משתמשים ב-Client#execute כדי להריץ שאילתות במסד הנתונים.
כשיוצרים הצהרת SQL, כדאי לעיין במאמרים בנושא תחביר שאילתות ופונקציות ואופרטורים ב-SQL.
ביצוע קריאה חזקה
בדוגמה הבאה מוצג איך לבצע קריאה חזקה של אפס שורות או יותר ממסד נתונים.
GoogleSQL
C++
הקוד לקריאת נתונים זהה לדוגמה הקודמת של שאילתת Spanner על ידי הרצת שאילתת SQL.
C#
הקוד לקריאת נתונים זהה לדוגמה הקודמת של שאילתת Spanner על ידי הרצת שאילתת SQL.
Go
משתמשים ב-Client.Single().Read כדי לקרוא שורות ממסד הנתונים.
בדוגמה נעשה שימוש ב-AllKeys כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Java
משתמשים ב-ReadContext.read כדי לקרוא שורות ממסד הנתונים.
בדוגמה נעשה שימוש ב-KeySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Node.js
משתמשים ב-Table.read כדי לקרוא שורות ממסד הנתונים.
בדוגמה נעשה שימוש ב-keySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
PHP
משתמשים ב-Database::read כדי לקרוא שורות ממסד הנתונים.
בדוגמה נעשה שימוש ב-keySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Python
משתמשים ב-Database.read כדי לקרוא שורות ממסד הנתונים.
בדוגמה נעשה שימוש ב-KeySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Ruby
משתמשים ב-Client#read כדי לקרוא שורות ממסד הנתונים.
ביצוע קריאה בעבר
בדוגמת הקוד הבאה מוצגות דרכים לבצע קריאה בעבר של אפס שורות או יותר ממסד נתונים באמצעות חותמת זמן של דיוק מוחלט של נתונים. הוראות לביצוע קריאה של נתונים לא עדכניים באמצעות חותמת זמן של bounded-staleness מופיעות בהערה אחרי הקוד לדוגמה. מידע נוסף על הסוגים השונים של חותמות זמן זמין במאמר בנושא גבולות של חותמות זמן.
GoogleSQL
C++
כדי לבצע קריאה בעבר, משתמשים ב-ExecuteQuery() עם MakeReadOnlyTransaction() ו-Transaction::ReadOnlyOptions().
C#
משתמשים בשיטה BeginReadOnlyTransactionAsync ב-connection עם ערך TimestampBound.OfExactStaleness() שצוין כדי להריץ שאילתה במסד הנתונים.
Go
משתמשים ב-Client.ReadOnlyTransaction().WithTimestampBound() ומציינים ערך ExactStaleness כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של חוסר עדכניות.
בדוגמה נעשה שימוש ב-AllKeys כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Java
משתמשים בשיטה read של ReadContext עם TimestampBound.ofExactStaleness() מוגדר כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של הגדרת רמת עדכניות.
בדוגמה נעשה שימוש ב-KeySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Node.js
משתמשים באפשרות Table.read עם exactStaleness כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של נתונים לא עדכניים.
בדוגמה נעשה שימוש ב-keySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
PHP
משתמשים ב-Database::read עם ערך exactStaleness שצוין כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של חוסר עדכניות.
בדוגמה נעשה שימוש ב-keySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Python
משתמשים בשיטה read של Database snapshot עם ערך exact_staleness שצוין כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של חוסר עדכניות.
בדוגמה נעשה שימוש ב-KeySet כדי להגדיר אוסף של מפתחות או טווחי מפתחות לקריאה.
Ruby
משתמשים בשיטה read של תמונת מצב Client עם staleness ערך שצוין (בשניות) כדי לבצע קריאה של שורות ממסד הנתונים באמצעות חותמת זמן מדויקת של חוסר עדכניות.
ביצוע קריאה באמצעות אינדקס
בדוגמה הבאה אפשר לראות איך קוראים אפס שורות או יותר ממסד נתונים באמצעות אינדקס:
GoogleSQL
C++
משתמשים בפונקציה Read() כדי לבצע קריאה באמצעות אינדקס.
C#
כדי לקרוא נתונים באמצעות האינדקס, מריצים שאילתה שמציינת במפורש את האינדקס:
Go
משתמשים ב-Client.Single().ReadUsingIndex כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
Java
משתמשים ב-ReadContext.readUsingIndex כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
Node.js
משתמשים ב-Table.read ומציינים את האינדקס בשאילתה כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
PHP
משתמשים ב-Database::read ומציינים את האינדקס כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
Python
משתמשים ב-Database.read ומציינים את האינדקס כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
Ruby
משתמשים ב-Client#read ומציינים את האינדקס כדי לקרוא שורות ממסד הנתונים באמצעות אינדקס.
קריאת נתונים במקביל
כשמבצעים פעולות קריאה או שאילתה בכמות גדולה של נתונים מ-Spanner, אפשר להשתמש ב-PartitionQuery API כדי לקבל תוצאות מהר יותר. ה-API מחלק את השאילתה למנות, או למחיצות, באמצעות כמה מכונות כדי לאחזר את המחיצות במקביל. חשוב לזכור שהשימוש ב-PartitionQuery API גורם לזמן אחזור ארוך יותר, כי הוא מיועד רק לפעולות בכמות גדולה כמו ייצוא או סריקה של כל מסד הנתונים.
אפשר לבצע כל פעולת קריאה של API במקביל באמצעות ספריות הלקוח של Spanner. עם זאת, אפשר לחלק שאילתות SQL רק אם הן ניתנות לחלוקה. כדי ששאילתה תהיה ניתנת לחלוקה למחיצות, תוכנית השאילתה צריכה לעמוד באחד מהתנאים הבאים:
האופרטור הראשון בתוכנית להפעלת השאילתה הוא איחוד מבוזר, ותוכנית הפעלת השאילתה מכילה רק איחוד מבוזר אחד (לא כולל איחודים מבוזרים מקומיים). תוכנית השאילתה לא יכולה להכיל אופרטורים מבוזרים אחרים, כמו distributed cross apply.
אין אופרטורים מבוזרים בתוכנית השאילתה.
ממשק PartitionQuery API מריץ את השאילתות במצב אצווה. יכול להיות ש-Spanner יבחר תוכנית להרצת שאילתות שתאפשר חלוקה של השאילתות למחיצות בסיסיות, כשהן מורצות במצב אצווה. כתוצאה מכך, יכול להיות ש-PartitionQuery API ו-Spanner Studio ישתמשו בתוכניות שונות להרצת שאילתות עבור אותה שאילתה. יכול להיות שלא תהיה לכם אפשרות לקבל את תוכנית הביצוע של השאילתה שבה נעשה שימוש ב-PartitionQuery API ב-Spanner Studio.
בשביל שאילתות עם חלוקה למחיצות כמו זו, אפשר להפעיל את התכונה 'הגדלת נפח הנתונים ב-Spanner'. התכונה Data Boost מאפשרת להריץ שאילתות אנליטיות גדולות עם השפעה כמעט אפסית על עומסי העבודה הקיימים במופע Spanner שהוקצה. בדף הזה מופיעות דוגמאות קוד ב-C++, Go, Java, Node.js ו-Python שממחישות איך להפעיל את Data Boost.
מידע נוסף על Data Boost זמין במאמר סקירה כללית על Data Boost.
GoogleSQL
C++
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת טרנזקציית אצווה ב-Spanner.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
C#
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת טרנזקציית אצווה ב-Spanner.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
Go
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת לקוח ועסקה ב-Spanner.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
Java
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירה של לקוח Spanner batch ועסקה.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
Node.js
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת לקוח Spanner וחבילת בקשות.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
PHP
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת לקוח Spanner וחבילת בקשות.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
Python
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת לקוח Spanner ועסקת אצווה.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
Ruby
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת לקוח של Spanner batch.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.