У меня довольно большой скрипт, который использует курсор и вложенные в него курсоры.
Я столкнулся с проблемой производительности, я обнаружил, что последняя инструкция в скрипте, которая завершает основной цикл while, занимает большую часть времени:
SET STATISTICS TIME ON
FETCH NEXT FROM OldMetaOffer_cursor
INTO @MetaOfferId, @CustomerId, @OfferName, @CheckedOutById, @CheckOutDate, @LastOfferStatusId, @LastCalculationNumber, @CreatedByDisplayName, @CreatedById, @CreateDate, @CoordinatorId, @CoordinatorDate, @CentralAnalystId, @CentralAnalystDate, @DeployUserId, @DeploymentDate, @OwnerId;
SET STATISTICS TIME OFF
Время выполнения SQL Server:
- Время ЦП = 0 мс, истекшее время = 0 мс.
- Время выполнения SQL-сервера:
- Процессорное время = 4328 мс, прошедшее время = 4335 мс.
Это занимает более 4 секунд, в то время как один шаг в общей сложности занимает 4,6 с
Таблица мета-предложенийимеет ~ 150 тыс. строк, но я использую курсор на 8,5 тыс. строк.(Я фильтрую строки в начале).
Есть ли способ улучшить эту низкую производительность?
В начале цикла у меня есть:
DECLARE @MetaOfferId uniqueidentifier
, @MetaOfferTypeId int
, @CustomerId uniqueidentifier -- CustomerId
, @OfferName nvarchar(50) -- OfferName
, @CheckedOutById int -- CheckOutById
, @CheckOutDate datetime -- CheckOutDate
, @LastOfferStatusId int -- LastProcessStatusId
, @LastCalculationNumber nvarchar(20) -- LastCalculationNumber
, @CreatedByDisplayName nvarchar(300) -- CreatedByDisplayName
, @CreatedById int -- CreatedById
, @CreateDate datetime -- CreateDate
, @CoordinatorId int -- CoordinatorId
, @CoordinatorDate datetime -- CoordinatorDate
, @CentralAnalystId int -- CentralAnalystId
, @CentralAnalystDate datetime -- CentralAnalystDate
, @DeployUserId int -- DeployUserId
, @DeploymentDate datetime -- DeploymentDate
, @OwnerId int -- OwnerId
-- id statusu po zmapowaniu
, @NewLastOfferStatusId int
DECLARE OldMetaOffer_cursor CURSOR FOR
SELECT MetaOfferId, CustomerId, OfferName, CheckedOutById, CheckOutDate, LastOfferStatusId, LastCalculationNumber, CreatedByDisplayName, CreatedById,
CreateDate, CoordinatorId, CoordinatorDate, CentralAnalystId, CentralAnalystDate, DeployUserId, DeploymentDate, OwnerId
FROM [Other].[dbo].[MetaOffer] MO where
exists
(select * from [Other].[dbo].[OfferHistoryItem]
where MetaOfferId = MO.MetaOfferId and NewStatusId = 9 and DiscountId is null and KoosOfferId is null)
Может бытьесть проблема в том, что при следующей выборке этот запрос делается еще раз?Эти результаты нигде не буферизируются.Если да, то есть ли способ обналичить результат этого запроса и работать с данными, не выполняя запрос на каждом шаге цикла?