none
מציאת recompilations RRS feed

  • שאלה

  • היי.

    יש לי פרוצדורה שאני רוצה לבדוק האם ה-plan שלה נשמרת ב-cache או שיש recompilation בכל הרצה.

    אני בטוח שיש שאילתא לזה, אבל אני לא מוצא אותה..... יש למישהו?

    תודה וחג שמח


    itaigitt, http://copypastenet.blogspot.com

    יום ראשון 07 אוקטובר 2012 09:54

תשובות

  • הי איתי,

    ה-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
    יום שני 08 אוקטובר 2012 06:59
    מנחה דיון
  • היי איתי,

    עכשיו זה כבר ברור יותר. תנסה להריץ את השאילתה הבאה, בעקרון זו אותה שאילתה של גיא ומיכאל, רק עם תוספת קטנה אשר תציג את ה-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
    יום שני 12 נובמבר 2012 13:15
  • הי איתי,

    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
    יום שלישי 09 אוקטובר 2012 21:23
  • הי מיכאל,

    יש לי רק תיקון קטן...

    העמודה "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
    יום שלישי 09 אוקטובר 2012 21:48
    מנחה דיון

כל התגובות

  • הי איתי,

    ה-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
    יום שני 08 אוקטובר 2012 06:59
    מנחה דיון
  • תודה!

    itaigitt, http://copypastenet.blogspot.com

    יום שלישי 09 אוקטובר 2012 10:53
  • ואני יכול גם לבדוק האם בהרצת פרוצדורה נעשה recompilation?


    itaigitt, http://copypastenet.blogspot.com

    יום שלישי 09 אוקטובר 2012 11:18
  • הי איתי,

    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
    יום שלישי 09 אוקטובר 2012 21:23
  • כמובן שניתן לראות גם טקסט של שאילתה ע"י הוספת ביטוי הבא ל-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

    יום שלישי 09 אוקטובר 2012 21:28
  • הי מיכאל,

    יש לי רק תיקון קטן...

    העמודה "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
    יום שלישי 09 אוקטובר 2012 21:48
    מנחה דיון
  • שוב שלום :-)

    איך אני מקבל מה היו הפרמטרים הברצת הפרוצדורה בהרצה הראשונה שיצרה את ה-PLAN?


    itaigitt, http://copypastenet.blogspot.com

    יום ראשון 11 נובמבר 2012 15:50
  • היי איתי,

    על מנת למצוא את הערכים שסופקו כפרמטרים של פרוצדורה בהרצה הראשונית, עלייך כמובן להיכנס ל-Execution Plan, באופרטור הכי שמאלי, להקיש עליו קליק ימני לבחור ב-Properties. מצד ימין ייפתח לך חלון. בחלון זה, בערך באמצע, תחפש: Parameter List. בתוך חלק זה תמצא גם את ה-Compiled Value, שזהו הערך של ההרצה הראשונית. בנוסף, תוכל למצוא גם את הערך האחרון איתו הורצה הפרוצדורה תחת: Paramerter Runtime Value.

    מקווה שעזרתי,

    חקיקת יוסי

    יום ראשון 11 נובמבר 2012 21:21
  • אבל איך אני מגיע ל-Execution Plan?

    itaigitt, http://copypastenet.blogspot.com

    יום שני 12 נובמבר 2012 08:03
  • היי איתי,

    אם אתה מריץ את הפרוצדורה דרך SSMS, אז תלחץ CTRL+M לפני הרצת הפרוצדורה. זו הדרך הכי נוחה עבורי, אבל אתה יכול גם דרך Profiler.

    מקווה שעזרתי,

    חקיקת יוסי

    יום שני 12 נובמבר 2012 11:30
  • היי.

    כנראה לא הסברתי טוב.

    אני מנסה לתפוס מקרה של Parameter sniffing. ע"י השאילתות שגיא ומיכאל רשמו למעלה אני רואה כמה אלו execution plans היו.

    אני רוצה לדעת עבור בההרצה הראשונה מה היו הפרמטרים שייצרו את ה-plan שאיתה הפרוצדורה עובדת עכשיו, זאת ע"מ להבין מאיפה התקבלה הקריאה (את זה אעשה מול האפליקציה).

    תודה,

    איתי.


    itaigitt, http://copypastenet.blogspot.com

    יום שני 12 נובמבר 2012 12:38
  • היי איתי,

    עכשיו זה כבר ברור יותר. תנסה להריץ את השאילתה הבאה, בעקרון זו אותה שאילתה של גיא ומיכאל, רק עם תוספת קטנה אשר תציג את ה-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
    יום שני 12 נובמבר 2012 13:15
  • תודה.

    זה מחזיר כ-XML, יש מצב להחזיר כתצוגה גרפית?


    itaigitt, http://copypastenet.blogspot.com

    יום שני 12 נובמבר 2012 13:27
  • * תוכנית ההרצה תמיד נבנית כ XML.

    * אתה יכול לטעון את ה XML כדי לראות את התצוגה הגרפית (אתה יכול לשמור בצורה אוטומטית לקובץ או ידנית ואז לפתוח אותו)

    תן לקובץ סיומת של sqlplan במקום סיומת של xml והוא יפתח אוטומטית בצורה גרפית


    signature

    יום שני 12 נובמבר 2012 13:40
    מנחה דיון