פיצ’ר חדש: המרה של אינדקסים באורקל 12c

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

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

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

אז מה עושים?

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

  1. יש הבדל בין האינדקסים (לדוגמה – local ו-global או reverse לעומת לא).
  2. רק אינדקס אחד יכול להיות visible בכל נקודת זמן (השאר חייבים להיות invisible).

לדוגמה:

create index t1_i1 on T1 (employee_id) invisible;
create index t1_i2 on T1 (employee_id) reverse;

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

בנוסף, אם אנחנו רוצים לבדוק אם האינדקס החדש באמת יעזור לביצועים עוד לפני ביצוע התהליך, אנחנו יכולים להדליק את השימוש של ה-optimizer באינדקסים בלתי נראים על ידי שימוש ב- optimizer_use_invisible_indexes ולבדוק את זה לפני השינוי:

SQL> alter session set optimizer_use_invisible_indexes = true;
Session alered

SQL> explain plan for select employee_id, last_name from T1 where employee_id=100;
Execution Plan
----------------------------------------------------------
Plan hash value: 2242215931
------------------------------------------------------------------
| Id | Operation | Name |
------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| T1 |
|* 2 | INDEX RANGE SCAN | T1_I1 |
------------------------------------------------------------------

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

4 תגובות

Trackbacks & Pingbacks

  1. […] הקודם שלי כתבתי על יצירה במקביל של אינדקסים על אותן עמודות וציינתי בין היתר שניתן ליצור את האינדקסים רק אם משנים […]

  2. […] הקודם שלי כתבתי על יצירה במקביל של אינדקסים על אותן עמודות וציינתי בין היתר שניתן ליצור את האינדקסים רק אם משנים […]

  3. DB Oriented הגיב:

    […] Zohar Elkayam wrote about the new feature added in Oracle 12c that enables creation of multiple inde… (as long as they are different somehow [unique vs. non-unique, b*tree vs. bitmap, etc.] and only one of them is visible). […]

  4. DB Oriented הגיב:

    […] זהר כתב על היכולת שנוספה בגרסה 12C של אורקל ליצור מספר אי… (בתנאי שרק אחד האינדקסים visible בכל רגע נתון, ושהאינדקסים שונים בתכונה כלשהי זה מזה). […]

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

This site uses Akismet to reduce spam. Learn how your comment data is processed.