Избегайте временной таблицы, если это возможно
Используется только память.
Вы можете попробовать это:
DELETE MatchEvent
FROM MatchEvent e ,
MatchResult r
WHERE e.MatchId = r.MatchId
Если вы не можете избежать временной таблицы
Я собираюсь высунуть свою шею сюда и сказать: вам не нужен индекс для вашей временной таблицы , потому что вы хотите, чтобы временная таблица была наименьшей таблицей в уравнении, и вы хотите в таблицу его отсканировать (потому что все строки актуальны). Индекс не поможет вам здесь.
Делать небольшие кусочки работы
Работа над несколькими строками одновременно.
Это, вероятно, замедлит выполнение, но должно освободить ресурсы.
- по одной строке за раз
SELECT @MatchId = min(MatchId) FROM MatchResult
WHILE @MatchId IS NOT NULL
BEGIN
DELETE MatchEvent
WHERE Match_Id = @MatchId
SELECT @MatchId = min(MatchId) FROM MatchResult WHERE MatchId > @MatchId
END
- Несколько строк одновременно
CREATE TABLE #tmp ( MatchId Varchar(50) )
/* get list of lowest 1000 MatchIds: */
INSERT #tmp
SELECT TOP (1000) MatchId
FROM MatchResult
ORDER BY MatchId
SELECT @MatchId = min(MatchId) FROM MatchResult
WHILE @MatchId IS NOT NULL
BEGIN
DELETE MatchEvent
FROM MatchEvent e ,
#tmp t
WHERE e.MatchId = t.MatchId
/* get highest MatchId we've procesed: */
SELECT @MinMatchId = MAX( MatchId ) FROM #tmp
/* get next 1000 MatchIds: */
INSERT #tmp
SELECT TOP (1000) MatchId
FROM MatchResult
WHERE MatchId > @MinMatchId
ORDER BY MatchId
END
Это удаляет до 1000 строк одновременно.
Чем больше строк вы удаляете за раз, тем больше ресурсов вы будете использовать, но тем быстрее они будут работать (пока у вас не закончится ресурс!). Вы можете поэкспериментировать, чтобы найти более оптимальное значение, чем 1000.