Каков наилучший способ удалить миллионы записей в TSQL? - PullRequest
4 голосов
/ 29 декабря 2010

У меня есть следующая структура таблицы

Table1       Table2        Table3
--------------------------------
 sId          sId           sId
 name          x              y
  x1          x2             x3

Я хочу удалить из таблицы 1 все записи, у которых нет совпадающих записей в таблице 3 на основе sId, и если sId присутствует в таблице 2, то не удаляйте записи из таблицы 1. В таблице 1 содержится около 20,15 и 10 миллионов записей , table2 & table3 соотв. - Я сделал что-то вроде этого

Delete Top (3000000)
        From Table1 A
        Left Join Table2 B
        on A.Name ='XYZ' and
           B.sId = A.sId
        Left Join Table3 C
        on A.Name = 'XYZ' and
           C.sId = A.sId

((Я добавил индекс по идентификатору, но не по имени.)) Но это занимает много времени, чтобы удалить записи. Есть ли лучший способ удалить миллионы записей? Заранее спасибо.

Ответы [ 8 ]

10 голосов
/ 29 декабря 2010

делайте это партиями по 5000 или 10000 вместо этого, если вам нужно удалить менее 40% данных, если вам нужно больше, чем выгрузить то, что вы хотите сохранить в другой таблице / bcp, усечь эту таблицу и вставить эти строки вы снова выбросили в другую таблицу / bcp в

while @@rowcount > 0
begin
Delete Top (5000)
        From Table1 A
        Left Join Table2 B
        on A.Name ='XYZ' and
           B.sId = A.sId
        Left Join Table3 C
        on A.Name = 'XYZ' and
           C.sId = A.sId
end

Небольшой пример, который вы можете запустить, чтобы увидеть, что происходит

CREATE TABLE #test(id INT)

INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)

WHILE @@rowcount > 0
BEGIN 
DELETE TOP (2) FROM #test

END 
2 голосов
/ 29 декабря 2010

Один из способов удалить миллионы записей - выбрать оставшиеся записи в новых таблицах, затем удалить старые таблицы и переименовать новые.Вы можете выбрать лучший способ для вас, в зависимости от внешних ключей, которые вы можете удалить и заново создать внешние ключи или усечь данные в старых таблицах и скопировать выбранные данные обратно.записи игнорируют этот ответ.Это если вы действительно хотите УДАЛИТЬ миллионы записей.

1 голос
/ 29 декабря 2010

Использование верхнего предложения больше для улучшения параллелизма и может на самом деле замедлить выполнение кода.

Одно из предложений - удалить данные из производной таблицы: http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-TOP-x-rows-avoiding-a-table-scan.aspx

0 голосов
/ 30 декабря 2010

Я бы создал временную таблицу, создал селект и заполнил временную таблицу, добавил индексы к временной таблице и удалил из моей таблицы, из которой я хочу удалить записи. Тогда я бы бросил свою временную таблицу, когда я сделал что-то вроде этого

Select * into #temp from mytable 

Где бла-бла (или ваш запрос)

// добавить ограничения, если хотите

я бы просто вставил первичный ключ в временную таблицу

тогда я бы сказал

Удалить mytable где первичный ключ (выберите myPrimarykey из #temp)

0 голосов
/ 30 декабря 2010

После того, как вы очистите данные, я добавлю триггер AFTER DELETE в table3, который автоматически удалит соответствующие записи из таблицы1. Таким образом вы сохраняете данные очищенными в режиме реального времени и вам никогда не придется удалять огромные куски.

0 голосов
/ 29 декабря 2010

Еще один способ - вставить данные, которые вы хотите сохранить, в другую таблицу, скажем, Table1_good.После завершения и проверки: Drop Table1, затем переименовать Table1_good в Table1

Грязный способ сделать это, но это работает.

0 голосов
/ 29 декабря 2010

Операция DELETE, которую вы выполняете, выполняет основной оператор SELECT, чтобы найти записи, которые будут удалены.Операция, которую вы делаете, по сути является простым соединением.Если вы оптимизируете это объединение, окончательное удаление также будет быстрее.

Убедитесь, что у вас есть индексы для столбцов, для которых вы выполняете объединения.Запустите план выполнения, чтобы убедиться, что они используются.

0 голосов
/ 29 декабря 2010

Вы установили соответствующие индексы в соответствующих полях таблицы? Если нет, удаление записей может занять много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...