sys.dm_db_index_usage_stats: האם יש שימוש לאינדקסים

יום שישי, אוגוסט 14, 2015

הפוסט הקודם שלי עסק בפקודות Insert לטבלה מאונדקסת, והראה את המחיר שלהם: הרווח ב-Select ידוע, אך יש לזכור שאנחנו משלמים על כך בכל פקודת Insert/Update/Delete, ויש לבחון שאיננו מחזיקים אינדקסים מיותרים שעולים לנו בתחזוקתם, אך אינני משתמשים בהם ומפיקים מהם תועלת.המקור למידע לגבי השימוש באינדקסים נמצא בטבלת המערכת המצויינת בכותרת. צריך כמובן לברר איזו טבלה עומדת מאחורי כל object_id, איזה אינדקס מאחורי כל index_id, מה המבנה של האינדקס וכו’; וכדי לעשות “לונג סטורי שורט”, להלן השליפה עם כל מה שצריך: Declare @TableName Varchar(200)='dbo.MyTbl';With Idx As(Select I.object_id, I.index_id,...

לצורך Group By מה יותר יעיל: Clustered Index או Non Clustered Index?

יום חמישי, דצמבר 19, 2013

כבר אקדים ואציין שהתשובה היא "תלוי"..ניצור שתי טבלאות זהות, לאחת ניצור Clustered Index ולשניה Non Clustered Index; שניהם עם אותן עמודות: If Object_ID('T_ClInd','U') Is Not Null Drop Table T_ClInd; Select *Into T_ClIndFrom sys.messages; Create Clustered Index Idx_T_ClInd On T_ClInd(message_id, language_id);Go If Object_ID('T_NClInd','U') Is Not Null Drop Table T_NClInd;Select *Into T_NClIndFrom sys.messages; Create NonClustered Index Idx_T_NClInd On T_NClInd(message_id, language_id);Go Group By פעם ראשונה: Select message_id, Count(language_id) CntFrom T_ClIndGroup By message_id; Select message_id, Count(language_id)...
אין תגובות

אינדקסים וספריית אוניברסיטת חיפה

יום שני, נובמבר 29, 2010

בדרך כלל כשאני מתבקש להסביר מהו אינדקס, אילו סוגי אינדקסים קיימים, למה הם משמשים ואילו אופציות קיימות בהם- אני פותח ב-"שערו נא בנפשכם ש.." ואז ממשיל את הטבלה לספריה או אולי לספר טלפונים או אפילו לתוכן עניינים של ספר או רשימת קניות התלויה על המקרר; והמאזין בטוח שהעגבניות ברשימת הקניות הן Clusterd Index, הספרנית הממושקפת מהספריה היא הסטטיסטיקה, ו-"כהן אבי" מספר הטלפונים הוא Index Scan.. בקיצור- לך תסביר מה המשל ומה הנמשל! אנסה אם כך להיצמד למשל המוצלח מכולם – הספריה – להדגים את מה שניתן להדגים, ולהסתייג במקומות בהם המשל אינו דומה לנמשל.. בימי חלדי...

פונקציות חלון: יתרונות וחסרונות

יום שלישי, אוקטובר 5, 2010

עד כה סברתי לתומי שפונקציות החלון הן לא רק שימושיות במובן זה שהן מאפשרות להגיע לתוצאות המבוקשות ללא משפטי SQL מורכבים ובלתי ניתנים לפיענוח, אלא שהן גם יעילות יותר: החבר'ה המצויינים ממיקרוסופט כתבו את הקוד הסודי שמשמש אותן, ולבטח עשו זאת בדרך היעילה ביותר האפשרית. למרה הפתעתי מתברר שהביצועים שלהם לא תמיד המשובחים ביותר, ולעיתים יש מקום לחשב שכר מצווה כנגד הפסדה. הדוגמאות שלהלן הן ברובן טכניות ואין מאחוריהן שום הגיון עיסקי, והן יעשו שימוש בטבלה AdventureWorks.Sales.SalesOrderDetail שיש בה מעל 120,000 שורות (כלומר- מספיק "בשר"), כאשר השאילתות הורצו על גרסת 2005. נתבונן בשתי השליפות הבאות וב-Execution Plans שלהן- הן מחזירות בדיוק...

מחיקת שורות ישנות מטבלאות גדולות

יום חמישי, אוגוסט 12, 2010

נדרשנו למחוק נתונים ישנים מטבלאות גדולות: הגדולה שבהם בת כ-650,000,000 והאחרות אולי קטנות יותר אבל יחד מצטברות לנפח אחסון גדול ומיותר. ניסינו בהתחלה בתמימותנו – לבצע 'Delete From MyTbl Where Taarih<='20091231 כלומר- למחוק את כל מה שמשנת 2009 ודרומה, אבל זה הסתיים בתקיעת השרת למשך שעות ארוכות וניפוח הלוג למימדים מפלצתיים; ולבסוף עצרנו את המחיקה. החלטנו לעשות זאת בשלבים- כתבנו פרוצדורה שמתחילה מהתאריך הקטן ביותר בטבלה, מוחקת בלולאה את 50,000 הרשומות הראשונות ממנו בכל איטרציה, ועוברת לתאריך הבא בתור: Create Procedure MyProc As Declare @D DateTime, @RC Integer; Select @D=(Select MIN(Taarih) From MyTbl), ...

Execution Plan: שליפה, פילטר ומיון בעזרת אינדקס

יום רביעי, יוני 23, 2010

נפתח בדוגמה- נציג את ה-Actual Execution Plan יל ידי Ctrl M ונריץ את הקוד הבא: Use AdventureWorks; Go Set Statistics IO On; Select ProductID From Production.TransactionHistoryArchive; Go בלשונית Messages נקבל את הפלט הבא פחות או יותר- (89253 row(s) affected) Table 'TransactionHistoryArchive'. Scan count 1, logical reads 124, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. בהרצה הראשונה יתכן ויהיו physical reads מכיוון שיש לקרוא את ה-Pages הרלוונטיים ל-Buffer, אך לאחר מכן הם יעלמו והקריאה תהיה רק מה-Buffer (מתבטא ב-Logical Reads). Scan count שווה 1 מכיוון שהתבצע Scan אחד של כל האינדקס, כפי שניתן לראות...

Execution Plan: ביצוע Join בין שתי טבלאות

יום שני, יוני 21, 2010

הבנת Execution Plans (להלן EP) זו משימה די בסיסית של כל מפתח או DBA. אישית- עד היום אני די מתקשה עם הנושא, ובדיונים בהם מוצגים EP אני מתרשם שאינני היחיד שידיעותיו לוקות בחסר. אנסה כתרגול לבחון EP במצבים שונים ולרדת לעומקם. ניצור שתי טבלאות נטולות אינדקסים – T1 עם 1000 המספרים השלמים 1..1000 (ועוד שדה טקסטואלי), ו-T2 עם 500 המספרים הזוגיים 2..1000 (ועוד שדה מספרי ושדה טקסטואלי) – פעם עם I=1 ופעם עם I=2 (כלומר- בכל טבלה יש 1000 שורות): If Object_Id('T2') Is Not Null Drop Table T2; Go If Object_Id('T1') Is Not Null Drop Table T1; Go With T As (Select 1 N, ...