6. נא להכיר – אופטימייזר ותפקידו בכוח תפקידו של אופטימייזר – למצוא execution plan יעיל לכל שאילתה בפרוצדורה או ב-batch. Cost-based Optimizer. כלומר מחפש execution plan הכי "זול". מטרה: להחזיר את כל התוצאה כמה שיותר מהר. למצוא execution plan הכי יעיל שיש יכול לקחת זמן. לכן מחפש איזון בין תהליך האופטימיזציה לבין ביצוע.
7. Trivial plan איטרציה ראשונה (cost < 0.2) איטרציה שנייה (cost < 1.0) איטרציה שלישית אם (cost > 5) – לשקול parallel plans שלבי האופטימיזציה
8. ***Trace flag 2301 מוסיף ל-Optimizer יכולות (אופציות) נוספות. על חשבון זמן אופטימיזציה! להשתמש בזהירות!!! "Went live with 2008, -T2301 killed us" Brent Ozar שלבי האופטימיזציה
9. Query Execution and Memory חלק מהפעולות אינן דורשות זכרון (nested loops, merge, filter וכו'). חלק אחר דווקא כן (hash join, sort, spool) הקצאת זכרון מתבצעת בתחילת ביצוע השאילתה על-סמך חישוב שמתבסס על ה-execution plan שאופטימייזר הכין. מה קורה כאשר פתאום מגלים שצריך עוד זכרון? כותבים ל-tempdb! מה אם אין מספיק זכרון פנוי? השאילתה תמתין. RESOURCE_SEMAPHORE
12. ברוב רובם של המקרים אופטימייזר עושה עבודה מעולה. וגם ממשיך להשתפר מגרסה לגרסה. יש מספר מקרים בהם אופטימייזר לא מצליח למצוא execution plan טוב. חלקם בגלל מגבלותיו, חלקם בגלל באגים, חלקם בגלל התפלגות נתונים שונה ומשונה. כדאי להכיר גם את מגבלותיו של האופטימייזר אבל בעיקר – התפלגות נתונים במסד נתונים שלכם. May the (Optimizer’s) force be with you
13.
14. מספרים קבועים לכל שורה או page אך שונים מאופרטור לאופרטור. למשל עבור Clustered Index Scan: