SQL сервер Удалить и Выбрать в цикле - PullRequest
0 голосов
/ 12 октября 2018

Мне нужна помощь для оптимизации следующего кода:

MegaDelete:
DELETE TOP (1000) 
FROM SCADA.dbo.LOGSUMMATIONDATAENTRIES
where dataclassid IN (SELECT distinct OUTPUTDATACLASSID FROM SCADA.dbo.LIVEDATATABITEM where ENABLED = 0 and TABID =25)
IF @@ROWCOUNT>0 GOTO MegaDelete;

Проблема в том, что SQL-сервер замедляется после многократного выполнения цикла.(В таблице SCADA.dbo.LOGSUMMATIONDATAENTRIES есть миллионы строк) Поэтому я хочу сохранить результат (около 1500 значений INT)

SELECT distinct OUTPUTDATACLASSID FROM SCADA.dbo.LIVEDATATABITEM where ENABLED = 0 and TABID =25

в переменной, которая будет использоваться в цикле.Я думаю, что это улучшит эффективность УДАЛИТЬ.

Может кто-нибудь сказать мне, как написать сценарий?Большое спасибо заранее.

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать временную таблицу (или переменную таблицы) для хранения результата внутреннего запроса.Вы можете также захотеть использовать объединение вместо in.

Вот как использовать временную таблицу для этого:

SELECT distinct OUTPUTDATACLASSID 
INTO #LIVEDATATABITEM 
FROM SCADA.dbo.LIVEDATATABITEM 
where ENABLED = 0 
and TABID =25

MegaDelete:

DELETE TOP (1000) T
FROM SCADA.dbo.LOGSUMMATIONDATAENTRIES As T
JOIN #LIVEDATATABITEM ON dataclassid = OUTPUTDATACLASSID

IF @@ROWCOUNT>0 GOTO MegaDelete;

Обратите внимание, что индекс dataclassidможет также повысить производительность этого удаления, а также, каждая таблица, имеющая ограничения внешнего ключа для LOGSUMMATIONDATAENTRIES, замедляет удаление, поскольку SQL Server должен применять ограничения внешнего ключа.

...