ביצועים גרועים באיסוף סטטיסטיקות על פרטישנים

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

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

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

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

סטטיסטיקות למחסני נתונים

מתוך iSeminar בנוגע ל-best practices של סטטיסטיקות למחסני נתונים:

בטבלאות בעלות Partition ישנם שלושה סוגים של סטטיסטיקות שניתן לאסוף על הטבלה:

  1. סטטיסטיקות גלובליות (Global/table statistics).
  2. סטטיסטקות ברמת פרטישן (Partition statistics).
  3. סטטיסטיקות ברמת סאב-פרטישן (Sub-partition statistics).

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

בדיחת SQL

בדיחת SQL (נלקחה מהבלוג של Tom Kyte):

A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

הבדיחה פורסמה במקור פה וגררה גל של בדיחות תוכניתן – חלקן טובות וחלקן טובות יותר.

בהחלט גיחי גיחי.. 😀

מציאת קבצים בין שני תאריכים (UNIX)

כדי למצוא קבצים בין שני תאריכים, ניתן להשתמש בשתי פקודות:  find ו-touch.

יצירת קבצים של תחילת התקופה וסיום התקופה באמצעות touch עם פרמטר t ותאריכי התחלה וסיום (בפורמט yyyyMMddhhmm):

touch -t 200801010000 start
touch -t 200901010000 end

ולאחר מכן שימוש ב-find כדי למצוא את הקבצים בין שני התאריכים:

find . -newer start ! -newer end -type f -ls

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

איך לשחרר שטח מ-tablespace לגודל המינימלי שלו

כאשר נוצר מצב שבו ב-tablespace מתפנה מקום רב, אורקל מאפשרים להקטין את ה-tablespace על ידי מעבר על ה-datafile-ים שלו וביצוע פקודות resize. הבעיה מתעוררת כאשר ישנו Tablespace עם מספר datafiles (ולפעמים זה יכול להגיע גם לעשרות) ואז העבודה של מציאת הסגמנט ש"חוסם" את שחרור השטח הפנוי הופך להיות משימה מהגהינום: גם הזיהוי בצורה ידנית של הבלוק התפוס העליון (HWM) וגם ה-resize שלפעמים לוקח זמן.

דרך אגב, אם יש tablespace  במצב read-only ובו אינדקסים של אובייקט שהוא לא ב-read-only, אז כאשר זורקים את הטבלה או ה-partition אז השטח ב-tablespace הזה לא משתחרר – הסגמנטים של האינדקס הופכים ל-temp segments ועד שלא נפתח את ה-tablespace ל-read write השטח לא יזוהה כפנוי.

כדי להתגבר על כל הבעיות האלה ניתן להשתמש בפרוצדורה הסופר שימושית הבאה.

המשך קריאה…

הדפסת ה-Alert Log מה-Startup האחרון

בשבוע האחרון לא יצא לי לכתוב בעיקר כי הייתי קצת חולה.

כדי לבדוק Alert log מאז העליה האחרונה של ה-DB (או בכלל, ניתן לקנפג את זה שיהיה מעלייה כלשהי של ה-DB) ניתן להשתמש בסקריפט הבא


#!/bin/csh
set Sid=$1

  set StartupRowNumber = `grep -n 'Starting up ORACLE RDBMS' /app01/oracle/admin/$Sid/bdump/alert_$Sid.log |cut -f 1 -d : |sort -nr |sed -n '1 p'`

  if "$StartupRowNumber" == "" then
     set StartupRowNumber = 1
  endif

  sed -n "${StartupRowNumber},$ p" /app01/oracle/admin/$Sid/bdump/alert_$Sid.log | less

קצת הסברים:

  1. השתמשתי ב-grep כדי למצוא את השורות שבהן יש את ההודעה על התחלת עלייה של ה-DB. השתמשתי באופרטור n- כדי שהוא יציג גם מספרי שורות.
  2. השתמשתי ב-cut כדי לחתוך את מספרי השורות בלבד: d- : מייצר עמודות לפי דלימיטר ":" ואילו f 1 -מציג רק את העמודה הראשונה.
  3. השתמשתי ב-sort כדי למיין בצורה הפוכה את המספרים – מסוף הקובץ להתחלה (nr-).
  4. הצגתי רק את השורה הראשונה (כלומר הפעם האחרונה שהייתה התחלה של העלאה). הסיבה שעשיתי את זה ולא tail היא שרציתי לשלוט במספר ה-startup-ים שאני אציג (בסוף לא ביצעתי).
  5. את התנאי שמתי למקרה שבלוג אין עלייה אחרונה של המערכת (לוג חתוך).
  6. הצגה של השורות מהשורה שמצאתי עד סוף הקובץ ביצעתי באמצעות sed.