Завдання
Заархівуйте всі великі таблиці, окрім постійного періоду, з групи великих таблиць. Заархівовані дані повинні зберігатися в іншій базі даних.
- База даних знаходиться в простому режимі відновлення
- Таблиці складають від 50 млн. Рядків до декількох мільярдів і в деяких випадках займають сотні ГБ кожен.
- Наразі таблиці не розміщені в розділі
- Кожна таблиця має один кластерний індекс у стовпці, що постійно збільшується
- Кожна таблиця додатково має один некластеризований індекс
- Усі зміни даних у таблицях є вставками
- Мета - мінімізувати час простою первинної бази даних.
- Сервер - 2008 R2 Enterprise
Таблиця «архіву» матиме близько 1,1 мільярда рядків, «жива» таблиця - близько 400 мільйонів. Очевидно, архівна таблиця з часом збільшиться, але я очікую, що і жива таблиця теж швидко зросте. Скажіть 50% принаймні протягом наступних двох років.
Я думав про бази даних розтягування Azure, але, на жаль, ми знаходимось у R2 2008 року і, ймовірно, залишимось там на деякий час.
Поточний план
- Створіть нову базу даних
- Створіть нові таблиці з розподілом по місяцях (використовуючи змінену дату) у новій базі даних.
- Перемістіть останні 12-13 місяців даних у розділені таблиці.
- Зробіть своп перейменування двох баз даних
- Видаліть переміщені дані з бази даних "архіву".
- Розділіть кожну з таблиць у базі даних «архіву».
- Використовуйте свопи розділів для архівації даних у майбутньому.
- Я розумію, що мені доведеться підміняти дані, які потрібно архівувати, скопіювати цю таблицю в базу даних архіву, а потім поміняти їх у таблицю архіву. Це прийнятно.
Проблема: я намагаюся перемістити дані в початкові розділені таблиці (адже я все ще роблю підтвердження своєї концепції). Я намагаюся використовувати TF 610 (відповідно до Посібника з продуктивності завантаження даних ) та INSERT...SELECT
оператора для переміщення даних, спочатку вважаючи, що вони будуть мінімально зареєстровані. На жаль, кожен раз, коли я намагаюся, він повністю реєструється.
На даний момент я думаю, що найкращим моїм рішенням може бути переміщення даних за допомогою пакету SSIS. Я намагаюся уникати цього, оскільки я працюю з 200 таблицями, і все, що я можу зробити за сценарієм, я можу легко генерувати та запускати.
Чи є щось, чого мені не вистачає в моєму загальному плані, і чи найкращим є SSIS для швидкого переміщення даних та з мінімальним використанням журналу (проблеми з простором)?
Демо-код без даних
-- Existing structure
USE [Audit]
GO
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
);
-- ~1.4 bill rows, ~20% in the last year
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
( [Modified] ASC )
GO
-- New DB & Code
USE Audit_New
GO
CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201',
'20160101', '20160201', '20160301', '20160401', '20160501', '20160601',
'20160701')
CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC,
[Col4] ASC,
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
Перемістити код
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified