פוסטים

כמה מילים על bind peeking ואיך למחוק Execution Plan מה-Library Cache

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

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

אחד הדברים הקשים ביותר לכוונון בעיני זה שליפות שלפעמים עובדות מהר ולפעמים לא ובתת הקטגוריה הזו, שליפות שמתנהגות ככה אבל לכולן יש את אותו ה-SQL ID ואותו Execution Plan (באותה סביבה, כמובן). איך דבר כזה יכול לקרות? לדוגמה אם משתמשים ב-Bind Variables אז התוכנית של השליפה מתוכננת על ידי ה-Optimizer פעם אחת וכל השליפות שבאות אחריה עושות soft parse וחוסכות לעצמן את הצורך ב-parse מיותר.
כל זה טוב ויפה אבל איך האופטימייזר יודע להעריך כמויות רשומות ותוכנית יעילה? בגרסה 9i נוספה תכונה מעניינת: Bind Peeking. האופטימייזר שנתקל בשליפה עם bind variables בפעם הראשונה “מציץ” לתוך המשתנים האלה, רואה איזה ערכים יש שם ומשתמש בהם כדי לקבוע תוכנית פעולה לשליפה שלנו.

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

רגע, רגע, מה?!
המשך קריאה…