Usefull DMV Query

What are DMV : (Dynamic Management View)

  • View of internals informations.
  • DMV are basically SQL Views on some pretty important internal memory structures.
  • DMV informations include metrics about :
    • indexes
    • query execution
    • operating system
    • Transaction
    • Databases
    • and much more

What are DMF : (Dynamic Management Function)

As an example sys.dm_exec_query_stats records details of the SQL being processed via variable called sql_handle.

If this sql_handle is passed as a parameter to the DMF sys.dm_exec_sql_text, the DMF will return the actual SQL Text  associated with this sql_handle.


Find a cache plan :

Select st.Text as [SQL],
cp, objtype,
COASLESCE (Cast(pa.value, INT)), 'Resource' as [DatabaseName],
cp.usecounts as [Plan Usage],
From sys.dm_exec_cached_plan cp
CROSS APPLY sys.dm_exec_sql_text (cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan (cp.plan_handle) qp
OUTER APPLY sys.dm_exec_plan_attributes (cp.plan_handle) pa
Where pa.attribute = 'dbid'


Most Expensive Query :

Select Cast(Total_elapsed_time / 1000000.0 as decimal(28,2)) as [Total Duration (s)],
Cast(Total_Worker_Time * 100.0 / Total_Elapsed_Time as decimal(28, 2)) as [% CPU],
Cast ((total_elapsed_time - total_worker_time) * 100.0 / total_elapsed_time as decimal(28,2)) as [% Waiting],
Cast (Total_elapsed_time / 1000000.0 / execution_count as decimal(28,2)) as [average duration (s)],
Substring (qt.text, (qs.statement_start_offset / 2) + 1, ((
Case When qs.statement_end_offset = -1
Then len(convert(Nvarchar(Max), qt.text)) * 2
Else qs.statement_end_offset
End - qs.statement_start_offset) / 2 ) + 1) as [Individual Query]
From sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text (qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
INNER JOIN sys.dm_exec_cached_plans as cp
ON qs.plan_handle = cp.plan_handle
Where Total_elapsed_Time <> 0
and Execution_count <> 0
Order By total_elapsed_time DESC


 Missing Index :

 Select Round (avg_total_user_cost * avg_user_impact * (user_seeks + user_scans), 0) as [Total Cost],
statement as [Table Name],
From sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s on s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d on d.index_handle = g.index_handle


Why are you waiting ?

Select Wait_type, wait_time_ms, signal_wait_time_ms, wait_time_ms -signal_wait_time_ms as RealWait,
convert(Decimal(12, 2), (wait_time_ms - signal_wait_time_ms) * 100.0 / sum(wait_time_ms) over()) as [% RealWait]
From sys.dm_os_wait_stats
Where Wait_type like '%SLEEP%'
And wait_type != 'WAITFOR'
Order by wait_time_ms DESC


What is blocked ?

Select Blocking.Session_id as BlockingSessionId,
Sess.login_name as BlockingUser,
BlockingSQL.Text as BlockingSQL,
Waits.wait_type as WhyBlocked,
Blocked.Session_id as BlockedSessionId,
USER_NAME(Blocked.user_id) as BlockedUser,
BlockedSQL.text as BlockedSQL,
DB_NAME(Blocked.database_id) as DatabaseName
From Sys.dm_exec_connections as Blocking
INNER JOIN sys.dm_exec_requests as Blocked
ON Blocking.session_id = blocked.blocking_sessionid
INNER JOIN sys.dm_os_waiting_task as waits
ON Blocked.session_id = Waits.session_id
RIGHT OUTER JOIN sys.dm_exec_sessions Sess
ON Blocking.session_id = sess.session_id
CROSS APPLY sys.dm_exec_sql_text (Blocking.most_recent_sql_handle) as Blocking SQL
CROSS APPLY sys.dm_exec_sql_text (Blocked.sql_handle) as BlockedSQL


What Fill the log ?

 Select as [Database Name],
db.recovery_model_desc as [Recovery Model],
db.log_reuse_wait_desc as [Log reuse Wait Description],
ls.cntr_value as [Log Size (KB)],
lu.cntr_value as [log Used (KB)],
CAST ( CAST(lu.cntr_value as float) / CAST(ls.cntr_value as float) as DECIMAL (18,2)) * 100 as [Log Used %],
db.Compatibility_level as [DB Compatibility Level],
db.page_verify_option_desc as [Page Verify_Option]
From sys.databases as db
INNER JOIN sys.dm_os_performance_counters as lu on = lu.instance_name
INNER JOIN sys.dm_os_performance_counters as ls on = ls.instance_name
Where lu.counter_name like 'Log File(s) Used Size (KB)%'
And ls.counter_name like 'Log File(s) Size (KB)%'


System Information :

Select cpu_count as [Logical CPU Count],
hyperthread_ratio as [ Hyperthread Ratio],
cpu_count /hyperthread_ratio as [Physical CPU Count],
physical_memory_in_bytes / 1048576 as [Physical Memory (MB)]
From sys.dm_os_sys_info


Monitor Scheduler info :

SELECT AVG(current_tasks_count) AS [Avg Task Count] ,
AVG(runnable_tasks_count) AS [Avg Runnable Task Count]
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255

Monitor Memory :

SELECT total_physical_memory_kb ,
available_physical_memory_kb ,
total_page_file_kb ,
available_page_file_kb ,
FROM sys.dm_os_sys_memory

SELECT physical_memory_in_use_kb ,
locked_page_allocations_kb ,
page_fault_count ,
memory_utilization_percentage ,
available_commit_limit_kb ,
process_physical_memory_low ,
FROM sys.dm_os_process_memory

SELECT OBJECT_NAME(p.[object_id]) AS [ObjectName] ,
p.index_id ,
COUNT(*) / 128 AS [Buffer size(MB)] ,
COUNT(*) AS [Buffer_count]
FROM sys.allocation_units AS a
INNER JOIN sys.dm_os_buffer_descriptors
AS b ON a.allocation_unit_id = b.allocation_unit_id
INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id
WHERE b.database_id = DB_ID()
AND p.[object_id] > 100
GROUP BY p.[object_id] ,
ORDER BY buffer_count DESC