Filtered Indexes

15/02/2014

אין תגובות

האופציה של Filtered Indexes התווספה בגרסת 2008,
לטעמי יש לה מספר שימושים מעניינים שכדאי לקחת בחשבון,
למרות שאולי יש כאלה שרואים בהם עוד feature מאלו שמיקרוסופט ממטירה עלינו ושנועדו לשמש תוכן לפוסטים ולהרצאות בכנסים מקצועיים בהם ממציאים כל מיני תסריטים שנועדו (במקרה..) בדיוק עבורם. כלומר- שומע לו DBA פלוני הרצאה מלומדת בנושא ותוהה כיצד להשתמש בזה: אולי ליצור אינדקס כזה על טבלת המכירות כי מנהל המכירות מאוד רוצה לקבל דיווח על המכירות של המוצר החדש שהושק לפני חודש? אולי על תאריכי הלידה של העובדים כדי לדעת מי חוגג ומתי? כנראה שלא..
הפוסט הזה אינו טכני, ואנסה לסקור בקצרה לאילו מקרים האינדקס הזה נועד, לדעתי.
בגדול האינדקס נועד לטפל באוכלוסיה מיוחדת בטבלה שנבדלת מהשאר, כלומר- לתמוך בחלוקה לאלו ששייכים ולאלו שלא. למשל- אין הגיון רב ב"לפנק" את תושבי ירושלים ב-Filtered  Index על טבלת העובדים שיאפשר למצוא את כל אלו שגרים שם: החלוקה ל-"כן גרים בירושלים" ו-"לא גרים בירושלים" היא אולי נכונה לוגית, אך לא נכונה מהותית, מכיוון שהעובדים מתחלקים לתושבי ירושלים או תל אביב או עין כמונים, ובדיוק לשם כך יש אינדקס רגיל (לא מפולטר) שמאפשר להגיע לכל קבוצה ולא רק לאחת.
אם כך- לאילו מקרים למשל Filtered Indexes נועד או לפחות יש לשקול את השימוש בן?

  • טבלת Slowly Changing Dimension, כשרוצים לייחד את השורות הפעילות. ניתן לזהות אותן לפי תאריך סיום ריק או עמודה בוליאנית המציינת במפורש אילו שורות הן הפעילות, ולפי זה לפלטר.
  • בחברה בינלאומית שיש לה משרדים בישראל יש לערוך חישוב מס שונה לעובדים אזרחי ישראל.
  • יש מערכת מלאי היררכית עם עצי מוצר, ולצרכים שונים יש להבחין בין מלאי חו"ג (חומרי גלם) שנמצא בתחתית עץ המוצר ואין שום היררכיה מתחתיו, מלאי תוצ"ג (תוצרת גמורה) שנמצאת בראש עץ המוצר, ומלאי בתהליך שכולל את כל השאר. השאלה איך לזהות כל סוג מלאי זו שאלה כלל לא פשוטה, אך משנצאה הדרך – יש לשקול יצירת Filtered  Indexמתאים.
  • טבלת לוג או Fact Table בה שולפים בדרך כלל שורות מהשנה השוטפת. פתרון אפשרי יכול להיות שימוש ב-Partitions, אך גם Filtered Index מתאים אם כי יש לעדכן אחת לשנה.
  • הבנק מחוייב לדווח על עסקאות במזומן בסכומים העולים על 50,000 ש"ח. לצורך כך ניתן ליצור Filtered Index  מתאים (בדרך כלל אין אינדקסים על סכומים כספיים והם נכללים לכל היותר ב-Include).

תת נושא הוא היכולת ליצור Unique Filtered Index, כלומר – אינדקס יחודי רק על חלק מהשורות בטבלה, בעיקר כשרוצים לפלטר Nulls. למשל:

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

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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *