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

31/12/2013

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

אילוצים על טבלאות זמניות

27/12/2013

כידוע, ניתן ליצור טבלאות זמניות מקומיות (בעלות # אחת בתחילתן) בעלות שמות זהים ב-Sessions שונים בו זמנית: כל אחת מהן קיימת ב-Session שלה, בלתי נראית לאחרים, אינה מפריעה ואינה מופרעת..זאת ועוד- בעזרת SQL דינאמי ניתן ליצור מספר טבלאות זמניות בעלות אותו השם באותו Session, אך לא ארחיב כי זה לא הנושא כאן.ניצור טבלה כזו עם מפתח ואינדקס ב-Session אחד (כלומר- בחלון ב-SSMS): Create Table #T(ID Int Not Null, Txt Varchar(50));Go Alter Table #T Add Constraint PK_#T Primary Key(ID);Go Create Index Idx_#T_Txt On #T(Txt);Go כעת נפתח ב-SSMS חלון חדש (על ידי New Query), וניצור גם בו טבלה זמנית + מפתח + אינדקס,...
אין תגובות

תנאי הכרחי ותנאי מספיק

23/12/2013

מה בין תנאי הכרחי לתנאי מספיק ב-TSQL?כל אחד מהתנאים ב-Where הוא תנאי הכרחי: Select *From MyTblWhere A=1 And B=2 And C=3; כל אחד מהתנאים ב-Where הוא תנאי מספיק: Select *From MyTblWhere A=1 Or B=2 Or C=3; למשל- כדי להתקבל לאוניברסיטה יש להציג תעודת בגרות וגם להעבור בהצלחה מבחן פסיכומטרי. כל אחד משני התנאים הוא תנאי הכרחי (בלעדיו לא נתקבל) אך אינו...
תגיות: ,
5 תגובות

Filtered Statistics

21/12/2013

הכלי הזה התווסף בגרסה 2008 כמדומני, אבל איכשהו לא שמתי לב אליו עד כה..אתם בטח אומרים "מה אתה רציני? את *זה* אתה לא מכיר?", אבל עמוק בלב אתם מנסים להיזכר אם שמעתם פעם משהו על זה (כנראה שלא)..המצרכים- שתי טבלאות המתבססות על טבלת האובייקטים וטבלת העמודות: Use tempdb;Go If Object_ID('T_Columns','U') Is Not Null Drop Table T_Columns; Select *Into T_ColumnsFrom master.sys.columns; Alter Table T_Columns Add Constraint PK_T_Columns Primary Key Clustered(object_id, column_id);Go Select * From T_Columns; If Object_ID('T_Objects','U') Is Not Null Drop Table T_Objects; Select *Into T_ObjectsFrom master.sys.Objects; Alter ...
אין תגובות

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

19/12/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?

13/12/2013

כשמבצעים Select Count יש שתי אפשרויות: · ספירת שורות שאינן Null בעמודה מסויימת. · ספירת שורות בסט (ללא קשר לתכולתן). Select Count(*),Count(collation_name) From sys.columns; גם אם כל השורה תהייה Nulls, הפונקציה (*)Count תספור כמה שורות יש: Create Table #T(ID Int);  Insert Into #T Values(1),(Null),(Null),(2);  Select Count(*),Count(ID) From #T; גם כשמבצעים Join – ניתן לבצע ספירה של * או של עמודה בודדת; לא של שתי עמודות וגם לא של T.* למשל: Select Count(T.*) From #T T Inner Join sys.schemas S On T.ID=S.schema_id;
אין תגובות

בעיית Parameter Sniffing מדומה

11/12/2013

ניצור מ-sys.messages טבלה עם Clustered אינדקס לפי עמודה severity שאינה מאוזנת: בגרסה R2 יש 69839 שורות ב-severity=16 ו-55 שורות ב-severity=19. If Object_ID('T','U') Is Not Null Drop Table T; Select *Into TFrom sys.messages; Create Clustered Index Idx_T_language_id On T(severity);Go וכעת נשלוף בהתאם לשני הפילטרים הנ"ל: Select *From TWhere severity=16; Select *From TWhere severity=19; כפי שאפשר לראות – בשליפה הראשונה הוא יצר תוכנית שמתאימה למספר הנכון 69839 שורות,ובשליפה השניה שיכפל את הראשונה למרות שמספר השורות הוא פחות מאלפית. Parameter Sniffing, לא כך?שימו לב גם שהערכים אינם 16 או 19 (בצילום המסך) אלא הפרמטר @1.רווח והצלה יעמדו...
אין תגובות

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

05/12/2013

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

פעולות DML וטריגרים על Views

01/12/2013

ניצור טבלה סמלית לעריכת נסיונות: If Object_ID('T','U') Is Not Null Drop Table T;Create Table T(ID Int Identity Primary Key, Teur Varchar(10)); ניצור View "פשוט" וננסה להכניס לתוכו נתונים: If Object_ID('V1','V') Is Not Null Drop View V1;Go Create View V1 As Select * From T;Go Insert Into V1(Teur) Values('A');Go Select * From V1; תקין.ננסה עם View עם תנאי שאינו כולל את הערך המוכנס: If Object_ID('V2','V') Is Not Null Drop View V2;Go Create View V2 As Select Teur From T Where Id=0;Go Insert Into V2(Teur) Values('B');Go Select * From V2; הערך אמנם לא מוצג בשליפה, אבל הוא...
אין תגובות