Create & Drop Index

יום רביעי, אפריל 6, 2016

מה, זה לא צריך להיות Drop & Create? מוחקים אינדקס קיים, ויוצרים מחדש גרסה משופרת שלו, בדרך כלל עם תוספת של עמודה לאינדקס עצמו או לרשימת ה-Include..אז זהו שלא, וזה שייך לפינת ה”וואלה?” של השבוע, ובעברית - “איך לא חשבתי על זה קודם?”..פיני קרישר, ראש הצוות הבלתי נלאה, סיפר לי שקודם הוא עשה Drop לאינדקס, ואז תוך כדי כך שהאינדקס החדש נבנה – משימה כבדה בפני עצמה,  השרת התחיל לטחון Table Scans כי האינדקס לא היה קיים וה-Execution Plan השתנה לרעה, ה-CPU נסק אל על, ה-IO חגג, והשמחה הייתה רבה..בפעם הבאה ניצור קודם כל את האינדקס החדש עם שם...
תגיות: , ,
אין תגובות

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

להתנגש בקלן דלאני ולשרוד

יום שלישי, דצמבר 31, 2013

בחודש שעבר השתתפתי ב-MVP Summit (הכנס השנתי שמיקרוסופט מארגנת לכל ה-MVP-ים בסיאטל, ארה"ב). זה לא נושא הפוסט, אבל בין המכובדים ניתן היה למצוא (חוץ ממני..) גם את קלן דלאני, ופעם כשלא שמתי לב – התנגשתי בה..לו היינו שני כלי רכב- זה היה נגמר בנזקי פחחות קלים, אך מכיוון שמדובר בבשר ודם – הסתפקנו בהתנצלויות מנומסות: עמי לוין עדכן אותי שבתפוצות לא נהוג להגיב רטורית ב-"חמור- את לא רואה לאן אתה הולך?" אלא להתנצל גם כשלא אשמים..(סתאאאאם – גם בארץ הייתי מתנצל, ומי שלא מאמין – מוזמן להתנגש בי בזדון)בכל מקרה- נושא פוסט זה הוא מאמר של קלן דלאני בשם...
תגובה אחת

לצורך 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)...
אין תגובות

בניית אינדקסים על עמודה בעלת Foreign Key

יום רביעי, אוקטובר 2, 2013

כשמוגדר Foreign Key המציין יחס של אחת לרבים (1:N), רצוי ליצור אינדקסים על עמודות שנמצאות בצד הרבים. אינדקס בצד האחת בוודאי יש מכיוון שהעמודה שם אמורה להיות Foreign Key, ובתור שכזאת היא מאונדקסת. להמחשה ניצור שני עותקים של sys.languages ושני עותקים של sys.messages, כאשר עמודת language_id בשניה יש לה Foreign Key לעמודת המפתח lcid שבראשונה; ברם- בעותק הראשון של sys.messages לא ניצור אינדקס על language_id ובעותק השני כן: If Object_ID('T_Messages1','U') Is Not Null Drop Table...
אין תגובות

שליפת "דפים" מטבלה תוך שימוש באינדקס רגיל

יום שבת, פברואר 16, 2013

בגרסאות 2005 – 2008R2 שליפה של דפים, למשל כמקובל בדפי אינטרנט שמחזירים חלק מהתוצאות, הייתה יכולה להיעשות באמצעות Row_Number: ממספרים את השורות בסט, ובכל פעם מחזירים "מֵאִייָה" אחרת. אם יש אינדקס על העמודה לפיה התוצאות ממויינות – אזי מה טוב, ניתן לעשות שימוש בו: Use tempdb; Go   If Object_ID('T_Messages','U') Is Not Null Drop Table T_Messages;   Select * Into T_Messages From sys.messages;   Create Index Idx_T_Messages...
תגיות: , , ,
תגובה אחת

מחולל סקריפטים של אינדקסים

יום חמישי, מאי 17, 2012

קצת קשה לקבל פקודות ליצירת טבלאות או אינדקסים: כל עוד מדובר בפרוצדורות, פונקציות, טריגרים, ו-Views – ניתן לקבל את הקוד המלא בקלות; אך בכל מה שקשור לטבלאות ואינדקסים – המידע רובו זמין בטבלאות המערכת, אך את פקודות ה-Create יש ליצור לבד באמצעות קוד; וזו גם משימה מסובכת וגם סיזיפית מכיוון שבכל גרסה מתווספות אופציות חדשות ויש לעדכן את הקוד. לאחרונה התקנתי את SQL Search של Red Gate – תוסף חינמי שאני ממליץ עליו ושמאפשר לחפש בקלות מחרוזות בקודים ובאובייקטים של המערכת (לא בתוכן של הטבלאות!). אם הכלי מצא את המחרוזת בפרוצדורה – הוא מציג אותה בתחתית...
תגיות: , , , ,
אין תגובות

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

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

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

שיפור ביצועי שאילתות על ידי שימוש ב-Group By במקום ב-Join / Exists

יום ראשון, נובמבר 21, 2010

משימה סבוכה עמה התמודדתי לאחרונה: יש טבלה הכוללת סיכומים בפירוט יומי לחשבונות בנק שונים: סה"כ תנועות זכות, סה"כ תנועות חובה, ויתרת סגירה; כל זה כאמור- לגבי כל חשבון לגבי כל יום במהלך השנים האחרונות. טבלה די גדולה. בטבלה יש למצוא את כל החשבונות הרדומים- אלו שבשנה האחרונה לא היו בהם תנועות אבל לפני כן, ולציין מה תאריך התנועה האחרון (אי שם לפני למעלה משנה). שפת SQL היא שפה די אינטואיטיבית למי שמתרגל אליה מכיוון שזו שפה דקלרטיבית ולא פרוצדוראלית, ולעיתים פקודת ה-SQL נראית כמעט כמו הניסוח המילולי של הדרישה שלנו, או לחילופין- הדרישה יכולה להיות מתורגמת די...
אין תגובות