在过去的一个月中,我正常运行的Server 2005 SP3服务器开始遇到随机阻塞问题。每次发生这种情况时,我都会运行我的阻塞脚本来查看什么阻塞了什么(参见下面的代码块)。我看到导致块的SPID,但它们通常是TEMPDB活动,每次我执行阻塞脚本时,它找到的对象导致块更改到其他东西。这使得我们很难找出到底是什么导致了拖延。如果我在exec_requests DMV上运行一些查询,就会看到暂停进程的等待类型PAGELATCH。我已经采取了所有的最佳实践步骤来提高tempdb的性能;tempdb数据和日志文件都拥有自己的卷,tempdb是简单的恢复模型,它有8个数据文件,我甚至打开了跟踪标志TF1118。我有一个用于创建新数据库的脚本,我可以使用该脚本在服务器上复制阻塞(大多数情况下)。但是我已经在这个服务器上使用我的创建数据库脚本一年多了,到目前为止没有任何问题.请给我什么建议,或者我怎样才能找出真正的原因?
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SET NOCOUNT ON
    DECLARE @Processes TABLE (SPID INT, Blocked INT, DBID INT, ProgramName VARCHAR(100), HostName VARCHAR(50), CMD VARCHAR(50), 
                                CPU INT, PhysicalIO INT, Status VARCHAR(50), ECID INT)
    INSERT @Processes (SPID, Blocked, DBID, ProgramName, HostName, CMD, CPU, PhysicalIO, Status, ECID)
    SELECT spid, blocked, dbid, [program_name], hostname, cmd, cpu, physical_io, status, ecid
    FROM sys.sysprocesses (NOLOCK)
    WHERE spid <> blocked
    DECLARE @BlockingIDs TABLE (ID INT)
    INSERT @BlockingIDs (ID)
    SELECT Blocked FROM @Processes WHERE Blocked IS NOT NULL AND Blocked <> 0
   -- If there are blocked processes...
    IF (SELECT COUNT(ID) FROM @BlockingIDs) > 0
        BEGIN
            DECLARE @BlockerData TABLE (RowID INT IDENTITY(1,1), BlockingSPID INT, SqlText NVARCHAR(4000), ObjectID INT, ObjectName VARCHAR(400), 
                                        DatabaseName VARCHAR(100), ProgramName VARCHAR(100), HostName VARCHAR(50), CMD VARCHAR(50))
            CREATE TABLE #ON (Name VARCHAR(400))
            INSERT @BlockerData (BlockingSPID, SqlText, ObjectID, ObjectName, DatabaseName, ProgramName, HostName, CMD)
            SELECT DISTINCT spid, master.dbo.DBA_GetSQLTextForSPID(spid), 
            master.dbo.DBA_GetSQLObjectIDForSPID(spid), '', DB_NAME([dbid]), ProgramName, HostName, CMD
            FROM @Processes
            WHERE SPID IN (SELECT ID FROM @BlockingIDs)
            ORDER BY SPID
            DECLARE @RowIndex INT,
                    @RowCount INT,
                    @ObjectID INT,
                    @ObjectName VARCHAR(200),
                    @DB VARCHAR(50),
                    @Sql NVARCHAR(300)
            SELECT @RowCount = COUNT(RowID) FROM @BlockerData
            SET @RowIndex = 1
            WHILE @RowIndex <= @RowCount
                BEGIN
                    SELECT @ObjectID = ObjectID, @DB = DatabaseName FROM @BlockerData WHERE RowID = @RowIndex
                    SET @Sql = 'SELECT Name FROM ' + @DB + '..sysObjects WHERE ID = ' + CONVERT(VARCHAR(50), @ObjectID)
                    DELETE #ON
                    INSERT #ON (Name) EXEC sp_ExecuteSql @Sql
                    UPDATE @BlockerData SET ObjectName = (SELECT Name FROM #ON) WHERE RowID = @RowIndex
                    SET @RowIndex = @RowIndex + 1
                END
            DROP TABLE #ON
            SELECT BlockingSPID, SqlText, ObjectID, ObjectName, DatabaseName, ProgramName, HostName, CMD FROM @BlockerData
            -- Identify the spids being blocked.
            SELECT t2.spid AS 'Blocked spid', t2.blocked AS 'Blocked By', 
            master.dbo.DBA_GetSQLTextForSPID(t2.spid) AS 'SQL Text', 
            t2.CPU, t2.PhysicalIO, DatabaseName = DB_NAME(t2.[dbid]), t2.ProgramName, t2.HostName, t2.Status, t2.CMD, t2.ECID
            FROM @Processes t1, @Processes t2 
            WHERE t1.spid = t2.blocked
            AND t1.ecid = t2.ecid
            AND t2.Blocked IN (SELECT ID FROM @BlockingIDs)
            ORDER BY t2.blocked, t2.spid, t2.ecid
        END
    ELSE -- No blocked processes.
        BEGIN
            SELECT 'No processes blocked.' 
        END发布于 2011-07-08 22:03:57
去拿一份sp_whoisactive的副本并使用它。这应该会给你带来一些好处。还请查看wait_stats车管所,看看等待的原因是什么,对阻滞剂。如果您看到的是PAGELATCH_IO,那么您可能遇到了某种存储问题。使用perfmon查找缓慢响应的IO。
https://serverfault.com/questions/288434
复制相似问题