【发布时间】:2010-06-10 12:47:20
【问题描述】:
我在 Windows Server 2008 R2 上使用 SQL Server 2008,一切正常。
我偶尔会遇到 SQL Server 挂起的问题,因为我们的实时服务器上的 CPU 使用率为 100%。发生这种情况时,SQL Sever 上的所有等待时间似乎都分配给了 SOS_SCHEDULER_YIELD。
这是导致挂起的存储过程。我添加了“WITH (NOLOCK)”,试图解决似乎是锁定问题。
ALTER PROCEDURE [dbo].[MostPopularRead]
AS
BEGIN
SET NOCOUNT ON;
SELECT
c.ForeignId , ct.ContentSource as ContentSource
, sum(ch.HitCount * hw.Weight) as Popularity
, (sum(ch.HitCount * hw.Weight) * 100) / @Total as Percent
, @Total as TotalHits
from
ContentHit ch WITH (NOLOCK)
join [Content] c WITH (NOLOCK) on ch.ContentId = c.ContentId
join HitWeight hw WITH (NOLOCK) on ch.HitWeightId = hw.HitWeightId
join ContentType ct WITH (NOLOCK) on c.ContentTypeId = ct.ContentTypeId
where
ch.CreatedDate between @Then and @Now
group by
c.ForeignId , ct.ContentSource
order by
sum(ch.HitCount * hw.HitWeightMultiplier) desc
END
存储的过程从“ContentHit”表中读取,该表是一个跟踪网站内容何时被点击的表(它被频繁地点击——每分钟点击 4 到 20 次不等)。所以很明显这张表是问题的根源。有一个存储过程被调用来向 ContentHit 表添加命中轨道,它非常简单,它只是从传入的参数中构建一个字符串,其中涉及从一些查找表中进行一些选择,然后是主插入:
BEGIN TRAN
insert into [ContentHit]
(ContentId, HitCount, HitWeightId, ContentHitComment)
values
(@ContentId, isnull(@HitCount,1), isnull(@HitWeightId,1), @ContentHitComment)
COMMIT TRAN
ContentHit 表的 ID 列上有一个聚集索引,我在 CreatedDate 上添加了另一个索引,因为它在选择中使用。
当我分析问题时,我看到存储过程执行了 30 秒,然后发生 SQL 超时异常。如果它有所作为,使用它的 Web 应用程序是 ASP.NET,我正在使用 Subsonic (3) 来执行这些存储的过程。
有人可以告诉我如何最好地解决这个问题吗?我不在乎读取脏数据...
编辑: MostPopularRead 存储过程很少被调用 - 它在站点的主页上调用,但结果会被缓存一天。我看到的事件模式是,当我清除缓存时,主站点收到多个请求,并且它们都命中了存储的过程,因为它还没有被缓存。然后 SQL Server 就被刷爆了,只能通过重启 sql server 进程来解决。当我这样做时,通常 proc 会执行 OK(大约 200 毫秒)并将数据放回缓存中。
编辑 2: 我检查了执行计划,查询看起来很合理。正如我之前所说,当它运行时只需要大约 200 毫秒即可执行。我在 select 语句中添加了 MAXDOP 1 以强制它只使用一个 CPU 内核,但我仍然看到了这个问题。当我查看等待时间时,我发现 XE_DISPATCHER_WAIT、ONDEMAND_TASK_QUEUE、BROKER_TRANSMITTER、KSOURCE_WAKEUP 和 BROKER_EVENTHANDLER 占用了大量的等待时间。
编辑 3: 我之前认为这与我们的 ORM Subsonic 有关,但切换到 ADO.NET 后,错误仍然存在。
【问题讨论】:
-
听起来很奇怪,你用探查器检查过 Subsonic 是做什么的吗? SP 的调用方式与您手动调用的方式完全相同吗?
-
尝试将命中的内容中的数据拖到临时表中,然后对加入其他表的内容进行完整查询。
标签: sql-server performance sql-server-2008 locking subsonic3