1. 程式人生 > >[實戰]分鐘級簡易資料庫執行日誌

[實戰]分鐘級簡易資料庫執行日誌

相信很多童鞋都知道資料庫忽然效能下來的時候,在沒有其他輔助工具的情況下,會登上去跑個sp_who2來看看就行什麼東西block住了,那麼其實就可以用這個東西來做文章了。直接貼段程式碼吧,核心的出自Kent之手,我只是把他變成個SP,並起了個SQL Schedule Job設定成每分鐘跑一次,跑掛了不要緊,下一分鐘再跑就行,我們要的只是簡易日誌。這樣就不用說搶著時間點去跑sp_who2了。出來的效果大概是這樣,最後一列eventinfo就是在跑什麼,就連schedule job的step id都能出來。enjoy :) 

 

 

CREATE PROC [
dbo].[usp_log_sp_who2] AS BEGIN DECLARE @tempTable TABLE (SPID INT,Status VARCHAR(255), [Login] VARCHAR(255),HostName VARCHAR(255), BlkBy VARCHAR(255),DBName VARCHAR(255), Command VARCHAR(255),CPUTime INT, DiskIO INT,LastBatch VARCHAR(255), ProgramName VARCHAR
(255),SPID2 INT, REQUESTID INT, [parameters] SMALLINT, eventinfo NVARCHAR(MAX)); INSERT INTO @tempTable (spid, [status], [login], hostname, blkby, dbname, command, cputime, diskio, lastbatch, programname, spid2, requestid) EXEC sp_who2 DECLARE @t1 TABLE (eventtype nvarchar(MAX), [
parameters] SMALLINT, eventinfo NVARCHAR(MAX)) DECLARE @sql NVARCHAR(MAX) DECLARE @spid INT, @parameters smallint, @eventinfo NVARCHAR(MAX) DECLARE curTempTable CURSOR FOR SELECT spid FROM @tempTable FOR UPDATE OF [parameters], [eventinfo] OPEN curTempTable FETCH curTempTable INTO @spid WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM @t1 SET @sql = N'dbcc inputbuffer(' + CONVERT(NVARCHAR(MAX), @spid) + N')' INSERT @t1 EXEC(@sql) SELECT TOP 1 @parameters = [parameters], @eventinfo = [eventinfo] FROM @t1 UPDATE @tempTable SET [parameters] = @parameters, [eventinfo] = @eventinfo WHERE CURRENT OF curTempTable FETCH NEXT FROM curTempTable INTO @spid END CLOSE curTempTable DECLARE @now DATETIME = GETDATE() DELETE LOG_SP_WHO2 WHERE [Branch]<DATEADD(day, -7, @now) --這裡-7其實隨你喜歡,我只是需要一週內的日誌而已,所以就把一週前的刪除了
INSERT INTO LOG_SP_WHO2 SELECT @now, * FROM @tempTable END

 

--基礎表
CREATE TABLE [dbo].[LOG_SP_WHO2](
    [Branch] [datetime] NULL,
    [SPID] [int] NULL,
    [Status] [varchar](255) NULL,
    [Login] [varchar](255) NULL,
    [HostName] [varchar](255) NULL,
    [BlkBy] [varchar](255) NULL,
    [DBName] [varchar](255) NULL,
    [Command] [varchar](255) NULL,
    [CPUTime] [int] NULL,
    [DiskIO] [int] NULL,
    [LastBatch] [varchar](255) NULL,
    [ProgramName] [varchar](255) NULL,
    [SPID2] [int] NULL,
    [REQUESTID] [int] NULL,
    [parameters] [smallint] NULL,
    [eventinfo] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

--索引的隨君所願,我這裡只是建了個按時間的聚集索引(非唯一) CREATE CLUSTERED INDEX [IX_LOG_SP_WHO2] ON [dbo].[LOG_SP_WHO2] ( [Branch] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO