УДАЛИТЬ, используя WHILE LOOP в сделке - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь удалить таблицу, в которой всего около 39 тыс. Записей, но по некоторым причинам требуется время (около 1,5 минут) даже для удаления одной записи. Как я могу улучшить производительность моей операции удаления. Как я могу гарантировать, что активность журнала не займет много времени. Можно ли поместить оператор «DELETE» в цикл while, а затем открыть транзакцию и фиксировать ее каждый раз, когда она успешно завершается. Любой другой эффективный метод доступен?

[PrimaryKey] здесь имеет «кластерный индекс»

DECLARE @BatchCount INT;
SELECT @BatchCount  = COUNT(1) FROM #DHDID

DECLARE @Counter INT = 1

WHILE( @Counter <= @BatchCount)
BEGIN

BEGIN TRANSACTION

DECLARE @ID INT;

SELECT @ID = DHDID FROM #DHDID WHERE ID = @Counter

DELETE FROM <MYTABLE> WHERE [PrimaryKey] = @ID

COMMIT TRANSACTION

SET @Counter = @Counter + 1

END

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я бы попробовал создать индекс для таблицы #DHDID:

CREATE NONCLUSTERED INDEX [idx] ON [#DHDID] ([ID] ASC) INCLUDE ([DHDID])
0 голосов
/ 12 мая 2018

Исходя из вашего ответа, вы должны выполнить удаление на основе набора через объединение.Попробуйте что-то вроде этого:

Begin Tran
Delete m
    From <MyTable> m
        Inner Join DHDID d
            on d.DHDID = m.[PrimaryKey]

-- error detection code here
If <an error occurred>
    Rollback
Else
    Commit
...