Semi Join

יום רביעי, אפריל 8, 2015

Semi Join (לרוב – Left Semi Join) הוא אופרטור לוגי בו לכל שורה מצד אחד בודקים אם יש התאמות בצד השני. משהו בסגנון של- Select *From AWhere Exists (Select * From B Where B.ID=A.ID); Select *From AWhere ID...
תגיות: , ,
אין תגובות

האופרטור In / Not In: חלופות, וביצועים

יום רביעי, אוקטובר 31, 2012

כשהייתי בראשית דרכי ב-SQL Server, שמעתי באחד הכנסים ש"בדקו ומצאו" שהשימוש ב-Inner Join מעט יותר יעיל מאשר השימוש ב-In. אינני זוכר בוודאות ממי שמעתי את זה, אך עובדה שבמשך שנים התייחסתי לכך כאל תורה מסיני, ואף ציטטתי זאת בידענות פה ושם. לאחרונה כשנזכרתי בכך, קמטתי את מצחי ותהיתי האמנם.. דווקא הנסיון והידע שצברתי מאז הובילו אותי לחשוב כיום שאולי דווקא In יעיל יותר: בניגוד ל-Join בו לכל שורה מצד ה-From יש למצוא את כל ההתאמות בצד ה-Join, ב-In יש למצוא רק את ההתאמה הראשונה.. ואם כבר- אז מה עם השימוש ב-Exists? האם מדובר רק ב-In משופר או...
תגיות: , , , , , ,
אין תגובות

השימושים השונים ב-Cross Apply (וב-Outer Apply)

יום ראשון, מרץ 4, 2012

Cross Aplly הוא חלופה משודרגת של Inner Join ולו שימושים מעניינים שלא כולם מוכרים. 1. בתור שכזה ניתן לעשות איתו כל מה שניתן לעשות עם Inner Join ויותר מזה. רוצה לומר שלו נקלע לאי בודד ונוכל לקחת איתנו לשם רק מספר בודד של פקודת SQL – נעדיף לארוז באמתחתנו את ה-Apply ולהשאיר את ה-Join בבית... שתי השליפות הבאות מבצעות אותו הדבר, לשתיהן פלט זהה, וגם Execution Plan זהה: Use AdventureWorks; Go   Select S.name+'.'+O.name FullName ...
תגובה אחת

פעולות חיתוך ואיחוד בין קבוצות וביצוע Union בעזרת Join

יום שני, פברואר 28, 2011

דרך מעניינת להסתכל על טבלאות היא כעל קבוצות של רשומות. נכון שהדימוי האינטואיטיבי הוא דווקא של רשימה מסודרת (טבלה..) אבל לסדר אין חשיבות והטבלה נשארת אותה טבלה ללא קשר לאופן המיון הלוגי או הפיזי של הרשומות (זו כנראה אחת הסיבות להתעקשותה של Microsoft לא לאפשר ביצוע Order By ב-View), ובין טבלאות ניתן לבצע פעולות חיתוך ואיחוד כפי שלמדנו במבוא לתורת הקבוצות.. לצורך ההמחשה ניצור שתי טבלאות בעלות מבנה זהה, ונכניס לתוכן נתונים - חלקם זהים וחלקם שונים: Use tempdb; Go ...

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