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,...

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

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

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

השפעת האינדקס על חיפוש בטבלה

יום ראשון, ספטמבר 19, 2010

ניצור טבלה- בשלב ראשון ללא אינדקס: Use tempdb; Go If object_id('SalesOrderDetail') Is Not Null Drop Table SalesOrderDetail; Go Create Table SalesOrderDetail(SalesOrderID int, SalesOrderDetailID int, CarrierTrackingNumber nvarchar(25) NULL, ...

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

יום חמישי, אוגוסט 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 אחד של כל האינדקס, כפי שניתן לראות...