הסבר על החיוב ב-Cloud Firestore

במסמך הזה מוסברים פרטי התמחור של Cloud Firestore.

אם אתם משלמים במטבע שאינו דולר ארה"ב, יחולו המחירים הרשומים במטבע שלכם במק"טים של Cloud Platform.

סקירה כללית על תמחור

כשמשתמשים ב-Cloud Firestore, מחויבים על:

  • מספר המסמכים שאתם קוראים, כותבים ומוחקים.
  • מספר רשומות האינדקס שנקראו כדי לענות על שאילתה. מידע נוסף על קריאות אינדקס
  • נפח האחסון שמסד הנתונים משתמש בו, כולל תקורה למטא-נתונים ולאינדקסים.
  • רוחב הפס של הרשת שאתם משתמשים בו.

השימוש באחסון וברוחב הפס מחושב ב-Gibibytes ‏ (GiB), כאשר 1GiB שווה ל-2‎30‎ בייטים. כל החיובים מצטברים מדי יום.

בקטעים הבאים מוסבר איך מתבצע החיוב על השימוש ב-Cloud Firestore.

מכסה חינמית

ב-Cloud Firestore יש מכסה בחינם שמאפשרת לכם להתחיל בלי לשלם. אם אתם צריכים מכסה גדולה יותר, אתם צריכים להפעיל את החיוב בפרויקט Google Cloud.

המכסות חלות על בסיס יומי ומתאפסות בסביבות חצות לפי שעון החוף המערבי.

בטבלה הבאה מפורטות המכסות החינמיות:

תוכנית בחינם מכסה
נתונים מאוחסנים ‫1GiB
קריאות של מסמכים ‫50,000 ביום
כתיבת מסמכים ‫20,000 ביום
מחיקות של מסמכים ‫20,000 ביום
העברת נתונים יוצאת ‫10GiB לחודש

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

  • מחיקות TTL
  • נתוני PITR
  • גיבוי הנתונים
  • פעולות שחזור
  • פעולות שכפול

למידע נוסף על החיוב של התכונות האלה, ראו תמחור האחסון.

תמחור לפי מיקום

כדי לראות את התמחור של פעולות קריאה, כתיבה, מחיקה ואחסון בכל מיקום של Cloud Firestore, עיינו במאמר התמחור של Google Cloud.

אם אתם משלמים במטבע שאינו דולר ארה"ב, יחולו המחירים הרשומים במטבע שלכם במק"טים של Cloud Platform.

המכסה החינמית חלה רק על מסד נתונים אחד בכל פרויקט

בכל פרויקט יכול להיות רק מסד נתונים אחד שעומד בדרישות למכסה בחינם.

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

מסד הנתונים הראשון שתיצרו (ללא קשר למזהה שלו) עומד בדרישות למכסה בחינם. אם תמחקו את מסד הנתונים הזה, מסד הנתונים הבא שתיצרו יהיה זכאי למכסה החינמית.

אין עלות נוספת על יצירה או מחיקה של מסדי נתונים. כל מסד נתונים נוסף יחויב לפי השימוש בו.

קריאה, כתיבה ומחיקה

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

החיובים על פעולות כתיבה ומחיקה הם פשוטים. לגבי כתיבה, כל פעולה של set או update נספרת ככתיבה אחת.

יש כמה דקויות שכדאי לזכור לגבי החיובים על פעולות קריאה. בקטעים הבאים מוסברים ההבדלים האלה בפירוט.

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

אתם מחויבים על פעולת קריאה אחת לכל אצווה של עד 1,000 רשומות אינדקס שנקראות על ידי שאילתה, למעט במקרים הבאים:

  • ב שאילתות חיפוש וקטורי של K-nearest neighbor, תחויבו בפעולת קריאה אחת על כל אצווה של עד 100 רשומות באינדקס וקטורי של kNN שנקראות על ידי השאילתה.

    לדוגמה, אם שאילתת החיפוש הווקטורי הבאה עם limit: 5 מחזירה 5 מסמכים וקוראת 1,550 רשומות באינדקס הווקטורי של kNN, תחויבו על 5 פעולות קריאה של המסמכים שהוחזרו ועל 16 פעולות קריאה של הרשומות באינדקס:

    // Requires single-field vector index
    const vectorQuery: VectorQuery = db.collection('cities').findNearest('embedding_field', FieldValue.vector([3.0, 1.0, 2.0]), {
      limit: 5,
      distanceMeasure: 'EUCLIDEAN'
    });
    
  • שאילתות שיש בהן עד שדה טווח אחד לא מחויבות על רשומות אינדקס שנקראו.

    לדוגמה, השאילתה הבאה מכילה שדה שוויון אחד (age) ושדה טווח אחד (start_date), ואין חיוב על רשומות האינדקס שנקראו:

    db.collection("employees").whereEqualTo("age", 35)
                              .whereGreaterThanOrEqualTo("start_date", new Date(2020, 1, 1))
    

    השאילתה הבאה מכילה שני שדות טווח (age ו-start_date) והחיוב הוא על קריאות של רשומות באינדקס:

    db.collection("employees").whereGreaterThanOrEqualTo("age", 35)
                              .whereGreaterThanOrEqualTo("start_date", new Date(2020, 1, 1))
    

    שדה שמופיע בסעיף order by נחשב לשדה טווח אם יש לפחות שדה טווח אחד נוסף בשאילתה. לכן, השאילתה הבאה מכילה שני שדות טווח (age ו-start_date) והחיוב הוא על קריאות של רשומות באינדקס:

    db.collection("employees").whereGreaterThanOrEqualTo("age", 35)
                              .orderBy("start_date")
    

    השדה __name__ תמיד נחשב לשדה טווח, גם אם משתמשים בו רק במסנן שוויון. לכן השאילתה הבאה מכילה שני שדות טווח (age ו-__name__) והחיוב הוא על קריאות של רשומות באינדקס:

    db.collection("employees").whereIn("__name__", Arrays.asList("/employees/Alice", "/employees/Bob"))
                              .orderBy("age")
    

שאילתות צבירה

בשאילתות צבירה כמו count(), ‏ sum() ו-avg(), החיוב הוא על רשומות האינדקס שנקראו על ידי השאילתה, כמו שמתואר למעלה. בשאילתות צבירה שקוראות 0 רשומות באינדקס, החיוב המינימלי הוא קריאה של מסמך אחד.

לדוגמה, פעולות count() שקוראות בין 0 ל-1,000 רשומות אינדקס מחויבות על קריאת מסמך אחת. על פעולת count() שקוראת 1,500 רשומות אינדקס, תחויבו על 2 קריאות של מסמכים.

כדי לקבל מידע נוסף על האינדקסים שבהם נעשה שימוש ועל רשומות האינדקס שנקראו, אפשר להשתמש ב-Query Explain.

האזנה לתוצאות השאילתה

Cloud Firestore מאפשר להאזין לתוצאות של שאילתה ולקבל עדכונים בזמן אמת כשתוצאות השאילתה משתנות.

כשמאזינים לתוצאות של שאילתה, מחויבים על קריאה בכל פעם שמסמך בקבוצת התוצאות נוסף או מתעדכן. אתם מחויבים על קריאה גם כשמסמך מוסר מקבוצת התוצאות כי הוא השתנה. (לעומת זאת, כשמסמך נמחק, לא מחויבים על קריאה).

החיוב על מאזינים בערכות ה-SDK לנייד ולאינטרנט תלוי גם בהפעלה של שמירת נתונים אופליין:

  • אם הפעלתם שמירת נתונים במצב אופליין והמאזין מנותק במשך יותר מ-30 דקות (לדוגמה, אם המשתמש עובר למצב אופליין), תחויבו על קריאת מסמכים ורשומות באינדקס כאילו שלחתם שאילתה חדשה לגמרי.

  • אם השמירה אופליין מושבתת, תחויבו על מסמכים ורשומות אינדקס שנקראו כאילו שלחתם שאילתה חדשה לגמרי בכל פעם שהמאזין מתנתק ומתחבר מחדש.

ניהול קבוצות גדולות של תוצאות

ב-Cloud Firestore יש כמה תכונות שעוזרות לנהל שאילתות שמחזירות מספר גדול של תוצאות:

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

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

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

שאילתות שהן לא קריאת מסמכים

בשאילתות שאינן קריאות של מסמכים, כמו בקשה לרשימה של מזהי אוספים, תחויבו על קריאה של מסמך אחד. אם כדי לאחזר את קבוצת התוצאות המלאה נדרשת יותר מבקשה אחת (לדוגמה, אם אתם משתמשים בחלוקה לדפים), תחויבו פעם אחת לכל בקשה.

חיוב מינימלי על שאילתות

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

Cloud Firestore Security Rules

בספריות לקוח לנייד ולאינטרנט, אם Cloud Firestore Security Rules משתמשים ב-exists(), ב-get() או ב-getAfter() כדי לקרוא מסמך אחד או יותר ממסד הנתונים, תחויבו על קריאות נוספות באופן הבא:

  • אתם מחויבים על פעולות קריאה שנדרשות כדי להעריך את Cloud Firestore Security Rules.

    לדוגמה, אם הכללים שלכם מתייחסים לשלושה מסמכים, אבל Cloud Firestore צריך לקרוא רק שניים מהם כדי להעריך את הכללים, תחויבו על שתי קריאות נוספות של המסמכים התלויים.

    אתם מחויבים רק על קריאה אחת לכל מסמך תלוי, גם אם הכללים שלכם מתייחסים למסמך הזה יותר מפעם אחת.

  • החיוב על הערכת הכללים מתבצע רק פעם אחת לכל בקשה.

    לכן, קריאה של כמה מסמכים יכולה לעלות פחות מקריאה של מסמכים אחד אחרי השני, כי קריאה של כמה מסמכים דורשת פחות בקשות.

  • כשמאזינים לתוצאות של שאילתה, החיוב על הערכת הכללים מתבצע בכל המקרים הבאים:

    • כשאתם מזינים את השאילתה.
    • בכל פעם שתוצאות השאילתה מתעדכנות.
    • בכל פעם שהמכשיר של המשתמש מתנתק מהאינטרנט ואז מתחבר שוב.
    • בכל פעם שאתם מעדכנים את הכללים.
    • בכל פעם שאתם מעדכנים את המסמכים התלויים בכללים שלכם.

נפח האחסון של מסד הנתונים

החיוב הוא על כמות הנתונים שמאוחסנים ב-Cloud Firestore, כולל תקורה של אחסון. התקורה כוללת מטא-נתונים, אינדקסים אוטומטיים ואינדקסים מורכבים.

כל מסמך שמאוחסן ב-Cloud Firestore צריך לכלול את המטא-נתונים הבאים:

  • מזהה המסמך, כולל מזהה האוסף ושם המסמך.
  • השם והערך של כל שדה. בגלל ש-Cloud Firestore הוא ללא סכימה, השם של כל שדה במסמך צריך להישמר עם ערך השדה.
  • כל אינדקס של שדה יחיד ואינדקס מורכב שמתייחסים למסמך. כל רשומה באינדקס מכילה את מזהה האוסף, מספר כלשהו של ערכי שדות (בהתאם להגדרת האינדקס) ואת שם המסמך.

עלויות האחסון הן ב-GiB לחודש ומחושבות מדי יום. Cloud Firestore מודד את גודל מסד הנתונים מדי יום. במהלך חודש, המערכת מחשבת את הממוצע של נקודות הדגימה האלה כדי לחשב את גודל האחסון של מסד הנתונים. הערך הממוצע הזה מוכפל במחיר היחידה של האחסון (GiB לחודש)

כאן מוסבר איך מחושב נפח האחסון של Cloud Firestore.

נתוני PITR

אם מפעילים PITR, מחויבים על אחסון נתוני ה-PITR. רוב הלקוחות יגלו שהעלות הכוללת של אחסון נתוני PITR דומה לעלות האחסון של מסד הנתונים.

עלויות האחסון של PITR הן ב-GiB לחודש, והן מחושבות מדי יום. ‫Cloud Firestore מודד את גודל מסד הנתונים מדי יום. במהלך חודש, המערכת מחשבת את הממוצע של נקודות הדגימה האלה כדי לחשב את גודל האחסון של מסד הנתונים. הערך הממוצע הזה מוכפל במחיר היחידה של PITR (חודש-GiB).

לדוגמה, אם הגודל הממוצע של מסד הנתונים במהלך חודש הוא 1GiB וה-PITR מופעל במשך כל החודש, אז גודל הנתונים של ה-PITR לחיוב הוא גם 1GiB.

חיוב מינימלי: יכול להיות שתחויבו בעלות של יום אחד של אחסון PITR, גם אם תשביתו את ה-PITR תוך יום אחד מההפעלה.

פעולות גיבוי ושחזור של נתונים

אם מפעילים גיבויים, מחויבים על האחסון של גיבויי מסד הנתונים. נפח האחסון של הגיבוי שווה לנפח האחסון של מסד הנתונים בזמן ביצוע הגיבוי.

עלויות האחסון של הגיבויים הן ב-GiB לחודש. במהלך חודש, מחושב גם מספר הימים הממוצע שבו נשמר כל גיבוי. העלות של כל גיבוי מחושבת לפי גודל האחסון של הגיבוי, כפול החלק היחסי של החודש שבו הגיבוי נשמר, כפול מחיר היחידה. למטרות חיוב, גבולות היום מוגדרים לפי אזור הזמן America/Los_Angeles.

כשמבצעים פעולת שחזור, Cloud Firestore מודד את גודל הגיבוי לפעולת השחזור. גודל הגיבוי מוכפל במחיר היחידה של פעולות השחזור (GiB).

הסבר על השאילתה

השימוש ב-Firestore Query Explain כרוך בעלויות.

כשמסבירים שאילתה באמצעות אפשרות ברירת המחדל, לא מתבצעות פעולות קריאה של אינדקס. לא משנה כמה השאילתה מורכבת, החיוב הוא על פעולת קריאה אחת.

כשמסבירים שאילתה באמצעות האפשרות analyze, מתבצעות פעולות של הוספה לאינדקס וקריאה, ולכן אתם מחויבים על השאילתה כרגיל. אין חיוב נוסף על פעולת ההסבר והניתוח, אלא רק החיוב הרגיל על השאילתה שמופעלת.

רוחב הפס של הרשת

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

‫Cloud Firestore מחשב את גודל התגובה על סמך פורמט של הודעה שעברה סריאליזציה. תקורה של פרוטוקול, כמו תקורה של SSL, לא נכללת בשימוש ברוחב הפס של הרשת. בקשות שנדחו על ידי Cloud Firestore Security Rules לא נספרות בשימוש ברוחב הפס של הרשת.

כדי לדעת כמה רוחב פס ניצלתם, אתם יכולים להשתמש במסוף Google Cloud כדי לייצא את נתוני החיוב לקובץ.

תמחור כללי של רשתות

בבקשות שמקורן ב-Google Cloud Platform (לדוגמה, מאפליקציה שפועלת ב-Google Compute Engine), החיוב מתבצע באופן הבא:

סוג תנועה מחיר
העברת נתונים נכנסת חינם
העברת נתונים בתוך אזור חינם
העברת נתונים בין אזורים באותו מיקום של מספר אזורים חינם
העברת נתונים בין אזורים בתוך ארה"ב (לכל GiB) ‫0.01$ (ה-10GiB הראשונים בכל חודש הם בחינם)
העברת נתונים בין אזורים, לא כולל תנועה בין אזורים בארה"ב תעריפי העברת נתונים באינטרנט יוצא ב-Google Cloud Platform

אם אתם משלמים במטבע שאינו דולר ארה"ב, יחולו המחירים הרשומים במטבע שלכם במק"טים של Cloud Platform.

בנוסף, ב-Cloud Firestore חלים חיובים נוספים על תעבורת נתונים לאינטרנט במקרים הבאים:

  • Google Cloud בקשות בין אזורים, לא כולל תנועה בין אזורים בארה"ב
  • בקשות מחוץ ל-Google Cloud (לדוגמה, מהמכשיר הנייד של המשתמש)

תעריפי תעבורת הנתונים לאינטרנט של Google Cloud

דוגמה לתמחור

כדי לראות איך נצברות עלויות החיוב של Cloud Firestore באפליקציה לדוגמה בעולם האמיתי, עיינו בדוגמה לחיוב ב-Cloud Firestore.

ניהול ההוצאות

כדי להימנע מחיובים לא צפויים, הגדירו תקציבים חודשיים והתראות במסוף Google Cloud.

כדי לעקוב אחרי השימוש ב-Cloud Firestore במסוף Firebase, עוברים אל הכרטיסייה Databases & Storage ‏ > Firestore ‏ > Usage. אתם יכולים להשתמש במרכז הבקרה הזה כדי לבדוק את השימוש שלכם בתקופות שונות.