2010-03-10 55 views
1

我有一個簡單的過程,從表中選擇1000行。爲了清楚起見,這裏的存儲過程是什麼樣子:爲什麼SQL Server在選擇語句期間返回一些行之後會停止運行?

alter procedure dbo.GetDomainForIndexing 
    @Amount int=1, 
    @LastID bigint, 
    @LastFetchDate datetime 
as 
begin 

    select top (@Amount) * 
    from DomainName with(readuncommitted) 
    where LastUpdated > @LastFetchDate 
     and ID > @LastID 
     and ContainsAdultWords is not null 
order by ID 

end 

我一直有問題,它會運行此特定程序細一堆倍,唯一的區別在於不同的@LastID值每次都通過。一旦我得到一個特定的ID,程序會立即返回前880行(管理工作室發生這種情況),然後坐在那裏,在接下來的6分鐘內停下來,然後返回剩餘的120行。

究竟是什麼會導致這樣的行爲?沒有與連接關聯的事務,並且沒有連接池問題。 (readuncommitted)位不影響該問題。這個問題既出現在我的應用程序中,也出現在我將命令文本複製到SQL Management Studio進行測試的時候;事實上,我發現了這種奇怪的拖延行爲。最初我只是想弄清楚爲什麼這個程序能夠很好地工作,然後突然開始拖延,沒有明顯的原因。

任何想法?

UPDATE

要求883行時,但不是要求882行時的問題也會發生(拖延已返回880行後)。

UPDATE 2

sys.sysprocessessys.dm_exec_requests選擇指示的PAGEIOLATCH_SH一個lastwaittype。我該怎麼辦?

回答

0

很可能 「參數sniffin」 G和違規@LastID值的次優緩存計劃 試試這個:

DECLARE @ILastID bigint 
SET @ILastID = @LastID 

select top (@Amount) * 
from DomainName with(readuncommitted) 
where LastUpdated > @LastFetchDate and ID > @ILastID and ContainsAdultWords is not null 
order by ID 

另一種選擇:

是什麼sysprocesses中說的那樣LastWaittype? ASYNCH_NETWORK_IO? 如果是這樣,那麼客戶端無法處理SQL Server輸出

+0

已嘗試將參數嗅探作爲解決方案,但沒有幫助。關於lastwaittype,你是什麼意思?我沒有數據庫管理員:D – 2010-03-10 21:03:31

+0

基本上,客戶端窒息數據和填充SQL Server網絡緩衝區...更新後,你有沒有屏蔽*所有*參數 – gbn 2010-03-10 21:15:04

+0

我開除了程序,然後一次880行已經返回,我運行了'select * from sys.dm_exec_requests',它返回了一行,狀態爲'RUNNING',last_wait_type爲'MISCELLANEOUS'。所以我猜這不是'ASYNCH_NETWORK_IO' ... – 2010-03-10 21:23:02

0

您是否嘗試過重建DomainName上的索引?

+0

已經嘗試過,沒有用,謝謝你的建議。 – 2010-03-10 21:03:49

相關問題