Практическое руководство удаляет 8 500 000 Записей из одной таблицы на SQL-сервере

удалите операции, где unt_uid является пустым

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

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

Это - Сервер SQL 2005 на 32-разрядном Win2003. Второй Вопрос: Сколько времени Вы оценили бы, чтобы это задание было сделано (6 часов или 60 часов)? (Да, я знаю, что это зависит от загрузки, но предположите, что это - среда малого бизнеса),

9
задан John Saunders 18 January 2010 в 03:58
поделиться

5 ответов

Вы можете сделать это в кусках. Например, каждые 10 секунд выполняются:

delete from activities where activityid in 
  (select top 1000 activityid from activities where unt_uid is null)

, очевидно, определяют количество строк (я произвольно выбрал 1000) и интервал (я выбрал 10 секунд), что имеет наибольшее значение для вашего приложения.

9
ответ дан 4 December 2019 в 11:05
поделиться

Я думаю, для этого дела просто напишите какой-нибудь код в модели домена (BLL) удаления, чтобы судить, если какой-то человек может быть удален, или напишите какой-нибудь код в SQL или SP и вернуть значение для посвящения, если удаление сделано.

-121--5045417-

В среде малого бизнеса кажется странным, что вам нужно будет удалить 500 000 строк в стандартном оперативном поведении, не затрагивая любые другие пользователи. Как правило, для удаления, которые большими, мы делаем новую таблицу и используя усечение / вставку или SP_NAME, чтобы перезаписать старый.

Сказав, что в особом случае один из моих ежемесячных процессов регулярно может удалить строки 200 м в партиях около 3 м в то время, если он обнаруживает, что он должен повторно запустить процесс, который генерировал эти строки 200 м. Но это однопользовательский процесс в выделенной базе данных хранилища данных, и я бы не назвал его сценарием для малого бизнеса.

Я второй ответы, рекомендующие поиск альтернативных подходов к вашему дизайну.

0
ответ дан 4 December 2019 в 11:05
поделиться

Возможно, вместо удаления записей из вашей таблицы вы можете создать новую идентичную таблицу, вставьте записи, которые вы хотите сохранить, а затем переименовать таблицы, чтобы новый заменяет старый. Это все равно займет некоторое время, но на вашем сайте будет довольно минимально (просто при обмен таблицам)

5
ответ дан 4 December 2019 в 11:05
поделиться

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

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

Моя лучшая рекомендация будет перепроектировать ваше приложение, чтобы вам не нужно удалить эти строки или, возможно, любые строки.

Вы можете сделать это, разбив такую ​​таблицу, что вы можете просто отбрасывать разделы вместо этого или использовать «скопировать строки, которые вы хотите сохранить, затем отбросить таблицу» Рецепт, предлагаемый другими.

3
ответ дан 4 December 2019 в 11:05
поделиться

Я бы использовал технику "удаления зазубрин". С http://sqladvice.com/blogs/repeatableread/archive/2005/09/20/12795.aspx:

DECLARE @target int
SET @target = 2000
DECLARE @count int
SET @count = 2000

WHILE @count = 2000 BEGIN

 DELETE FROM myBigTable
 WHERE targetID IN
 (SELECT TOP (@target) targetID
  FROM myBigTable WITH(NOLOCK)
  WHERE something = somethingElse) 

 SELECT @count = @@ROWCOUNT
 WAITFOR DELAY '000:00:00.200'

END

Я использовал ее именно для такого типа сценариев. Важно сохранить WAITFOR, он позволяет другим запросам делать свою работу в промежутке между удалениями.

2
ответ дан 4 December 2019 в 11:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: