Каков наилучший способ удалить всю большую таблицу в t-sql? - PullRequest
14 голосов
/ 27 апреля 2009

Мы столкнулись с немного странной ситуацией. По сути, в одной из наших баз данных есть две таблицы, которые снабжаются тоннами и тоннами информации, которая нам не нужна или не нужна Частично из-за этого у нас заканчивается свободное место на диске.

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

Простое использование таблицы удаления занимает вечность и занимает место на диске (я полагаю, из-за журнала транзакций.) Сейчас я использую цикл while для одновременного удаления записей X, одновременно играя с X, чтобы определить, что на самом деле самый быстрый. Например, X = 1000 занимает 3 секунды, в то время как X = 100 000 занимает 26 секунд ... что делает подсчет немного быстрее.

Но вопрос в том, есть ли лучший способ?

(Как только это будет сделано, собираясь запустить задание агента SQL, очищайте таблицу один раз в день ... но сначала ее нужно очистить.)

Ответы [ 7 ]

20 голосов
/ 27 апреля 2009

TRUNCATE таблица или отключение индексов перед удалением

TRUNCATE TABLE [tablename]

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

7 голосов
/ 27 апреля 2009

Чтобы добавить к другим ответам, если вы хотите сохранить данные прошлого дня (или прошедшего месяца, или года, или чего-либо еще), затем сохранить их, выполните команду TRUNCATE TABLE, а затем вставьте ее обратно в исходную таблицу: 1001 *

SELECT
     *
INTO
     tmp_My_Table
FROM
     My_Table
WHERE
     <Some_Criteria>

TRUNCATE TABLE My_Table

INSERT INTO My_Table SELECT * FROM tmp_My_Table

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

4 голосов
/ 27 апреля 2009

1) Усеченная таблица

2) скрипт из таблицы, удаление и воссоздание таблицы

2 голосов
/ 27 апреля 2009

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

2 голосов
/ 27 апреля 2009
TRUNCATE TABLE [tablename]

удалит все записи без регистрации.

0 голосов
/ 21 февраля 2014
0 голосов
/ 27 апреля 2009

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

set @@ rowcount x пока 1 = 1 Начинают

удалить из таблицы Если @@ Rowcount = 0 перерыв

Конец

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

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