תנודתיות של פונקציות

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

יש שלוש קטגוריות של תנודתיות, שדומות למושגים במערכות כמו PostgreSQL:

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

    • ABS

    • LENGTH

    • פונקציות לשינוי מחרוזות, כמו CONCAT ו-LOWER

    • פונקציות לעיצוב תאריך ושעה עם קלט מפורש

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

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

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

השלכות של תנודתיות

הקטגוריה של התנודתיות של פונקציה קובעת איפה אפשר להשתמש בה בסכימת מסד הנתונים ואיך מתבצעת אופטימיזציה של שאילתות שמכילות את הפונקציה:

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

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

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