2013-02-22 5 views
0

У меня есть 42,715,078 записей в одной из моих таблиц, что я хотел бы удалить TOP 42,715,000 строк (я хочу сохранить всего 78 записей).Удалить несколько записей из таблицы SQL Server

Кто-нибудь знает, кто может это сделать?

PS: Я не хочу удалять таблицу, просто хочу удалить записи таблицы.

+4

Вы бы лучше (в крачек лесозаготовок) хранения 78 в временную таблицу затем усечение таблицы и добавить их обратно. Пожалуйста, укажите структуру таблицы и определение 'TOP'. Как по заказу? –

+0

Возможный дубликат [Bulk DELETE на SQL Server 2008 (есть что-то вроде Bulk Copy (bcp) для удаления данных?)] (Http://stackoverflow.com/questions/2126434/bulk-delete-on-sql-server- 2008-is-there-anything-like-bulk-copy-bcp-for-delet) – gbn

ответ

5

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

SELECT * INTO #temp FROM TableName WHERE <Condition that gets you the 78 rows you want> 

Или, если у вас нет конкретного 78 строк

SELECT TOP 78 * INTO #temp FROM TableName 

Тогда

TRUNCATE TABLE TableName 

И последнее, но не менее

INSERT INTO TableName 
    SELECT * FROM #temp 

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

+0

Хорошая копия предлагаемого дубликата выше ... – gbn

+0

На самом деле я не видел этого. Думаю, мне нужно лучше прочитать комментарии, прежде чем отвечать :). –

0

У меня есть.

DELETE TOP (42715000) 
FROM <tablename> 
WHERE <condition> 

Это сработало так хорошо!

+4

В этом случае 'TOP' не определен. Нет гарантии, что 42715000 строк будут удалены. –

+7

Возможно, вы взорвите журнал транзакций. Удалить полностью заносится в ряд за строкой, так что у вас есть 42 миллиона записей в журнале ... – gbn

+0

Как говорит Мартин, здесь никаких гарантий нет. У этого верха действительно должен быть порядок. – Bridge

1

У нас есть журнал активности, который мы обрезаем один раз в месяц. (Мы сохраняем ежемесячные резервные копии, поэтому мы можем вернуться к любым старым данным, если хотим.) Если ваша таблица растет каждый месяц, и вы хотите сохранить ее такой же, как мы, с нашей, вы можете настроить SQL Agent Job для запуска каждый месяц.

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

DECLARE @LastDate DateTime -- We remove the oldest rows by month 
DECLARE @NumberOfRows INT -- Number of rows to keep 

-- Set the Date to the current date minus 3 months. 
SET @LastDate = DATEADD(MM, -3, GETDATE()) 

-- Since it runs on the first Saturday of each month, this code gets it 
    back to the first of the monh. 
SET @LastDate = CAST(CAST(DATEPART(YYYY, @LastDate) AS varchar) + '-' + CAST(DATEPART(MM, @LastDate) AS varchar) + '-01' AS DATETIME) 

-- We use 5000. 
SET @NumberOfRows = 5000 

DELETE TOP (@NumberOfRows) FROM MyTable WHERE Created < @LastDate 
Смежные вопросы