פוסטים

השהיית פקודה כאשר יש בעיית מקום ב-tablespace

נניח שיש לנו טרנזאקציה של פקודת insert ארוכה במיוחד (כזו שלוקחת שעות) ובאמצע ה-insert מרפי קופץ לביקור ונגמר המקום ב-tablespace של הטבלה. על פניו, אירוע מצער שאי אפשר להתגבר אליו אלא להתחיל מחדש, נכון? אז זהו שלא. ישנו פיצ'ר בשם Resumable Space Allocation שמאפשר לנו להכניס את ה-session להשהייה ולהמתין פרק זמן מוגדר כדי שנוכל לטפל בבעיה. ברגע שנטפל בבעיה, ה-session שלנו ימשיך כרגיל באופן אוטומטי, כאילו לא קרה שום דבר.

זה לא פיצ'ר חדש במיוחד – למעשה הוא קיים כבר מגרסה 9i – אבל הופתעתי היום לגלות שיש מפתחים (ויותר גרוע, DBA-ים) שפשוט לא מכירים את זה. בוא נראה איך אפשר להשתמש בכלי החשוב הזה.
המשך קריאה…

אגריגציה של מחרוזות

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

  • פונקציית STRAGG (של Tom Kyte) – שזמינה החל מגרסה 9i ומשתמשת בטכניקה של פונקציות משתמש סיכומיות. הפוקנציה הזו לא ידעה כל כך למיין את הרשומות בתוך הרשימה (בעיה שנפתרה לאחר מכן) והיו לה ביצועים לא כל טובים, אבל היא עשתה את העבודה. במאמר מוסגר נציין שהפונקציה הזו נוספה באופן מובנה לבסיס הנתונים בגרסה 11 אבל היא עדיין לא יודעת למיין או להשתמש במפרידים בין הערכים.
  • שימוש ב-CONNECT_BY_PATH ושליפות היררכיות שזמין מגרסה 9i – פתרון מורכב יחסית שלא היה טוב לכל שליפה.
  • שימוש בפונקציית model בעלת התחביר המזעזע והביצועים העוד יותר מזעזעים שזמינה מגרסה 10g.
  • שימוש ב-collect וקוד pl/sql שזמין מגרסה 10g גם כן.
  • עריכה: ידידי לאוניד הזכיר גם את הפונקציה wmsys.wm_concat. היא זמינה החל מגרסה 9i  אבל דורשת התקנה של ה-wmsys (workspace manager) – שמותקן כברירת מחדל רק בגרסאות מאוחרות יותר .

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

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

סיבוב טבלה על ציר

בעיה נפוצה שלא היה לה פתרון פשוט על ידי פקודה עד גרסה 11 היא סיבוב טבלה על ציר. בגרסה 11 ישנו פתרון יעיל ומהיר לבעיה על ידי צמד פקודות: Pivot ו-Unpivot שלא מצריך ניפנופי ידיים והסברים על מימוש שליפה שתבצע את זה.

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

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

טבלאות לקריאה בלבד

בגרסאות קודמות אם היינו רוצים לסמן טבלאות מסויימות לקריאה בלבד (read only) היינו מסירים את ההרשאות הכתיבה עליהן מכל המשתמשים ומקווים לטוב. למה מקווים לטוב? כי למרות הרצון הטוב, לא ניתן לבטל את ההרשאות של הבעלים (owner) של הטבלה ולכן הוא היה יכול להמשיך לשנות אותה (אפילו בטעות) למרות ההגדרה האפליקטיבית שביצענו.

החל מגרסה 11gR1 ניתן לנעול טבלה ולהגדיר אותה כ-read only ובכך למנוע גישת כתיבה אליה (כמובן שניתן להמשיך לקרוא ממנה).

המשך קריאה…

עמודות וירטואליות

בשבוע הבא אני מעביר הרצאה בנושא פיצ'רים חדשים בבסיס הנתונים של אורקל 11 עם דגש על דברים שיכולים לעניין מפתחים של data warehouse. הפוסטים הקרובים יעסקו בנושאים שאני אציג בהרצאה.

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

המשך קריאה…

שימוש ב-with כדי לפשט שליפות

לא הרבה יודעים, אבל התחביר של שליפות באורקל הוא דבר דינמי ומשתנה בין גרסאות. דוגמה טובה ומעניינית  היא שהחל מגרסה 9.2 אורקל הוסיפו את התאימות למה שהוגדר בתקן של SQL99 והדבר הביא להוספה של הפונקציונליות של תנאי with כאשר עושים select – דבר שיכול לעזור לנו מאוד בפישוט שאילתות.

נתחיל בשיעור היסטוריה קצר כדי להבין מה זה בעצם אומר. כידוע, SQL היא לא שפה ייחודית לאורקל – זו שפה עם סטנדרטים שנקבעים על ידי ANSI. הגרסה הראשונה של השפה שעברה סטנדרטיזציה הייתה בשנת 1986 עם הוצאת SQL86.  בשנת 92 יצאה גרסה נוספת (SQL92) שהייתה גם הגרסה הראשונה שאורקל ניסתה להתאים את עצמה אליה בגרסת Oracle 8. בשנת 1999 יצאה גרסה חדשה ומורחבת של השפה (SQL99) שכללה הרבה מהתכונות שהיו באורקל לפני זה (triggers, recursive sql ועוד) ואורקל התאימו את עצמם שוב למרבית התקנים החדשים בגרסה Oracle 9i (אם אני לא טועה זה היה בגרסה 9.2).

המשך קריאה…