Удаление нескольких строк из таблицы, когда не хватает места на диске - PullRequest
1 голос
/ 23 марта 2012

Мне нужно удалить около 5 миллионов строк из таблицы, содержащей около 6 миллионов строк, потому что у меня недостаточно места на диске.Есть ли быстрый способ удалить их?Я пытался вызвать удаление в пакетах, но для его запуска требуется очень много времени, а иногда выдает ошибку из-за блокировок и ничего не делает.

Редактировать:

Я былвыполняя запрос, который выглядит примерно так:

delete from <table> where updated_timestamp < '2012-02-20'

Теперь, чтобы получить меньшие партии, запрос выглядит следующим образом:

delete from <table> where id < [100000 row increments]

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

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

Единственный способ удалить строки - либо DELETE FROM <table> WHERE <some condition>, либо удалить все строки с помощью TRUNCATE TABLE <table> или DROP TABLE <table> (а затем заново создать его).

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

1 голос
/ 23 марта 2012

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

Что еще вы можете сделать, это запустить CHECKPOINTв базе данных, а затем уменьшить его.Это должно освободить место на диске.

0 голосов
/ 22 августа 2013

Вот код для удаления таблицы журнала, где журнал старше одного года.с циклом партии.

declare @batch int
declare @i int
declare @j int 
set @batch = 1000 
set @j = (select (COUNT(*)/@batch) + 1  from LOG_TABLE 
                where ACCESS_DATE <  dateadd(year,-1,getdate()))
set @i = 0
print @j

while (@i < @j)
BEGIN



delete top (@batch)
from LOG_TABLE 
where ACCESS_DATE < dateadd(year,-1,getdate())
SET @i = @i + 1
END
0 голосов
/ 23 марта 2012

Предыдущие два ответа абсолютно верны, и вы должны их за это заслужить.

Вам нужно следующее

SELECT * INTO into #temp FROM <table> WHERE updated_timestamp >= '2012-02-20'
TRUNCATE TABLE <table>
INSERT INTO <table> SELECT * FROM #temp

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

SET IDENTITY INSERT <table> ON
INSERT INTO <table> (<field_list>)
SELECT <field_list>) FROM #temp
SET IDENTITY INSERT <table> ON
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...