In a whitepaper named
"Diagnosing and Resolving Latch Contention on SQL Server", a script is provided to snap DM_OS_WAITE_STATS view to calculate wait over a period of time. In this post, based on the same idea, I developed a script to snap the DM_OS_PERFORMANCE_COUNTERS view in order to find out transactions/sec for each database. It is also easy to be modified to get other performance counters.
-- script: snap_perf_conuter.sql
/* Snapshot the performance counters (such as transaction/sec) on sys.dm_os_performance_counters
and store in a table so that they can be used to compute a per second value.
This script is only applicable to Cntr_Type = 272696576. Different Cntr_type is explained
in this blog:
http://rtpsqlguy.wordpress.com/2009/08/11/sys-dm_os_performance_counters-explained/
** Data is maintained in tempdb so the connection must persist between each execution**
**alternatively this could be modified to use a persisted table in tempdb. if that is changed code should be included to clean up the table at some point.**
*/
use tempdb
go
declare @current_snap_time datetime
declare @previous_snap_time datetime
-- declare @l_counter_name nchar(128)
declare @sqlcmd nvarchar(4000)
declare @l_counter_name nvarchar(2000)
-- modify the counter_name as needed, some examples provided
set @l_counter_name = '''transactions/sec'''
-- set @l_counter_name = '''Batch Requests/sec'''
-- set @l_counter_name= '''Page Splits/sec'',''Page lookups/sec'''
-- set @l_counter_name = '''transactions/sec'',''Batch Requests/sec'''
-- set @l_counter_name='''Page compression attempts/sec'',''Page Deallocations/sec'',''Page lookups/sec'',''Page reads/sec'',''Page Splits/sec'',''Page writes/sec'',''Pages Allocated/sec'',''Pages compressed/sec'''
-- set @l_counter_name = '''Logins/sec'',''Logouts/sec'''
if not exists(select name from tempdb.sys.sysobjects where name like '#_perf_counter%')
create table #_perf_counter ( "object_name" nchar(128) ,counter_name nchar(128) ,instance_name nchar(128) ,cntr_value bigint ,cntr_type int ,snap_time datetime
)
set @sqlcmd ='
insert into #_perf_counter (
object_name
,counter_name
,instance_name
,cntr_value
,cntr_type
,snap_time
)
select
OBJECT_NAME
,counter_name
,instance_name
,cntr_value
,cntr_type
,getdate()
from sys.dm_os_performance_counters
where counter_name in (' + @l_counter_name + ')'
exec sp_executesql @sqlcmd
--get the previous and current collection point
select top 1 @previous_snap_time = snap_time from #_perf_counter where snap_time < (select max(snap_time) from #_perf_counter) order by snap_time desc
select @current_snap_time = max(snap_time) from #_perf_counter
-- debug
select @current_snap_time end_time, @previous_snap_time start_time
set @sqlcmd='
select
e.object_name
,e.counter_name
,e.instance_name
,(e.cntr_value -s.cntr_value) / DATEDIFF(ss, s.snap_time, e.snap_time) Per_Sec_Value
--, s.snap_time as [start_time]
--, e.snap_time as [end_time] , DATEDIFF(ss, s.snap_time, e.snap_time) as [seconds_in_sample] from #_perf_counter e inner join
( select * from #_perf_counter
where snap_time ='''+ convert(varchar(100), @previous_snap_time, 21) + ''' ) s on ( e.instance_name=s.instance_name and e.object_name = s.object_name and e.instance_name=s.instance_name
and e.counter_name=s.counter_name)
where e.snap_time= '''+ convert(varchar(100), @current_snap_time, 21) + ''' and e.counter_name in (' + @l_counter_name + ')order by Per_Sec_value desc'
exec sp_executesql @sqlcmd
--clean up table
delete from #_perf_counter
where snap_time = @previous_snap_time
----------------- end of script ----
Sample output (edited) :
end_time start_time
----------------------- -----------------------
2011-10-12 18:47:25.173 2011-10-12 18:46:23.190
(1 row(s) affected)
object_name counter_name instance_name Per_Sec_Value seconds_in_sample
----------------------------------- ---------------- --------------------------- -------------------- -----------------
MSSQL$FPSEFSDB_OP2:Databases Transactions _Total 296 62
MSSQL$FPSEFSDB_OP2:Databases Transactions tempdb 126 62
MSSQL$FPSEFSDB_OP2:Databases Transactions Orderplacement 100 62
MSSQL$FPSEFSDB_OP2:Databases Transactions master 60 62
MSSQL$FPSEFSDB_OP2:Databases Transactions Distributor 2 62
MSSQL$FPSEFSDB_OP2:Databases Transactions NOCVDB 1 62
MSSQL$FPSEFSDB_OP2:Databases Transactions DBADB 1 62
MSSQL$FPSEFSDB_OP2:Databases Transactions msdb 1 62
MSSQL$FPSEFSDB_OP2:Databases Transactions tempdbx 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions spot_admin 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions ASPState 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions APPCACHELOG 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions VGISessions 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions SSNSDB 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions SSNS4DB 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions copper 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions VZWPCAT 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions model 0 62
MSSQL$FPSEFSDB_OP2:Databases Transactions mssqlsystemresource 0 62
No comments:
Post a Comment