2014-09-03 3 views
0

Да, он должен быть курсоромПервый FETCH NEXT FROM курсор, принимающий forever

Запрос на курсор очень прост - выполняется за долю секунды.

Но запрос возвращает более 300 000 строк

Первый звонок в

FETCH NEXT FROM cursor 

принимает навсегда - как 10 минут.

Что происходит? Что я могу сделать, чтобы исправить это?

Несколько раз он работает очень быстро.

Если я не запускал TSQL некоторое время, то несколько раз это очень быстро.

set nocount off 
DECLARE @randCountNew Int; 

select @randCountNew = COUNT(*) 
from [docSVsys] with (nolock) 
where [docSVsys].[visibility] in (0) 
    and [docSVsys].[rand] = 1 ; 

select @randCountNew; 

DECLARE @sIDprecict Int; 
DECLARE @randCountThis Int; 
DECLARE @valueIDthis SmallInt; 
DECLARE @lockIDthis TinyInt; 

select 'start CRREATE predict_cursor ' 

DECLARE predict_cursor CURSOR FOR 

SELECT [predict].[sID], [docSVenum1pred].[randCount], [docFieldLock].[lockID], [docSVenum1].[valueID] 
FROM [docSVsys] as [predict] with (nolock) 
left join [docSVsys] as [sample] with (nolock) on [sample].[docHash] = [predict].[docHash] 
               and [sample].[rand] = 1 
left join [docFieldLock] with (nolock) on [docFieldLock].[sID] = [predict].[sID] 
             and [docFieldLock].[fieldID] = 61 
             and [docFieldLock].[lockID] >= 3 
left join [docSVenum1pred] with (nolock) on [docSVenum1pred].[sID] = [predict].[sID] 
             and [docSVenum1pred].[enumID] = 61 
left join [docSVenum1] with (nolock) on [docSVenum1].[sID] = [sample].[sID] 
            and [docSVenum1].[enumID] = 61 
WHERE 
    ([predict].[RAND] is null or [predict].[RAND] = 0) 
    and [predict].[textUniqueWordCount] > 10 
    and [predict].[visibility] in (0) 
    and [sample].[docHash] is null 
    and [docFieldLock].[sID] is null 
    and ([docSVenum1pred].[randCount] is null or [docSVenum1pred].[randCount] <> @randCountNew) 
    --and [predict].[sID] = 379045 
ORDER BY [predict].[sID]; 

OPEN predict_cursor 

Select 'FETCH NEXT FROM predict_cursor' 

FETCH NEXT FROM predict_cursor INTO @sIDprecict, @randCountThis, @lockIDthis, @valueIDthis 

Select 'starting cursor' 

CLOSE predict_cursor; 
DEALLOCATE predict_cursor; 

Select 'done' 

Каждый столбец индексируется эти объединения находятся на PK, FK

+0

Как выглядит план выполнения? Имеет ли он рабочий стол? Также посмотрите на ожидающие задачи и 'статистика io' и' статистика времени', чтобы увидеть, занят или заблокирован. –

+0

@MartinSmith Я проверил – Paparazzi

+0

Предполагаю, что вы закрываете и освобождаете курсор - вы просто не показывали его здесь? – Donal

ответ

1

Убедитесь, что вы всегда рядом и освободить ваши курсоры - или избегать их использования, если это возможно.

CLOSE predict_cursor; 
DEALLOCATE predict_cursor; 
Смежные вопросы