אפטימיזציה לבעיית Top

יום שישי, יולי 25, 2014

נתונה לנו בעייה פחות או יותר כזו: יש למצוא את 30 המכירות הראשונות היום של פריטים X,Y,Z;או אולי את 10 הקפיצות לרוחק הטובות ביותר של הספורטאיות A,B,C,D,E וכו’.לא מדובר ב-30 המכירות הראשונות של כל אחד מהפריטים (90 בסה”כ), וגם לא ב-10 המכירות הראשונות של כל אחד (שיסתכמו בסופו של דבר ל-30); אלא ב-30 של כולם ביחד ללא כל התחייבות לחלוקה הפנימית. ניצןר לשם כך טבלה להדגמה המתבססת על טבלת sys.messages, נוסיף לה טבלת עזר עם רשימת language_id וננסה לשלוף את 10 ה-message_id הראשונים שלהם. נתחיל מהטבלאות: Select *Into #T_MessagesFrom ...
אין תגובות

Lookup לטבלה: Heap\Clustered Index

יום חמישי, מרץ 20, 2014

כידוע Clustered Index אינו אלא טבלה (ממויינת פיזית אך עדיין – טבלה), יש לו יתרונות מסויימים, אולי גם כמה חסרונות, לרוב ממליצים על Clustered Index בכל טבלה, אך יש בוודאי גם חולקים על כך, יש לכך חסרונות מסויימים בהכנסת הנתונים אך יתרונות בשליפתם..יתרונות בשליפתם? כן: אם ניתן להגיע לנתונים על ידי Seek (מה שלא ניתן ב-Heap) זה בוודאי יתרון, ואם לא ויש לעשות Scan – אין הבדל בינהם; כך שלהפסיד – לא נפסיד.האומנם? התחלתי לקרוא את המאמר  Clustered Indexes vs. Heaps ומה הופתעתי לגלות שזה לא תמיד כך: נניח שיש אינדקס על עמודה מסויימת והמערכת משתמשת בה כדי לשלוף...
2 תגובות

חפיפה בין אינדקסים

יום ראשון, פברואר 16, 2014

נתקלתי פעם במקרה הבא- טבלה שהוגדרו לה שני אינדקסים: Primary Key & Clusterd Index על עמודות Col1, Col2, Col3. Unique Index על עמודות Col1, Col2. כבר במבט ראשון אפשר לראות בעייה בסיסית – אם כל צירוף של Col1, Col2 הוא יחודי, מדוע המפתח כולל גם את עמודה Col3?זה לא נכון, מי שינסה להכניס לטבלה את הצירופים 1,1,2ו-1,1,3 יקבל הודעת שגיאה בגלל האינדקס השני (למרות שלפי הגדרת המפתח שני הצירופים נראים תקינים), ומי שיצור Foreign Key לטבלה – יאלץ לכלול בה עמודה מיותרת ללא צורך. יתכן ש"כוונת המשורר" הייתה שהמפתח הוא Col1,Col2 אבל הוא רצה ליצור Clustered Index שיכלול...
אין תגובות

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

יום שלישי, דצמבר 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)...
אין תגובות

שימוש באינדקסים בעת ביצוע Count

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

איזה מידע מכיל NonClustered Index? נושא די בסיסי והתשובה די ברורה: אינדקס "רגיל" מכיל את נתוני העמודה או העמודות עליהן הוא נוצר, קישור למיקום הפיזי של כל שורה בו לשורה המתאימה בטבלה עצמה, ואם החכמנו והתחכמנו ויצרנו Covered Index – הוא כולל גם אותן עמודות הכלולות בו, אם כי ללא הפונקציונליות של חיפוש / אגרגציה / מיון וכו' שהאינדקס מאפשר לנו.כך גם אני חשבתי וזה די נכון, עד שהתברר לי להפתעתי שזה לא לגמרי כך. במה דברים אמורים?נתחיל מהברור מאליו- ניצור טבלה מטבלת המערכת sys.messages, וניצור אינדקס רגיל על אחת העמודות (message_id): Use tempdb;Go If Object_ID('T_Messages','U') Is Not Null...
אין תגובות

כיצד מתבצע Clustered Index Scan?

יום שישי, ספטמבר 20, 2013

ניצור טבלה עם Clustered Index, נמלא אותה בנתונים המוכנסים אקראית, ונשלוף אותם ללא מיון: Use tempdb; Go   If Object_ID('T','U') Is Not Null Drop Table T; Create Table T(I Int Not Null, S Varchar(Max) Null); Go   Alter Table T Add Constraint PK_T1 Primary Key Clustered (I); ...
2 תגובות

Policy Management

יום שבת, אוגוסט 10, 2013

כלי מגרסת 2008 שנועד לעקוב ולאכוף מדיניות, למשל- של שמות לטבלאות, הגדרות של דטבייסים או לוגינים ועוד. מכיוון שרק שמעתי על זה עד כה, החלטתי ללכלך קצת את הידיים ולראות מה הועילו חכמי מיקרוסופט בתקנתם. בהתחלה חשבתי לנסות ולאכוף בעזרת הכלי הזה מדיניות המחייבת יצירת Primary Keys לכל הטבלאות, אלא שאופציה זו אינה קיימת, ולכן הסתפקתי בחיוב יצירת Clustered Index. מגרש המשחקים נמצא מתחת ל-Management: כדי ליצור מדיניות המחייבת יצירת Clustered Indexes לכל הטבלאות בדטבייס MyDB יש ליצור שני תנאים (Conditions): אחד לגבי הדטבייס ואחד לגבי...
אין תגובות

Indexed Views וכמה Clustered Indexes ניתן ליצור על טבלה?

יום רביעי, פברואר 22, 2012

מהם Indexed Views? כיצד יוצרים אותם? מה התועלת בהם? אילו יתרונות, מגבלות, חסרונות וחלופות יש להם? ולבסוף- האם ניתן ליצור יותר מ-Clustered Index אחד על טבלה? (ספויילר: התשובה היא "לא, אבל..") מגרסת 2005 יש אפשרות ליצור אינדקסים על Views, או ליתר דיוק- ליצור Views כך שיהיה ניתן ליצור עליהם אינדקסים. ניצור לצורך ההדגמה טבלה, ניצור עליה Clustered Index, ניצור View על הטבלה, וניצור גם עליו Clustered Index אבל שונה: Use tempdb; Go   ...

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

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

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