שאלה באינדקסים

עייטן

New member
שאלה באינדקסים

נדמה לי מאד שבעבר קראתי על כך שאפשר לאלץ את האופטימזציה כל שישתמש באינדקס ספיציפי שאני רוצה ולא כפי שהוא מחליט. הדוגמא הבאה : טבלה בעלת אינדקס clustered על fldID ושאר האינדקסים הם non clustered. יש לי את השאילתה הבאה: select * from tbl1 where tbl1.DateR>=@FromDate יש לי אינדקס על DateR , אך אף פעם לא משתמש בו והולך תמיד על האינדקס fldID. יש לכם פתרונות כיצד אני מאלץ אותו כן להשתמש באינדקס הזה?
 

mobyboy

New member
נסה את זה

select * from tbl1 with (INDEX(DateR )) where tbl1.DateR>=@FromDate​
 
index hint צריך להיות מוצא אחרון

שימוש בindex hint אמור להיות המוצא האחרון, ולא ברירת המחדל. ישנם 2 בעיות עיקריות בשימוש בindex hint. בעיה ראשונה, היא שבניגוד לשמו (Hint), השימוש בindex hint "מכריח" את השרת להשתמש באינדקס, הרשום. במידה ושימוש באינדקס גורם לquery plan גרוע, השרת עדיין יעשה בו שימוש. בעיה אחרת היא שבמידה והאינדקס יבוטל, או שם האינדקס יישתנה, פקודת הselect תיכשל בגלל שהשרת ינסה למצוא את האינדקס שלא קיים. במקום להתחיל עם index hint, נסה קודם להבין למה השרת לא משתמש באינדקס. יכול להיות, שבאמת עדיף לא לבצע index seek בגלל מספר רב של רשומות שחוזרות או בגלל שהטבלה קטנה מידי. במידה והטבלה גדולה, ומספר הרשומות, שחוזרות הוא קטן, אז אולי שווה לעדכן את הסטטיסטיקות של הטבלה. בכל מקרה השימוש בindex hint אמור להיות אופציה אחרונה ומומלץ שיתבצע ע"י DBA ולא ע"י תוכניתן.
 
למעלה