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 / 问题 / 54463
Accepted
Greg Bala
Greg Bala
Asked: 2013-12-05 13:03:53 +0800 CST2013-12-05 13:03:53 +0800 CST 2013-12-05 13:03:53 +0800 CST

由于 LinkedServer 导致的 SQL Server 2012 CPU 峰值 - 如何找到有问题的查询?

  • 772

作为另一个问题(SQL Server 2012 性能问题(可能是由于链接服务器))的一部分,我发现 CPU 峰值与接收的字节数峰值直接相关,这让我相信这可能是由于链接服务器.

环境

2台服务器,一台服务器通过链接服务器访问第一个数据库,关于漂亮的图表,请参阅SQL Server 2012性能问题(可能是由于链接服务器)

在此处输入图像描述 在此处输入图像描述 CPU 峰值与 Bytes Received Spike 直接相关

问题 如何找到可能导致它的查询?

我们运行的查询类型

我已经完成了我们所有的存储过程,并且它们都进行了优化。以下是我们执行的链接服务器访问类型:

从远程表中选择一个值

select @userid = userid from FBGC.FBGCommon.dbo.players where playerid = @playerid

执行存储过程,返回最多几百行的结果集

exec FBGC.Fbgcommon.dbo.qPlayersFriends @PlayerID

执行返回一个值的存储过程

exec @HasEnoughCredits = FBGC.FBGCommon.dbo.qDoesPlayerHaveEnoughCredits @PlayerID, @Cost

从删除表中删除几行

delete from FBGC.FBGCommon.dbo.InactivePlayersToBeWarned where PlayerID = @AccountOwnerPlayerID

更新远程表中的一行,或向远程表中添加一行

update FBGC.FBGCommon.dbo.users set XP = XP + @XPForTitle where userid = @userid
insert into FBGC.FBGCommon.dbo.UserXPHistory (userid, time, XPReceived, XPFromTypeID, XPFromRealmID) values (@UserID, GETDATE(), @XPForTitle, 1, @ThisRealmID)

我相信所有这些都经过优化,但是,我们似乎正在通过链接服务器加入表!


一些有趣的等待统计数据,我不知道如何解释。从http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/查询

我在 CPU 峰值期间得到了这个: 在此处输入图像描述

当没有 CPU 峰值时我得到这个: 在此处输入图像描述

这些等待时间在带有 DB2 的服务器上,SQL 2012 服务器访问另一个运行 sql server 2008 的服务器上的远程数据库(有关图表,请参阅SQL Server 2012 性能问题(可能是由于链接服务器)


重新启动 sql server 帮助 - 在很长一段时间内没有 CPU 峰值。

我们还发现,重新启动 SQL Server 会有所帮助 - 我们可能会在几个小时内出现间歇性峰值,一个小时多次,然后在重新启动后,一个小时或更长时间没有峰值。


进程浏览器

正如@EdwardDortland 所建议的那样,我使用进程资源管理器查看在减速期间哪个线程消耗最多的CPU

不幸的是,没有一个线程是罪魁祸首——在 CPU 峰值期间,所有线程都会消耗更多的 CPU。尽管在 CPU 峰值期间我看到更多的线程以红色突出显示(意思是已删除) - 不知道如何解释这一点。

CPU 峰值之前的线程数 在此处输入图像描述

CPU 峰值期间的线程 在此处输入图像描述

sql-server sql-server-2012
  • 2 2 个回答
  • 2227 Views

2 个回答

  • Voted
  1. Edward Dortland
    2013-12-06T03:57:19+08:002013-12-06T03:57:19+08:00

    要回答这个问题:如何找到有问题的查询:

    由于您发布的图表中的峰值持续了几分钟,因此您有足够的时间使用以下方法:

    下载 sysinternals进程浏览器

    1. 启动进程资源管理器并找到 SQL Server 进程。
    2. 右键单击并选择属性
    3. 查看线程选项卡。
    4. 对 CPU 列进行排序并记下消耗最多 CPU 的线程 ID (TID)。

    使用此查询并查找该线程当前正在执行的查询:

    SELECT r.session_id, st.text, qp.query_plan
    FROM sys.dm_os_threads AS ot
    JOIN sys.dm_os_tasks AS t
    ON t.worker_address = ot.worker_address
    JOIN sys.dm_exec_requests AS r
    ON t.session_id = r.session_id
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
    CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
    WHERE os_thread_id = <thread id>
    
    • 3
  2. Best Answer
    Greg Bala
    2013-12-21T14:25:32+08:002013-12-21T14:25:32+08:00

    由于我找到了问题的原因,我想分享它以防其他人可能面临类似的情况。

    我的问题的原因不是链接服务器,而只是资源争用 - 这些数据库的 SQL Server 内存不足!

    所以 - 如果你有类似的症状,那可能只是记忆。

    这对我们来说不明显的原因是服务器上剩余大量内存,因为安装了错误(32 位)版本的 SQL Server - 它根本没有使用更多内存,因为它不能

    有关检查内存压力的好方法,请参阅此问题中的评论https://dba.stackexchange.com/questions/55028/sql-server-2012-sp1-cu7-much-slower-than-sql-server-2008 - 感谢 Paul White 和其他人的洞察力!

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

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

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

Sidebar

Stats

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

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

    • 3 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • 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
    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
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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