משיב מוביל
מציאת recompilations

שאלה
-
תשובות
-
הי איתי,
ה-DMV בשם sys.dm_exec_procedure_stats מחזיר סטטיסטיקות רק על פרוצדורות שנמצאות ב-Cache, כך שאתה יכול להשתמש בו בשביל לבדוק אם הפרוצדורה שלך נמצאת ב-Cache.
SELECT * FROM sys.dm_exec_procedure_stats WHERE database_id = DB_ID (N'YourDatabaseName') AND object_id = OBJECT_ID (N'YourProcedureName'); GO
מקווה שעזרתי...
-----------------------------
גיא גלנצר
יועץ ומדריך SQL Server
Madeira - SQL Server Services
http://www.madeira.co.il
- הוצע כתשובה על-ידי Noam BinyaminiMicrosoft employee יום שני 08 אוקטובר 2012 19:42
- סומן כתשובה על-ידי itaigitt יום שלישי 09 אוקטובר 2012 10:53
-
היי איתי,
עכשיו זה כבר ברור יותר. תנסה להריץ את השאילתה הבאה, בעקרון זו אותה שאילתה של גיא ומיכאל, רק עם תוספת קטנה אשר תציג את ה-Plan עצמו. ואז על מנת לדעת מה היו הערכים בזמן ההרצה הראשונה, תפעל לפי מה שכתבתי לך בתשובה מאתמול בלילה.
מקווה שעזרתי,
יוסי
SELECT DB_NAME(st.[dbid]) AS DbName, OBJECT_NAME(st.objectid, st.[dbid]) as ObjectName, qs.plan_generation_num, qs.execution_count, p.query_plan FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st CROSS APPLY sys.dm_exec_query_plan (plan_handle) AS p WHERE DB_NAME(st.[dbid]) = 'MyDBName' AND OBJECT_NAME(st.objectid, st.[dbid]) = 'YourProcedureName'
- הוצע כתשובה על-ידי pituachMVP, Moderator יום שני 12 נובמבר 2012 13:38
- סומן כתשובה על-ידי itaigitt יום שני 12 נובמבר 2012 13:55
-
הי איתי,
recompilation בדרך כלל מתבצע ברמת statement (אלא אם יצרת פרוצדורה WITH RECOMPILE) אבל statement בהחלט ניתן לשייך לפרוצדורה:
SELECT DB_NAME(st.[dbid]) AS DbName, OBJECT_NAME(st.objectid, st.[dbid]) as ObjectName, qs.plan_generation_num, qs.execution_count FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st WHERE DB_NAME(st.[dbid]) = 'MyDBName' AND OBJECT_NAME(st.objectid, st.[dbid]) = 'YourProcedureName'
אם מספרים בשתי עמודות אחרונות קרובים - כנראה שבאמת כל פעם שאותו statement רץ, הוא גם מתקמפל מחדש.- סומן כתשובה על-ידי itaigitt יום רביעי 10 אוקטובר 2012 07:37
-
הי מיכאל,
יש לי רק תיקון קטן...
העמודה "plan_generation_num" מציינת את מספר ה-Recompilations שבוצעו עד כה, והעמודה "execution_count" מציינת את מספר ההרצות שבוצעו מאז ה-Recompile האחרון. לכן, אם הפרוצדורה מתקמפלת מחדש בכל הרצה, אתה תראה מספר גבוה ב-"plan_generation_num" והערך "1" ב-"execution_count".
-----------------------------
גיא גלנצר
יועץ ומדריך SQL Server
Madeira - SQL Server Services
http://www.madeira.co.il- סומן כתשובה על-ידי itaigitt יום רביעי 10 אוקטובר 2012 07:37
כל התגובות
-
הי איתי,
ה-DMV בשם sys.dm_exec_procedure_stats מחזיר סטטיסטיקות רק על פרוצדורות שנמצאות ב-Cache, כך שאתה יכול להשתמש בו בשביל לבדוק אם הפרוצדורה שלך נמצאת ב-Cache.
SELECT * FROM sys.dm_exec_procedure_stats WHERE database_id = DB_ID (N'YourDatabaseName') AND object_id = OBJECT_ID (N'YourProcedureName'); GO
מקווה שעזרתי...
-----------------------------
גיא גלנצר
יועץ ומדריך SQL Server
Madeira - SQL Server Services
http://www.madeira.co.il
- הוצע כתשובה על-ידי Noam BinyaminiMicrosoft employee יום שני 08 אוקטובר 2012 19:42
- סומן כתשובה על-ידי itaigitt יום שלישי 09 אוקטובר 2012 10:53
-
-
-
הי איתי,
recompilation בדרך כלל מתבצע ברמת statement (אלא אם יצרת פרוצדורה WITH RECOMPILE) אבל statement בהחלט ניתן לשייך לפרוצדורה:
SELECT DB_NAME(st.[dbid]) AS DbName, OBJECT_NAME(st.objectid, st.[dbid]) as ObjectName, qs.plan_generation_num, qs.execution_count FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st WHERE DB_NAME(st.[dbid]) = 'MyDBName' AND OBJECT_NAME(st.objectid, st.[dbid]) = 'YourProcedureName'
אם מספרים בשתי עמודות אחרונות קרובים - כנראה שבאמת כל פעם שאותו statement רץ, הוא גם מתקמפל מחדש.- סומן כתשובה על-ידי itaigitt יום רביעי 10 אוקטובר 2012 07:37
-
כמובן שניתן לראות גם טקסט של שאילתה ע"י הוספת ביטוי הבא ל-SELECT:
SUBSTRING(st.[text], (qs.statement_start_offset/2) + 1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.[text]) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text
-
הי מיכאל,
יש לי רק תיקון קטן...
העמודה "plan_generation_num" מציינת את מספר ה-Recompilations שבוצעו עד כה, והעמודה "execution_count" מציינת את מספר ההרצות שבוצעו מאז ה-Recompile האחרון. לכן, אם הפרוצדורה מתקמפלת מחדש בכל הרצה, אתה תראה מספר גבוה ב-"plan_generation_num" והערך "1" ב-"execution_count".
-----------------------------
גיא גלנצר
יועץ ומדריך SQL Server
Madeira - SQL Server Services
http://www.madeira.co.il- סומן כתשובה על-ידי itaigitt יום רביעי 10 אוקטובר 2012 07:37
-
-
היי איתי,
על מנת למצוא את הערכים שסופקו כפרמטרים של פרוצדורה בהרצה הראשונית, עלייך כמובן להיכנס ל-Execution Plan, באופרטור הכי שמאלי, להקיש עליו קליק ימני לבחור ב-Properties. מצד ימין ייפתח לך חלון. בחלון זה, בערך באמצע, תחפש: Parameter List. בתוך חלק זה תמצא גם את ה-Compiled Value, שזהו הערך של ההרצה הראשונית. בנוסף, תוכל למצוא גם את הערך האחרון איתו הורצה הפרוצדורה תחת: Paramerter Runtime Value.
מקווה שעזרתי,
חקיקת יוסי
- הוצע כתשובה על-ידי Guy GlantserMVP, Moderator יום שני 12 נובמבר 2012 03:24
-
-
-
היי.
כנראה לא הסברתי טוב.
אני מנסה לתפוס מקרה של Parameter sniffing. ע"י השאילתות שגיא ומיכאל רשמו למעלה אני רואה כמה אלו execution plans היו.
אני רוצה לדעת עבור בההרצה הראשונה מה היו הפרמטרים שייצרו את ה-plan שאיתה הפרוצדורה עובדת עכשיו, זאת ע"מ להבין מאיפה התקבלה הקריאה (את זה אעשה מול האפליקציה).
תודה,
איתי.
itaigitt, http://copypastenet.blogspot.com
-
היי איתי,
עכשיו זה כבר ברור יותר. תנסה להריץ את השאילתה הבאה, בעקרון זו אותה שאילתה של גיא ומיכאל, רק עם תוספת קטנה אשר תציג את ה-Plan עצמו. ואז על מנת לדעת מה היו הערכים בזמן ההרצה הראשונה, תפעל לפי מה שכתבתי לך בתשובה מאתמול בלילה.
מקווה שעזרתי,
יוסי
SELECT DB_NAME(st.[dbid]) AS DbName, OBJECT_NAME(st.objectid, st.[dbid]) as ObjectName, qs.plan_generation_num, qs.execution_count, p.query_plan FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st CROSS APPLY sys.dm_exec_query_plan (plan_handle) AS p WHERE DB_NAME(st.[dbid]) = 'MyDBName' AND OBJECT_NAME(st.objectid, st.[dbid]) = 'YourProcedureName'
- הוצע כתשובה על-ידי pituachMVP, Moderator יום שני 12 נובמבר 2012 13:38
- סומן כתשובה על-ידי itaigitt יום שני 12 נובמבר 2012 13:55
-
-
- נערך על-ידי pituachMVP, Moderator יום שני 12 נובמבר 2012 13:47