• Here are a couple of scripts that make the numbers more useful.

    The first gives you all counters, including absolute values (like page life expectancy), percentages calculated by dividing a counter by a base (like cache hit ratio) and per-second averages since the last service restart.

    use master;

    set nocount on;

    declare @up_secs bigint

    select @up_secs = datediff(second, create_date, getdate()) from sys.databases where name = 'tempdb'

    select rtrim(object_name) object_name, rtrim(instance_name) instance_name, rtrim(counter_name) counter_name, cntr_value

    from sys.dm_os_performance_counters

    where cntr_type = 65792

    union all

    select rtrim(object_name), rtrim(instance_name), rtrim(counter_name), 1. * cast(cntr_value as bigint) / @up_secs

    from sys.dm_os_performance_counters

    where cntr_type = 272696576

    union all

    select rtrim(v.object_name), rtrim(v.instance_name), rtrim(v.counter_name), 100. * v.cntr_value / case when b.cntr_value = 0 then 1 else b.cntr_value end

    from (

    select object_name, instance_name, counter_name, cntr_value

    from sys.dm_os_performance_counters

    where cntr_type = 537003264) v

    join (

    select object_name, instance_name, counter_name, cntr_value

    from sys.dm_os_performance_counters

    where cntr_type = 1073939712) b on v.object_name = b.object_name and v.instance_name = b.instance_name and rtrim(v.counter_name) + ' base' = rtrim(b.counter_name)

    union all

    select rtrim(v.object_name), rtrim(v.instance_name), rtrim(v.counter_name), 1. * v.cntr_value / case when b.cntr_value = 0 then 1 else b.cntr_value end

    from (

    select object_name, instance_name, counter_name, cntr_value

    from sys.dm_os_performance_counters

    where cntr_type = 1073874176) v

    join (

    select object_name, instance_name, counter_name, cntr_value

    from sys.dm_os_performance_counters

    where cntr_type = 1073939712) b on v.object_name = b.object_name and v.instance_name = b.instance_name and replace(rtrim(v.counter_name), ' (ms)', '') + ' Base' = rtrim(b.counter_name)

    order by object_name, instance_name, counter_name

    And the second runs for 10 seconds, giving only the per-second counters over that time period only.

    use master;

    set nocount on;

    declare @before table (

    capture_time datetime,

    [object_name] nvarchar(255),

    instance_name nvarchar(255),

    counter_name nvarchar(255),

    cntr_value bigint

    )

    declare @after table (

    capture_time datetime,

    [object_name] nvarchar(255),

    instance_name nvarchar(255),

    counter_name nvarchar(255),

    cntr_value bigint

    )

    insert @before

    select getdate(), rtrim(object_name), rtrim(instance_name), rtrim(counter_name), cast(cntr_value as bigint)

    from sys.dm_os_performance_counters

    where cntr_type = 272696576

    waitfor delay '00:00:10'

    insert @after

    select getdate(), rtrim(object_name), rtrim(instance_name), rtrim(counter_name), cast(cntr_value as bigint)

    from sys.dm_os_performance_counters

    where cntr_type = 272696576

    select b.[object_name], b.instance_name, b.counter_name, 1000. * (a.cntr_value - b.cntr_value) / datediff(ms, b.capture_time, a.capture_time) cntr_value

    from @before b

    join @after a on b.[object_name] = a.[object_name] and b.instance_name = a.instance_name and b.counter_name = a.counter_name

    order by 1, 2, 3, 4