משיב מוביל
מציאת מספר קריאות ל-views

שאלה
-
היי.
אני רוצה למצא כמה פעמים קראו ל-views אצלי ב-DB.
במקרה הזה, השימוש הוא בשאילתות בעיקר (ואולי קצת ב-stored procedures) שפונות ל-views.
אני צריך איזשהו SELECT שיחזיר לי VIEW וסספר קריאות אליו (בפועל, כלומר אם שאילתא אחת רצה 10 פעמים ושניה 4 פעמים - אני רוצה לקבל 14).
תודה!
itaigitt, http://copypastenet.blogspot.com
תשובות
-
הי איתי,
השאילתה שלך לא טובה מכמה סיבות:
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
כל התגובות
-
ניסיתי את זה, אבל זה לא נראה לי הכי הכי מדויק (או שאני סתם פראנואיד?)
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
-
הי איתי,
השאילתה שלך לא טובה מכמה סיבות:
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
-
-