AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 106246
Accepted
Dave
Dave
Asked: 2015-07-08 13:14:58 +0800 CST2015-07-08 13:14:58 +0800 CST 2015-07-08 13:14:58 +0800 CST

供应商 SQL Server 数据库中的 CPU 使用过多

  • 772

背景:我有一个供应商提供的 SQL Server 2012 数据库,因此对查询和表的修改是有限的。我们确实拥有数据库,因此我们可以添加和维护索引。

索引尚未维护或重建,因此有数百个索引处于 30% 以上的碎片化状态……这是我最初怀疑大量和持续使用 CPU 的原因,但在我们努力解决此问题的同时,我正在调查其他问题。

我没有看到任何明显的内存或磁盘 IO 压力。这是一个相对较少使用的 OLTP 系统,并且已经为资源提供了很好的配置......它真的不应该有任何问题,或者至少应该只有明显的峰值,没有持续的 CPU 使用。

两个问题:

  1. 整个数据库中过时的统计信息和高度碎片化的索引是否会导致 CPU 使用过多?

  2. 下面列出的来自该系统的等待统计信息的组合是否会使索引碎片的解释不可信?

信息:

WaitType                                    Wait_S
---------------------------------           -----------    
CXPACKET                                    773345.21
PAGELATCH_UP                                737295.83
SOS_SCHEDULER_YIELD                         140425.24
LATCH_EX                                    69877.95
RESOURCE_SEMAPHORE_QUERY_COMPILE            60985.48
LCK_M_SCH_S                                 39488.17

等待结果的来源查询:

WITH [Waits] AS
(
 SELECT
     [wait_type],
     [wait_time_ms] / 1000.0 AS [WaitS],
     ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
     [signal_wait_time_ms] / 1000.0 AS [SignalS],
     [waiting_tasks_count] AS [WaitCount],
     100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
     ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
 FROM 
     sys.dm_os_wait_stats
 WHERE 
     [wait_type] NOT IN (... common waits )
     AND [waiting_tasks_count] > 0)
SELECT
    MAX ([W1].[wait_type]) AS [WaitType],
    CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],
    CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],
    CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],
    MAX ([W1].[WaitCount]) AS [WaitCount],
    CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],
    CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],
    CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],
    CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S]
FROM [Waits] AS [W1]
INNER JOIN [Waits] AS [W2] ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum]
HAVING SUM ([W2].[Percentage]) - MAX ([W1].[Percentage]) < 95;
sql-server performance
  • 1 1 个回答
  • 420 Views

1 个回答

  • Voted
  1. Best Answer
    Kin Shah
    2015-07-08T15:05:35+08:002015-07-08T15:05:35+08:00

    索引尚未维护或重建,因此有数百个索引处于 30% 以上的碎片化状态……这是我最初怀疑大量和持续使用 CPU 的情况……

    和

    整个数据库中过时的统计信息和高度碎片化的索引是否会导致 CPU 使用过多?

    这是部分正确的。索引碎片不会导致高 CPU。内部碎片意味着页面上有很多可用空间,扫描索引将花费更多时间。这将导致更多的磁盘 IO 并需要更多的内存来存储索引(由于索引页中的可用空间),这意味着缓冲池中会浪费更多的空间。

    错误的统计信息将导致查询优化器生成低效(错误)的计划,从而导致性能下降,例如,需要 2 秒才能完成的查询将需要 2 分钟或 2 小时等,因为 sql server 会做出错误的猜测(例如,将估计 1 行作为与实际的 2M 行相反)并且可能会选择执行大量读取的不合适的连接,或者可以选择错误的连接,例如嵌套循环,其中散列或合并连接本来是更好的选择。糟糕的(过时的或旧的)统计数据会使您的 CPU 处于更高的水平。

    因此,对您的统计数据和索引进行碎片整理肯定会有所帮助。我建议您使用Ola 的 Index Maintenance 解决方案,而不是自己设计解决方案。

    请参阅 Kendra 的精彩帖子:为什么索引碎片和不良统计信息并不总是问题(视频)?

    Remus Rusanu 有一篇非常好的博客文章:The Bizzaro Guide to SQL Server Performance (注意:不要遵循它!)

    下面列出的来自该系统的等待统计信息的组合是否会使索引碎片的解释不可信?

    我相信在您的 sql server 配置级别可能有更多的事情需要解决,而不仅仅是担心索引碎片。另外 CXPACKET 等待本身不是问题。

    要检查的事情:

    • MAXDOP - 将其从默认值设置为更合理的值。
    • 确保打开 TF 1117 和 1118 以解决 tempdb 争用。并根据kb-2154845具有多个 tempdb 数据文件
    • 开始查看您的查询 -前 20 个 CPU 使用者,看看他们是否使用了正确的索引,没有进行任何隐式转换等。
    • 打开optimize for ad hoc workloads
    • 请参阅 MS知识库 文章 2964518:针对具有高性能工作负载的 SQL Server 2012 和 SQL Server 2014 的推荐更新和配置选项
    • 确保服务器使用 高性能电源计划选项。

    您可以使用Glenn Berry 的诊断查询 - 2012 版

    -- Signal Waits for instance  (Query 27) (Signal Waits)
    SELECT CAST(100.0 * SUM(signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) 
    AS [% Signal (CPU) Waits],
    CAST(100.0 * SUM(wait_time_ms - signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) 
    AS [% Resource Waits]
    FROM sys.dm_os_wait_stats WITH (NOLOCK) OPTION (RECOMPILE);
    
    -- Signal Waits above 15-20% is usually a sign of CPU pressure
    

    和

    -- Top Cached SPs By Total Worker time (SQL Server 2012). Worker time relates to CPU cost  (Query 44) (SP Worker Time)
    SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], 
    qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, 
    ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
    qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count 
    AS [avg_elapsed_time], qs.cached_time
    FROM sys.procedures AS p WITH (NOLOCK)
    INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
    ON p.[object_id] = qs.[object_id]
    WHERE qs.database_id = DB_ID()
    ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
    
    -- This helps you find the most expensive cached stored procedures from a CPU perspective
    -- You should look at this if you see signs of CPU pressure
    

    此外,Joe Sack 还谈到了 SQL Server CPU 性能问题的故障排除方法

    • 3

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve