בדף הזה מוסבר איך לבצע קריאות ב-Spanner מחוץ להקשר של טרנזקציות לקריאה בלבד ולקריאה וכתיבה. אם אחד מהמקרים הבאים מתקיים, כדאי לעיין בדף עסקאות:
אם אתם צריכים לכתוב, בהתאם לערך של קריאה אחת או יותר, אתם צריכים לבצע את הקריאה כחלק מעסקת קריאה-כתיבה. מידע נוסף זמין במאמר בנושא עסקאות קריאה-כתיבה.
אם אתם מבצעים כמה קריאות שדורשות תצוגה עקבית של הנתונים, כדאי לבצע את הקריאות כחלק מעסקה לקריאה בלבד. מידע נוסף זמין במאמר בנושא עסקאות לקריאה בלבד.
סוגי קריאה
Spanner מאפשר לכם לקבוע את רמת העדכניות של הנתונים כשאתם קוראים נתונים, באמצעות שני סוגים של קריאות:
- קריאה חזקה היא קריאה בסימן זמן נוכחי, ויש הבטחה שהיא תראה את כל הנתונים שנשמרו עד תחילת הקריאה. ב-Spanner, ברירת המחדל היא שימוש בקריאות חזקות כדי להציג בקשות קריאה.
- קריאה לא עדכנית היא קריאה שמתבצעת בחותמת זמן שכבר חלפה. אם האפליקציה שלכם רגישה לזמן האחזור אבל יכולה להתמודד עם נתונים לא עדכניים, קריאות לא עדכניות יכולות לשפר את הביצועים.
כדי לבחור את סוג הקריאה הרצוי, מגדירים חסימה של חותמת הזמן בבקשת הקריאה. כדאי לפעול לפי השיטות המומלצות הבאות כשבוחרים חותמת זמן:
כדאי לבחור קריאות חזקות כשהדבר אפשרי. זהו חותם הזמן שמוגדר כברירת מחדל לקריאות ב-Spanner, כולל עסקאות לקריאה בלבד. קריאות חזקות מבטיחות את ההשפעות של כל העסקאות שבוצעו לפני תחילת הפעולה, ללא קשר לשכפול שמקבל את הקריאה. לכן, קריאות חזקות מפשטות את קוד האפליקציה והופכות את האפליקציות לאמינות יותר. מידע נוסף על מאפייני העקביות של Spanner זמין במאמר TrueTime and External Consistency.
אופציונלית, כדי לצמצם את זמן האחזור של קריאה לעסקאות לקריאה בלבד שדורשות מודל עקביות חזק, אפשר להעניק לאזורים שאינם אזורים ראשיים, לאזורים עם הרשאת קריאה וכתיבה או לאזורים עם הרשאת קריאה בלבד את הסטטוס read lease region. כדי לעשות את זה, משתמשים בהסכמי שכירות לקריאה ב-Spanner. אזורים להקצאת זמן קצר לקריאה עוזרים למסד הנתונים שלכם להפחית את זמן האחזור של קריאה חזקה במופעים של שני אזורים או של מספר אזורים. עם זאת, פעולות כתיבה יחוו השהיה גבוהה יותר כשמשתמשים בהרשאת קריאה.
אם השהייה הופכת קריאות חזקות ללא מעשיות במצבים מסוימים, כדאי להשתמש בקריאות לא עדכניות (bounded-staleness או exact-staleness) כדי לשפר את הביצועים במקומות שבהם לא צריך שהקריאות יהיו עדכניות ככל האפשר. כפי שמתואר בדף שכפול, 15 שניות הוא ערך סביר של נתונים לא עדכניים לשימוש כדי להשיג ביצועים טובים.
קריאת נתונים באמצעות תפקיד במסד נתונים
אם אתם משתמשים בבקרת גישה ברמת דיוק גבוהה, אתם צריכים לבחור תפקיד במסד הנתונים כדי להריץ שאילתות והצהרות SQL, וכדי לבצע פעולות על שורות במסד הנתונים. התפקיד שבחרתם יישאר לאורך כל הסשן, עד שתשנו אותו.
במאמר גישה למסד נתונים עם בקרת גישה ברמת גרנולריות גבוהה מוסבר איך לבצע קריאה באמצעות תפקיד במסד נתונים.
שיטות קריאה יחידות
Spanner תומך בשיטות קריאה יחידות (כלומר, קריאה מחוץ להקשר של טרנזקציה) במסד נתונים עבור:
- ביצוע הקריאה כהצהרת שאילתת SQL או באמצעות API לקריאה של Spanner.
- ביצוע קריאה חזקה משורה אחת או מכמה שורות בטבלה.
- ביצוע קריאה לא עדכנית משורה אחת או מכמה שורות בטבלה.
- קריאה משורה אחת או מכמה שורות באינדקס משני.
אם אתם רוצים להפנות קריאות בודדות לרפליקה או לאזור ספציפיים במסגרת הגדרת מופע מרובה אזורים או הגדרה אזורית בהתאמה אישית עם אזורים אופציונליים לקריאה בלבד, כדאי לעיין במאמר בנושא קריאות מופנות.
בקטעים הבאים מוסבר איך להשתמש בשיטות קריאה באמצעות ספריות לקוח של Spanner.
הפעלת שאילתה
בדוגמה הבאה מוצג איך להריץ הצהרת שאילתת SQL על מסד נתונים.
GoogleSQL
C++
משתמשים ב-ExecuteQuery() כדי להריץ הצהרת שאילתת SQL על מסד נתונים.
C#
אפשר להשתמש ב-ExecuteReaderAsync() כדי להריץ שאילתות במסד הנתונים.
המשך
אפשר להשתמש ב-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.
המשך
משתמשים ב-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() שצוין כדי להריץ שאילתה במסד הנתונים.
המשך
משתמשים ב-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#
כדי לקרוא נתונים באמצעות האינדקס, מריצים שאילתה שמציינת במפורש את האינדקס:
המשך
משתמשים ב-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 union, ותוכנית הביצוע של השאילתה מכילה רק distributed union אחד (לא כולל Local Distribution Unions). תוכנית השאילתה לא יכולה להכיל אופרטורים מבוזרים אחרים, כמו distributed cross apply.
אין אופרטורים מבוזרים בתוכנית השאילתה.
PartitionQuery API מריץ את השאילתות במצב אצווה. יכול להיות ש-Spanner יבחר תוכנית להרצת שאילתות שתאפשר חלוקה של השאילתות למחיצות בסיסיות, כשהן יופעלו במצב אצווה. כתוצאה מכך, יכול להיות ש-PartitionQuery API ו-Spanner Studio ישתמשו בתוכניות שונות להרצת שאילתות עבור אותה שאילתה. יכול להיות שלא תהיה לכם אפשרות לקבל את תוכנית הביצוע של השאילתה שבה נעשה שימוש ב-PartitionQuery API ב-Spanner Studio.
בשביל שאילתות עם חלוקה למחיצות כמו זו, אפשר להפעיל את Spanner Data Boost. התכונה Data Boost מאפשרת להריץ שאילתות אנליטיות גדולות עם השפעה כמעט אפסית על עומסי העבודה הקיימים במופע Spanner שהוקצה. בדף הזה מוצגות דוגמאות קוד ב-C++, Go, Java, Node.js ו-Python שממחישות איך להפעיל את Data Boost.
מידע נוסף על Data Boost זמין במאמר סקירה כללית על Data Boost.
GoogleSQL
C++
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת טרנזקציה באצווה ב-Spanner.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
C#
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת SQL של הטבלה Singers ומבצעת את השאילתה על כל מחיצה באמצעות השלבים הבאים:
- יצירת טרנזקציה באצווה ב-Spanner.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה להפיץ את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.
המשך
בדוגמה הזו, המערכת מאחזרת מחיצות של שאילתת 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.
- יצירת מחיצות לשאילתה, כדי שאפשר יהיה לחלק את המחיצות לכמה עובדים.
- שליפת תוצאות השאילתה לכל מחיצה.