首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server CPU负载跟踪过程通过SPID导致死胡同?

SQL Server CPU负载跟踪过程通过SPID导致死胡同?
EN

Database Administration用户
提问于 2019-11-08 00:33:14
回答 1查看 126关注 0票数 -1

我们一直试图追踪一个神秘的错误在生产中不时出现,甚至可以持续10分钟,它似乎是可重复的,要么通过我执行的一个预定任务,或只是运行另外两个邪恶的SP的快速接续,然后我们收到这个稳定的CPU负载,没有明显的原因后,SP的长期完成。

请看一下在我们的QA服务器上复制的截图:

我遵循了本文的说明,但没有成功,因为您可以看到DBCC INPUTBUFFER(6)没有返回任何结果!

https://www.mssqltips.com/sqlservertip/2454/how-to-find-out-how-much-cpu-a-sql-server-process-is-really-using/

显然,我的问题还不清楚,我在想,如果有人知道DBCC INPUTBUFFER(ID)做了什么,我就会从屏幕截图中意识到,我在第三个结果窗格中没有收到我应该在哪里的结果。因此,我的问题是,为什么我没有收到这些信息,或者,我如何才能到达导致SQL服务器进程中CPU负载高的任务的根源呢?

EN

回答 1

Database Administration用户

发布于 2019-11-08 07:21:07

WhoIsActive过程将返回查询使用的CPU数量。我会设置一个作业,每隔几分钟运行一次这个过程,并将其记录到一个表中。

如果你需要帮助设置它,是布伦特·奥扎尔关于如何快速设置它的一个有用的帖子。(这里的代码是从文章中复制的)。当然,记住要相应地改变变量。

代码语言:javascript
运行
复制
SET NOCOUNT ON;

DECLARE @retention INT = 7,
        @destination_table VARCHAR(500) = 'WhoIsActive',
        @destination_database sysname = 'Crap',
        @schema VARCHAR(MAX),
        @SQL NVARCHAR(4000),
        @parameters NVARCHAR(500),
        @exists BIT;

SET @destination_table = @destination_database + '.dbo.' + @destination_table;

--create the logging table
IF OBJECT_ID(@destination_table) IS NULL
    BEGIN;
        EXEC dbo.sp_WhoIsActive @get_transaction_info = 1,
                                @get_outer_command = 1,
                                @get_plans = 1,
                                @return_schema = 1,
                                @schema = @schema OUTPUT;
        SET @schema = REPLACE(@schema, '<table_name>', @destination_table);
        EXEC ( @schema );
    END;

--create index on collection_time
SET @SQL
    = 'USE ' + QUOTENAME(@destination_database)
      + '; IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(@destination_table) AND name = N''cx_collection_time'') SET @exists = 0';
SET @parameters = N'@destination_table varchar(500), @exists bit OUTPUT';
EXEC sys.sp_executesql @SQL, @parameters, @destination_table = @destination_table, @exists = @exists OUTPUT;

IF @exists = 0
    BEGIN;
        SET @SQL = 'CREATE CLUSTERED INDEX cx_collection_time ON ' + @destination_table + '(collection_time ASC)';
        EXEC ( @SQL );
    END;

--collect activity into logging table
EXEC dbo.sp_WhoIsActive @get_transaction_info = 1,
                        @get_outer_command = 1,
                        @get_plans = 1,
                        @destination_table = @destination_table;

--purge older data
SET @SQL
    = 'DELETE FROM ' + @destination_table + ' WHERE collection_time < DATEADD(day, -' + CAST(@retention AS VARCHAR(10))
      + ', GETDATE());';
EXEC ( @SQL );

当您注意到问题发生时,请检查您的记录表并查看CPU列,这将使您了解哪些查询实际上使您的CPU上升。

一旦您发现导致此问题的查询,您将能够解决您的问题,如果您需要更多的帮助,在这个特定的查询,您可以在这里张贴在另一个问题。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/252810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档