הצגת Insert לטבלה מאונדקסת ב-Execution Plan

13/08/2015

תגיות: , ,
תגובה אחת

בדרך כלל אנחנו משתמשים ב-Execution Plan כדי לבחון ולשפר פעולות Select, אולי מפני ש-Isert הוא מובן מאליו ואין מה לשפר בו (למעט ה-Select שאותו מכניסים לטבלה), ואולי מפני שבמערכות OLTP ה-Insert-ים הם קטנים ולא מעניינים, בניגוד לפעולות ה-Select שיכולות להיות עתירות משאבים.
כך או כך, ניצור טבלה עם מבחר אינדקסים (כולם מיותרים ונועדו לצורך התרגול) ונבדוק כיצד נראית פעולת ה-Insert.
הטבלה, כמקובל במקומנו, לפי מבנה טבלת הודעות השגיאה sys.messages:

Create Table #T(message_id Int,

            language_id Int,

            severity SmallInt,

            is_event_logged Bit,

            text NVarchar(Max));

 

Create Index Idx_#T_1 On #T(message_id) Include(language_id,severity,is_event_logged,text);

Create Index Idx_#T_2 On #T(language_id,message_id) Include(severity,is_event_logged,text);

Create Index Idx_#T_3 On #T(severity,language_id,message_id) Include(is_event_logged,text);

Create Index Idx_#T_4 On #T(is_event_logged,severity,language_id,message_id) Include(text);

כעת נבצע 2 פעולות הכנסת נתונים מטבלת המערכת, אחת של 250 שורות ואחת של 251 שורות:

Set Statistics IO On;

Insert Into #T Select Top 250 * From sys.messages;

Insert Into #T Select Top 251 * From sys.messages;

Set Statistics IO Off;

image

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

image

במקרה השני ה-Execution Plan מפורט יותר (בהבדל של שורה אחת בין שני המקרים), ורואים שהנתונים מוכנסים לטבלה וממנה הם ממויינים ומוכנסים לאינדקסים.

לגבי ה-Statistics IO (ערכתי מעט את התצוגה מבלי לשנות את הנתונים):

image

אני מתרשם מה-Execution Plans השונים (בשני יש Table Spool נוסף לאחר ה-Insert לטבלה עצמה) ומהעובדה שב-Statistics IO ה-Scan Count של ה-Worktable גדל מ-1 ל-5, שמדובר בתוכניות שונות; ושבמקרה השני הנתונים הוכנסו לאובייקט זמני של המערכת שממנו הם נשלפו ומויינו לכל אחד מהאינדקסים (ולכן מספר ה-Logical Reads הוכפל – כנגד שני Table Spools, ומספר ה-Scan חומש – כנגד הטבלה וארבעת האינדקסים).

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

תגובה אחת

  1. Pingback: sys.dm_db_index_usage_stats: האם יש שימוש לאינדקסים - SQLServer.co.il