我在Windows Server 2008 R2上使用SQL Server 2008,所有這些都已啓動。SQL Server鎖定/掛起問題
我偶爾會遇到SQL Server在我們的活動服務器上100%的CPU使用率懸掛問題。在發生這種情況時,似乎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上添加了另一個索引,因爲在select中使用了這個索引。
當我分析問題時,我看到存儲過程正好執行了30秒,然後發生SQL超時異常。如果它有所作爲,使用它的Web應用程序是ASP.NET,並且我使用Subsonic(3)來執行這些存儲的特效。
有人能告訴我如何最好地解決這個問題嗎?我不在乎讀髒數據...
編輯: MostPopularRead存儲過程很少被稱爲 - 它在網站的主頁上調用,但結果被緩存了一天。我看到的事件模式是當我清除緩存時,主站點發出多個請求,並且它們都會觸發存儲的proc,因爲它尚未被緩存。 SQL Server然後最大化,並且只能通過重新啓動sql server進程來解決。當我這樣做時,通常proc會執行OK(約200毫秒)並將數據放回緩存中。
編輯2: 我檢查了執行計劃,並且查詢看起來很有聲音。正如我之前說過的那樣,它只需要大約200毫秒的時間來執行。我在選擇語句中添加了MAXDOP 1,強制它只使用一個CPU內核,但我仍然看到這個問題。當我觀察等待時間時,我發現XE_DISPATCHER_WAIT,ONDEMAND_TASK_QUEUE,BROKER_TRANSMITTER,KSOURCE_WAKEUP和BROKER_EVENTHANDLER正在佔用大量的等待時間。
編輯3: 我以前認爲這與subsonic,我們的ORM有關,但切換到ADO.NET,erros仍然是活的。
聽起來很奇怪,你是否與Profiler檢查了Subsonic的作用? SP的調用方式與手動完全相同嗎? – VladV 2010-06-11 07:00:49
嘗試將內容匹配中的數據拖到臨時表中,然後在加入其他表時進行完整查詢。 – Paul 2017-05-03 07:39:15