Ускорить удаление на SQL Server 2005? - PullRequest
0 голосов
/ 15 июля 2010

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

Я хочу знать, что я могу сделать, чтобы ускорить удаление?

Я могуне обрезать и не отбросить таблицу, я должен сделать что-то похожее на

DELETE FROM table WHERE id IN (SELECT id FROM other_table)

Ответы [ 5 ]

1 голос
/ 31 июля 2010
  • Batch it
  • Использование EXISTS
  • Убедитесь, что у вас есть правильные индексы для идентификатора в обеих таблицах

Пример:

SELECT 'Starting'
WHILE ROWCOUNT <> 0
    DELETE TOP (1000000) T
    FROM  table T
    WHERE EXISTS (
        SELECT * from otherTable OT WHERE T.id = OT.id
    )

Возможно, вдохновение: Массовое УДАЛЕНИЕ в SQL Server 2008 и удаление строки 7 миллиардов

1 голос
/ 19 июля 2010

Ниже приведены некоторые общие идеи.

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

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

1 голос
/ 15 июля 2010

В вашем случае нет конкретной помощи, потому что это зависит.

Общие правила (если применимо):

  1. Иметь некластеризованный индекс для table.id
  2. Но удалите все другие ключи / индексы, которые никогда не использовались или редко используются
  3. Удалите все другие ключи / индексы перед операцией удаления и перестройте их впоследствии
  4. Избегайте измененного индекса для table.id
  5. Ускорение «SELECT id FROM other_table» с помощью индекса (при условии, что этот суб-выбор имеет любой вид предложения where в реальном мире)
0 голосов
/ 19 июля 2010

Удалить небольшими партиями, например, 1000 записей за раз.Фактическое удаление займет немного больше времени (убедитесь, что у вас есть необходимые индексы), но пользователи не будут заблокированы из таблицы, пока выполняется длительное удаление.

0 голосов
/ 15 июля 2010

Имеет ли "таблица" индекс для столбца "id"?
Если нет, SQL Server, вероятно, выполнит сканирование таблицы, чтобы найти записи для удаления.Вы можете ускорить это, создав индекс по столбцу «id».

То же самое с "other_table" - если выбор в этой таблице также содержит предложение WHERE, проверьте, проиндексированы ли используемые там столбцы.

...