【问题标题】:Diagnosing a SQL Server 2012 performance issue诊断 SQL Server 2012 性能问题
【发布时间】:2015-08-25 17:07:50
【问题描述】:

我注意到我的 SQL Server 上出现高 CPU 峰值。我运行了这个查询:

SELECT TOP 10 st.text
               ,st.dbid
               ,st.objectid
               ,qs.total_worker_time
               ,qs.last_worker_time
               ,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC

并注意到第一行包含以下内容:

CREATE PROCEDURE [dbo].[SPR_GEOIPCITY]
@myint1 bigint,
@myint2 bigint
 AS
SELECT top 1 city,latitude,longitude,areacode,region
FROM geoipcity
WHERE endipnum_conv >= @myint1
and startipnum_conv <= @myint2

此程序是多年前创建的,没有代理工作或网站模板可以触发重新创建此程序。为什么会列在这里?

【问题讨论】:

  • 我对这些表没有做太多,但我会认为重新创建的是查询计划,而不是过程。这个过程调用很多吗?
  • 可能与选项重新编译有关
  • 是的,它被称为很多。
  • 你问为什么你的程序被缓存,当它被调用很多的时候?我对吗?这是正常行为。查询优化器评估您的 SP,选择最佳计划并将其缓存,因此它在未来不必做同样的工作,而是直接执行。 SQL Server Query Optimizer

标签: sql sql-server-2012


【解决方案1】:

sys.dm_exec_query_stats 包含查询缓存中查询的统计信息。从缓存中删除查询后,它将不再显示在此虚拟表中。从缓存中删除项目很复杂,但添加项目很简单。 EVERY QUERY RUN 在运行时被添加到缓存中。如果查询正在运行,它会在某个时间点在缓存中。

您按总工作时间排序结果,因此顶部列出的结果是花费最多时间的结果。 SPR_GEOIPCITY 占用大量 CPU 时间。

您可以查看查询计划,但我会为您节省一些时间在 geoipcity.endipnum_convgeoipcity.startipnum 上建立索引——您应该会看到尖峰消失了。

【讨论】:

  • 我对它们有索引。一定是其他原因导致高 CPU 峰值
  • @JeffShain 很有趣。所以数据库告诉你这个例程导致了问题,但你不相信。 耸耸肩
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多