none
מציאת מספר קריאות ל-views RRS feed

  • שאלה

  • היי.

    אני רוצה למצא כמה פעמים קראו ל-views אצלי ב-DB.

    במקרה הזה, השימוש הוא בשאילתות בעיקר (ואולי קצת ב-stored procedures) שפונות ל-views.

    אני צריך איזשהו SELECT שיחזיר לי VIEW וסספר קריאות אליו (בפועל, כלומר אם שאילתא אחת רצה 10 פעמים ושניה 4 פעמים - אני רוצה לקבל 14).

    תודה!



    itaigitt, http://copypastenet.blogspot.com

    יום ראשון 25 מאי 2014 06:07

תשובות

  • הי איתי,

    השאילתה שלך לא טובה מכמה סיבות:

    1. היא לא מתייחסת רק ל-Views, אלא לכל סוגי האוביקטים.

    2. ה-Views בכלל לא מופיעים ב-sys.dm_exec_query_stats, השאילתות שפונות אל ה-Views כן.

    נסה את זה:

    WITH
    	QueryExecutions
    AS
    	(
    		SELECT
    			QueryText	=
    				SUBSTRING
    				(
    					SQLTexts.text						  ,
    					QueryStats.statement_start_offset / 2 ,
    					(
    						CASE QueryStats.statement_end_offset
    							WHEN -1 THEN LEN (SQLTexts.text)
    							ELSE QueryStats.statement_end_offset / 2
    						END
    						- QueryStats.statement_start_offset / 2
    					)
    					+ 1
    				) ,
    			ExecutionCount	= QueryStats.execution_count
    		FROM
    			sys.dm_exec_query_stats AS QueryStats
    		CROSS APPLY
    			sys.dm_exec_sql_text (QueryStats.sql_handle) AS SQLTexts
    	)
    SELECT
    	ViewSchema	= SCHEMA_NAME (Views.schema_id) ,
    	ViewName	= Views.name ,
    	UsageCount	= SUM (ISNULL (QueryExecutions.ExecutionCount , 0))
    FROM
    	sys.views AS Views
    LEFT OUTER JOIN
    	QueryExecutions
    ON
    	QueryExecutions.QueryText LIKE N'%[. ' + CHAR(9) + CHAR(10) + CHAR(13) + N'\[]' + Views.name + N'[ ;' + CHAR(9) + CHAR(10) + CHAR(13) + '\]]%' ESCAPE N'\'
    GROUP BY
    	SCHEMA_NAME (Views.schema_id) ,
    	Views.name
    ORDER BY
    	ViewSchema	ASC ,
    	ViewName	ASC;
    GO
    

    כמה נקודות:

    1. השאילתה הזאת מחזירה את כל ה-Views ב-Database הנוכחי, אבל סוכמת פניות ל-Views בכל ה-Databases. כלומר, אם במקרה בשני Databases שונים יש View עם אותו שם, אז תחזור שורה אחת עם הסכום של הריצות בשני ה-Databases.

    2. החיפוש הוא רק לפי שם ה-View בלי קשר לסכימה. אם יש שני Views בסכימות שונות עם אותו שם, אז תחזור שורה לכל View, ובכל שורה יופיע הסכום הכולל של שניהם.

    3. השאילתה מתבססת על מה שנמצא ב-Plan Cache כרגע ועל מספר הריצות של כל שאילתה מאז הקומפילציה האחרונה.

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

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי itaigitt יום שלישי 27 מאי 2014 13:12
    יום שלישי 27 מאי 2014 11:56
    מנחה דיון

כל התגובות

  • ניסיתי את זה, אבל זה לא נראה לי הכי הכי מדויק (או שאני סתם פראנואיד?)

    SELECT	OBJECT_NAME(st.objectid, st.[dbid]) as ObjectName,
    		--qs.plan_generation_num,
    		sum(qs.execution_count) as execution_count
    FROM		sys.dm_exec_query_stats qs
    CROSS APPLY	sys.dm_exec_sql_text(sql_handle) st
    WHERE	DB_NAME(st.[dbid]) = 'DB_NAME' 
    GROUP BY	OBJECT_NAME(st.objectid, st.[dbid])
    ORDER BY	sum(qs.execution_count) desc


    itaigitt, http://copypastenet.blogspot.com


    • נערך על-ידי itaigitt יום ראשון 25 מאי 2014 06:10
    יום ראשון 25 מאי 2014 06:09
  • הי איתי,

    השאילתה שלך לא טובה מכמה סיבות:

    1. היא לא מתייחסת רק ל-Views, אלא לכל סוגי האוביקטים.

    2. ה-Views בכלל לא מופיעים ב-sys.dm_exec_query_stats, השאילתות שפונות אל ה-Views כן.

    נסה את זה:

    WITH
    	QueryExecutions
    AS
    	(
    		SELECT
    			QueryText	=
    				SUBSTRING
    				(
    					SQLTexts.text						  ,
    					QueryStats.statement_start_offset / 2 ,
    					(
    						CASE QueryStats.statement_end_offset
    							WHEN -1 THEN LEN (SQLTexts.text)
    							ELSE QueryStats.statement_end_offset / 2
    						END
    						- QueryStats.statement_start_offset / 2
    					)
    					+ 1
    				) ,
    			ExecutionCount	= QueryStats.execution_count
    		FROM
    			sys.dm_exec_query_stats AS QueryStats
    		CROSS APPLY
    			sys.dm_exec_sql_text (QueryStats.sql_handle) AS SQLTexts
    	)
    SELECT
    	ViewSchema	= SCHEMA_NAME (Views.schema_id) ,
    	ViewName	= Views.name ,
    	UsageCount	= SUM (ISNULL (QueryExecutions.ExecutionCount , 0))
    FROM
    	sys.views AS Views
    LEFT OUTER JOIN
    	QueryExecutions
    ON
    	QueryExecutions.QueryText LIKE N'%[. ' + CHAR(9) + CHAR(10) + CHAR(13) + N'\[]' + Views.name + N'[ ;' + CHAR(9) + CHAR(10) + CHAR(13) + '\]]%' ESCAPE N'\'
    GROUP BY
    	SCHEMA_NAME (Views.schema_id) ,
    	Views.name
    ORDER BY
    	ViewSchema	ASC ,
    	ViewName	ASC;
    GO
    

    כמה נקודות:

    1. השאילתה הזאת מחזירה את כל ה-Views ב-Database הנוכחי, אבל סוכמת פניות ל-Views בכל ה-Databases. כלומר, אם במקרה בשני Databases שונים יש View עם אותו שם, אז תחזור שורה אחת עם הסכום של הריצות בשני ה-Databases.

    2. החיפוש הוא רק לפי שם ה-View בלי קשר לסכימה. אם יש שני Views בסכימות שונות עם אותו שם, אז תחזור שורה לכל View, ובכל שורה יופיע הסכום הכולל של שניהם.

    3. השאילתה מתבססת על מה שנמצא ב-Plan Cache כרגע ועל מספר הריצות של כל שאילתה מאז הקומפילציה האחרונה.

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

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי itaigitt יום שלישי 27 מאי 2014 13:12
    יום שלישי 27 מאי 2014 11:56
    מנחה דיון
  • תודה!

    רק הוספתי COLLATE DATABASE_DEFAULT כדי למנוע קונפליקט של collations.


    itaigitt, http://copypastenet.blogspot.com

    יום שלישי 27 מאי 2014 13:13
  • מעולה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    יום רביעי 28 מאי 2014 03:41
    מנחה דיון