Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Query Statistics (DMV)

14. Juli 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Die „Dynamic Management Views“ vom Microsoft SQL Server 2005 / 2008 bieten zahlreiche Information, wie auch wie häufig SQL Statements ausgeführt wurden.

Das ist interessant, um zu sehen, was am meisten verwendet wird und wo man am ehesten mal über Optimierung nachdenken könnte. Das Ermitteln geht einfach über die DMV sys.dm_exec_query_stats.

Falls das nun ein unerwartetes Ergebnis bringt oder die bisher als „Most Used“ vermuteten SQL Statements fehlen, dann kann es einen einfachen Grund haben: Es werden keine parametrisierte Queries (Commands) verwendet. Dadurch, dass jedes Statement dynamisch mit den Werten generiert wird, sieht für den Sql Server jedes dieser Statements wie ein Uniques aus; somit gibt es jedes Mal ein eigenen Ausführungsplan und somit ist auch nichts mit den Statistiken über mehr als einmal verwendete Statements.

Was sagt uns das: Besser immer parametrisierte Queries verwenden!

Übrigens: Wenn man trotzdem mal ein Ergebnis sehen möchte, dann das Script mal auf der Datenbank „distribution“ (für die Replikation) oder auf der „ReportServer“ (vom Reporting Service) ausführen; sofern vorhanden. Da erhält man auf jeden Fall ein Ergebnis.

 

 -- Anzahl Ausführungen von SQL Statements ermitteln 
 SELECT TOP 100 
  EQS.execution_count AS Anzahl, 
  EQS.last_execution_time AS LetzteVerwendung, 
  SUBSTRING(EST.text,  
  EQS.statement_start_offset / 2,  
  (CASE WHEN EQS.statement_end_offset = -1  
  THEN LEN(convert(nvarchar(max), EST.text)) * 2  
  ELSE EQS.statement_end_offset  
  END  
  - EQS.statement_start_offset) / 2 
  ) AS QueryText, 
  OBJ.name AS ObjectName, OBJ.type_desc AS ObjectType, 
  PAR.name AS ParentName, PAR.type_desc AS ParentType 
 FROM sys.dm_exec_query_stats AS EQS 
  CROSS APPLY sys.dm_exec_sql_text(EQS.sql_handle) AS EST 
  INNER JOIN sys.objects AS OBJ 
  ON EST.objectid = OBJ.object_id 
  LEFT JOIN sys.objects AS PAR 
  ON OBJ.parent_object_id = PAR.object_id 
 WHERE EST.dbid = DB_ID() 
 ORDER BY EQS.execution_count DESC 

Diesen Post teilen

Repost 0

Kommentiere diesen Post