Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Исторические данные.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1089
Имеем таблицу примерно (58 млн записей), хранящую данные о регистрациях порций на разных линиях. Система снята с поддержки. Права на сервер есть полные.
select @@version

Microsoft SQL Server 2008 (SP2) - 10.0.4064.0 (X64)   Feb 25 2011 13:56:11   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 


id (PK) является внешним ключом для некоторого количества таблиц.

Задача - удалить записи старше 2015-01-01 (id первой такой записи известен)
Идея в лоб - удалить записи в таблицах со ссылками и затем
delete from proc_packs
where id<50000000 

Вот план
Думается, что такой запрос будет выполняться очень долго, а сервер продуктивный, активно эта таблица пользуется - чем чревато - неизвестно.
Можно, кончено, job организовать и данные пачками удалять - много лишних телодвижений.
Идея вторая.
Создать клон таблицы, скопировать в нее нужные данные, переименовать исходную таблицу, клон назвать старым именем.
Насколько чреваты такие телодвижения? (Понятно, что в момент переименования клиент может обратиться к таблице и получить исключение - в теории можно организовать перерыв в работе)
Что посоветуют знающие люди?

К сообщению приложен файл (deleteplan.sqlplan - 36Kb) cкачать
22 апр 15, 11:24    [17547634]     Ответить | Цитировать Сообщить модератору
 Re: Исторические данные.  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
waszkiewicz
Enterprise Edition


Можно глянуть в такую сторону:

1) создаете partition function с границей 50000000 pf
2) создаете partition scheme ps для функции pf
3) партиционируйте ее по границе 50000000 (create clustered index pk__t__id on t(id) with (online = on, drop_existing = on) on ps(id))
4) у вас будет две партиции с данными которые надо удалить и с данными которые должны остаться
5) создаете таблицу такой же структуры в той же файловой группе что и партиция, которую надо удалить
6) делаете switch партиции в (5)
7) делаете truncate (6)
8) ... далее по вкусу поступить (возвращать или не возвращать таблицу к несекционированному виду)

минимум простоя. почти все online...
22 апр 15, 11:35    [17547682]     Ответить | Цитировать Сообщить модератору
 Re: Исторические данные.  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

с FK разбирайтесь заранее.
22 апр 15, 11:35    [17547684]     Ответить | Цитировать Сообщить модератору
 Re: Исторические данные.  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

до кучи.

совсем недавно рвали баяны
22 апр 15, 11:39    [17547697]     Ответить | Цитировать Сообщить модератору
 Re: Исторические данные.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
churupaha
waszkiewicz
Enterprise Edition


Можно глянуть в такую сторону:

1) создаете partition function с границей 50000000 pf
2) создаете partition scheme ps для функции pf
3) партиционируйте ее по границе 50000000 (create clustered index pk__t__id on t(id) with (online = on, drop_existing = on) on ps(id))
4) у вас будет две партиции с данными которые надо удалить и с данными которые должны остаться
5) создаете таблицу такой же структуры в той же файловой группе что и партиция, которую надо удалить
6) делаете switch партиции в (5)
7) делаете truncate (6)
8) ... далее по вкусу поступить (возвращать или не возвращать таблицу к несекционированному виду)

минимум простоя. почти все online...
А если там индексы?
24 апр 15, 00:33    [17556700]     Ответить | Цитировать Сообщить модератору
 Re: Исторические данные.  [new]
aleks2
Guest
waszkiewicz
Что посоветуют знающие люди?


Куда вам торопиться?

while exits(select * from proc_packs where id<50000000 )
begin
   delete top(10) from proc_packs
      where id<50000000;

   while @@trancount > 0 commit;

   waitfor delay '00:00:05';
end;

Запустите, за неделю справится.
24 апр 15, 05:39    [17556899]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить