Member 12965461 Ответов: 1

Как быстрее обновить таблицу, содержащую миллионы записей?


Я должен обновить таблицу, в которой есть миллион записей.

Я использовал следующий запрос.

1.я поместил pkeys для обновления во временную таблицу
select * into tempPkey  
  from Prd WHERE status<>'d' and pKey NOT IN (SELECT PrdPKey FROM PrdGroupRel where status <>'d')


2. Затем я использую приведенную ниже команду обновления для обновления.
SET NOCOUNT ON
DECLARE    @PKey  AS Varchar(16) ;

DECLARE UPDATE_CURSOR CURSOR FOR

SELECT pkey FROM tempPkey FOR UPDATE 

OPEN UPDATE_CURSOR
FETCH NEXT FROM UPDATE_CURSOR
INTO @PKey

WHILE (@@FETCH_STATUS = 0)
BEGIN
BEGIN Transaction



Update Cndcpmain set status ='d' ,Hostsource='INC7892752_30Oct2018'  
where mergedkey like '%'+@PKey+'%'  and CndcpMetapkey='00100000007gu6ib' and salesorg='MS01' and status<>'d'

Print 'Pkey Update completed :' + @Pkey+' ' + convert(varchar(50),Getdate() )

COMMIT Transaction  
    FETCH NEXT FROM UPDATE_CURSOR
    INTO @PKey
END

CLOSE UPDATE_CURSOR
DEALLOCATE UPDATE_CURSOR

SET NOCOUNT OFF

Я отключил триггеры и индексы в таблице Cndcpmain. но только 14-15 pkeys обновляются за 1 минуту. Есть в общей сложности 18916 pkeys для обновления, и ожидаемое время составляет 20 часов. Можем ли мы ускорить это?

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

Что я уже пробовал:

[См. код выше]

1 Ответов

Рейтинг:
7

Kornfeld Eliyahu Peter

Курсор, вероятно, самый медленный способ делать вещи в SQL и должен использоваться только тогда, когда есть реальная необходимость...
Мне кажется, что с вашим случаем лучше справиться с помощью простого заявления об обновлении...
Что-то вроде этого должно было сработать.:

UPDATE CNDCPMAIN 
SET 
	CNDCPMAIN.STATUS = 'D',
	CNDCPMAIN.HOSTSOURCE = 'INC7892752_30OCT2018'  
FROM PRD 
WHERE
	PRD.STATUS <> 'D' AND 
	PRD.PKEY NOT IN (SELECT PRDGROUPREL.PRDPKEY FROM PRDGROUPREL WHERE PRDGROUPREL.STATUS <> 'D') AND
	CNDCPMAIN.MERGEDKEY LIKE '%' + PRD.PKEY + '%'  AND 
	CNDCPMAIN.CNDCPMETAPKEY = '00100000007GU6IB' AND 
	CNDCPMAIN.SALESORG = 'MS01' AND 
	CNDCPMAIN.STATUS <> 'D'


Member 12965461

единственная проблема при использовании приведенного выше запроса заключается в том, что SQL server перестает работать через 20 минут и автоматически закрывается.

Richard Deeming

Сам SQL Server или приложение, которое вы используете для выполнения запроса?

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

Если это SQL Server, то это звучит как ошибка, и вы должны сообщить об этом в Microsoft.

Richard Deeming

Ты упускаешь самое главное. WHERE ключевое слово перед фильтрами. :)

Kornfeld Eliyahu Peter

Вот это да!