Wednesday, 27 August 2014

Monitor TempDB through SQL Server Agent Using Scripts

USE [DBA]  -- Database to collect monitoring / counter information
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
--This table is to store information from the SQL Server Agent below Job 
CREATE TABLE [dbo].[T_TempDBMonitor](
      [System Name] [nvarchar](128) NULL,
      [Application Name] [nvarchar](128) NULL,
      [Database Name] [nvarchar](128) NULL,
      [User Name] [nvarchar](128) NULL,
      [Connection ID] [uniqueidentifier] NULL,
      [Current Session ID] [smallint] NOT NULL,
      [Blocking Session ID] [smallint] NULL,
      [Request Start Time] [datetime] NOT NULL,
      [Status] [nvarchar](30) NOT NULL,
      [Command Type] [nvarchar](16) NOT NULL,
      [Query Text] [nvarchar](max) NULL,
      [Waiting Type] [nvarchar](60) NULL,
      [Waiting Duration] [int] NOT NULL,
      [Waiting for Resource] [nvarchar](256) NOT NULL,
      [Transaction ID] [bigint] NOT NULL,
      [Percent Completed] [real] NOT NULL,
      [Estimated Completion Time (in mili sec)] [bigint] NOT NULL,
      [CPU time used (in mili sec)] [int] NOT NULL,
      [Memory Usage (in KB)] [int] NULL,
      [Elapsed Time (in mili sec)] [int] NOT NULL,
      [TempDB Size] [xml] NULL,
      [ExecutedAT] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[KE Perf Testing]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[KE Perf Testing]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Montor-TempDB',
            @enabled=1,
            @notify_level_eventlog=0,
            @notify_level_email=0,
            @notify_level_netsend=0,
            @notify_level_page=0,
            @delete_level=0,
            @description=N'No description available.',
            @category_name=N'[KE Perf Testing]',
            @owner_login_name=NDomain\Username', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'TEMPDB',
            @step_id=1,
            @cmdexec_success_code=0,
            @on_success_action=1,
            @on_success_step_id=0,
            @on_fail_action=2,
            @on_fail_step_id=0,
            @retry_attempts=0,
            @retry_interval=0,
            @os_run_priority=0, @subsystem=N'TSQL',
            @command=N'SET NOCOUNT ON;
select COUNT(*) as Counts
from sys.dm_exec_requests
            inner join
      sys.dm_exec_sessions
            on sys.dm_exec_requests.session_id = sys.dm_exec_sessions.session_id
where DB_NAME(database_id) = ''tempdb'' and sys.dm_exec_requests.session_id >50

if @@ROWCOUNT = 0
return


declare @script nvarchar(max)
set @script = ''SELECT
      [Name] as   [Logical_Name],
      [size_on_disk_bytes] / 1024 /1024   as    [Total_Size_MB],
      [num_of_bytes_written] / 1024/1024 as    [Space_Used_MB]
FROM sys.dm_io_virtual_file_stats(2, NULL)
            inner join
      sys.sysfiles
            on sys.dm_io_virtual_file_stats.file_id = sys.sysfiles.fileid
            ORDER BY [Name]
for xml raw''

declare @ReportResultXml table (RXml XML)
declare @ResultXml xml

declare @sql nvarchar(max)

set @sql = ''set @ResultXml = ('' + @script + '')''
execute sp_ExecuteSQL @sql, N''@ResultXml xml output'', @ResultXml output
--select @ResultXml;

INSERT INTO [DBA].[dbo].[T_TempDBMonitor]
           ([System Name]
           ,[Application Name]
           ,[Database Name]
           ,[User Name]
           ,[Connection ID]
           ,[Current Session ID]
           ,[Blocking Session ID]
           ,[Request Start Time]
           ,[Status]
           ,[Command Type]
           ,[Query Text]
           ,[Waiting Type]
           ,[Waiting Duration]
           ,[Waiting for Resource]
           ,[Transaction ID]
           ,[Percent Completed]
           ,[Estimated Completion Time (in mili sec)]
           ,[CPU time used (in mili sec)]
           ,[Memory Usage (in KB)]
           ,[Elapsed Time (in mili sec)]
           ,[TempDB Size]
           ,[ExecutedAT])
select
      host_name               as [System Name],
      program_name                  as [Application Name],
      DB_NAME(database_id)          as [Database Name],
      User_Name(user_id)                  as [User Name],
      connection_id                 as [Connection ID],
      sys.dm_exec_requests.session_id as [Current Session ID],
      blocking_session_id           as [Blocking Session ID],
      start_time              as [Request Start Time],
      sys.dm_exec_requests.status   as [Status],
      command                         as [Command Type],
      (select text from sys.dm_exec_sql_text(sql_handle)) AS [Query Text],
      wait_type               as [Waiting Type],
      wait_time               as [Waiting Duration],
      wait_resource                 as [Waiting for Resource],
      sys.dm_exec_requests.transaction_id as [Transaction ID],
      percent_complete        as [Percent Completed],
      estimated_completion_time     as [Estimated Completion Time (in mili sec)],
      sys.dm_exec_requests.cpu_time       as [CPU time used (in mili sec)],
      (memory_usage * 8)                  as [Memory Usage (in KB)],
      sys.dm_exec_requests.total_elapsed_time as [Elapsed Time (in mili sec)] ,
      @ResultXml,
      GETDATE()
from sys.dm_exec_requests
            inner join
      sys.dm_exec_sessions
            on sys.dm_exec_requests.session_id = sys.dm_exec_sessions.session_id
where DB_NAME(database_id) = ''tempdb'' and sys.dm_exec_requests.session_id >50
SET NOCOUNT OFF;',
            @database_name=N'tempdb',
            @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'TempDB',
            @enabled=1,
            @freq_type=4,
            @freq_interval=1,
            @freq_subday_type=4,
            @freq_subday_interval=3,
            @freq_relative_interval=0,
            @freq_recurrence_factor=0,
            @active_start_date=20140827,
            @active_end_date=99991231,
            @active_start_time=0,
            @active_end_time=235959,
            @schedule_uid=N'224d01bf-fc46-4e1c-bc27-90a0b4ac7ef1'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO





No comments:

Post a Comment