zoukankan      html  css  js  c++  java
  • 怎样有效地跟踪SQL Server的阻塞问题?(网转)

    http://support.microsoft.com/gp/anxin_techtip7/zh-cn

    个人优化整理:

    USE [gs_gep_lmz]

    GO

    CREATE TABLE [dbo].[Blocking_SqlText](

          [spid] [smallint],

          [sql_text] [nvarchar](2000),

          [Capture_Timestamp] [datetime]

    )

    GO

    CREATE TABLE [dbo].[Blocking_sysprocesses](  [spid] [smallint] NULL,  [kpid] [int] NULL,  [blocked] [int] NULL,  [waitType] [nvarchar](50) NULL,  [waitTime] [nvarchar](50) NULL,  [lastWaitType] [nvarchar](50) NULL,  [waitResource] [nvarchar](50) NULL,  [dbID] [int] NULL,  [uid] [int] NULL,  [cpu] [int] NULL,  [physical_IO] [int] NULL,  [memusage] [nvarchar](10) NULL,  [login_Time] [datetime] NULL,  [last_Batch] [datetime] NULL,  [open_Tran] [nvarchar](50) NULL,  [status] [nvarchar](50) NULL,  [sid] [int] NULL,  [hostName] [nvarchar](50) NULL,  [program_name] [nvarchar](100) NULL,  [hostProcess] [nvarchar](100) NULL,  [cmd] [nvarchar](2000) NULL,  [nt_Domain] [nvarchar](50) NULL,  [nt_UserName] [nvarchar](50) NULL,  [net_Library] [nvarchar](50) NULL,  [loginame] [nvarchar](50) NULL,  [context_Info] [nvarchar](2000) NULL,  [sql_Handle] [binary](20) NULL,  [Capture_Timestamp] [datetime] NULL )

    GO  

    CREATE PROCEDURE [dbo].[checkBlocking_lmz]

    AS

    BEGIN

    SET NOCOUNT ON;

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    declare @Duration   int -- in milliseconds, 1000 = 1 sec

    declare @now            datetime

    declare @Processes  int

    select  @Duration = 100  -- in milliseconds, 1000 = 1 sec

    select  @Processes = 0

    select @now = getdate()

      CREATE TABLE #Blocks_rg(  [spid] [smallint] NULL,  [kpid] [int] NULL,  [blocked] [int] NULL,  [waitType] [nvarchar](50) NULL,  [waitTime] [nvarchar](50) NULL,  [lastWaitType] [nvarchar](50) NULL,  [waitResource] [nvarchar](50) NULL,  [dbID] [int] NULL,  [uid] [int] NULL,  [cpu] [int] NULL,  [physical_IO] [int] NULL,  [memusage] [nvarchar](10) NULL,  [login_Time] [datetime] NULL,  [last_Batch] [datetime] NULL,  [open_Tran] [nvarchar](50) NULL,  [status] [nvarchar](50) NULL,  [sid] [int] NULL,  [hostName] [nvarchar](50) NULL,  [program_name] [nvarchar](100) NULL,  [hostProcess] [nvarchar](100) NULL,  [cmd] [nvarchar](2000) NULL,  [nt_Domain] [nvarchar](50) NULL,  [nt_UserName] [nvarchar](50) NULL,  [net_Library] [nvarchar](50) NULL,  [loginame] [nvarchar](50) NULL,  [context_Info] [nvarchar](2000) NULL,  [sql_Handle] binary(20) NULL,  [Capture_Timestamp] [datetime] NULL )

         

    INSERT INTO #Blocks_rg 

    SELECT

          [spid],

          [kpid],

          [blocked],

          [waitType],

          [waitTime],

          [lastWaitType],

          [waitResource],

          [dbID],

          [uid],

          [cpu],

          [physical_IO],

          [memusage],

          [login_Time],

          [last_Batch],

          [open_Tran],

          [status],

          [sid],

          [hostName],

          [program_name],

          [hostProcess],

          [cmd],

          [nt_Domain],

          [nt_UserName],

          [net_Library],

          [loginame],

          [context_Info],

          [sql_Handle],

          @now as [Capture_Timestamp]

    FROM master..sysprocesses where blocked <> 0

    AND waitTime > @Duration     

         

    SET @Processes = @@rowcount

    INSERT into #Blocks_rg

    SELECT

          src.[spid],

          src.[kpid],

          src.[blocked],

          src.[waitType],

          src.[waitTime],

          src.[lastWaitType],

          src.[waitResource],

          src.[dbID],

          src.[uid],

          src.[cpu],

          src.[physical_IO],

          src.[memusage],

          src.[login_Time],

          src.[last_Batch],

          src.[open_Tran],

          src.[status],

          src.[sid],

          src.[hostName],

          src.[program_name],

          src.[hostProcess],

          src.[cmd],

          src.[nt_Domain],

          src.[nt_UserName],

          src.[net_Library],

          src.[loginame],

          src.[context_Info],

          src.[sql_Handle]

          ,@now as [Capture_Timestamp]

    FROM  master..sysprocesses src inner join #Blocks_rg trgt on trgt.blocked = src.[spid]

    if @Processes > 0

    BEGIN

          INSERT [dbo].[Blocking_sysprocesses]

          SELECT * from #Blocks_rg

         

    DECLARE @SQL_Handle binary(20), @SPID smallInt;

    DECLARE cur_handle CURSOR FOR SELECT sql_Handle, spid FROM #Blocks_rg;

    OPEN cur_Handle

    FETCH NEXT FROM cur_handle INTO @SQL_Handle, @SPID

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

    INSERT [dbo].[Blocking_SqlText]

    SELECT      @SPID, CONVERT(nvarchar(4000), [text]) ,@now as [Capture_Timestamp] from ::fn_get_sql(@SQL_Handle)

    FETCH NEXT FROM cur_handle INTO @SQL_Handle, @SPID

    END

    CLOSE cur_Handle

    DEALLOCATE cur_Handle

    END

    DROP table #Blocks_rg

    END

    GO

    USE msdb;

    GO

    EXEC dbo.sp_add_job

          @job_name = N'MonitorBlocking_lmz';

    GO

    EXEC sp_add_jobstep       @job_name = N'MonitorBlocking_lmz',

          @step_name = N'execute blocking script', 

          @subsystem = N'TSQL',

          @command = N'exec checkBlocking_lmz',

    @database_name=N'gs_gep_lmz';

    GO   

    EXEC sp_add_jobSchedule

          @name = N'ScheduleBlockingCheck_lmz',

          @job_name = N'MonitorBlocking_lmz',

          @freq_type = 4, -- daily

          @freq_interval = 1,

          @freq_subday_type = 4,

          @freq_subday_interval = 1

    EXEC sp_add_jobserver @job_name = N'MonitorBlocking_lmz', @server_name = N'(local)'

  • 相关阅读:
    MySQL存储树形数据优化技笔记
    收集18个高大上的浏览器小技巧
    收集18个高大上的浏览器小技巧
    盘点15个不起眼但非常强大的 Vim 命令
    盘点15个不起眼但非常强大的 Vim 命令
    为什么开发者应该摒弃敏捷?(转)
    为什么开发者应该摒弃敏捷?(转)
    MySQL 中事务、事务隔离级别详解
    pandas数据对齐
    Bokeh绘图
  • 原文地址:https://www.cnblogs.com/BrianLee/p/3242129.html
Copyright © 2011-2022 走看看