Секционирование существующих таблиц с журналом Робота и Оркестратора для SQLServer - Вариант с фиксированной схемой секционирования
1. Создание файловых групп
Для секционирования по месяцам необходимо создать файловые группы на каждый месяц.
ALTER DATABASE ltoolslogs ADD FILEGROUP logs01;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs02;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs03;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs04;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs05;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs06;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs07;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs08;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs09;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs10;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs11;
ALTER DATABASE ltoolslogs ADD FILEGROUP logs12;Подключаем к каждой группе файл хранилища. Путь к файлам .ndf зависит от конфигурации SQL Server, может быть, например:
C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA
Для файлов
.ndfиспользуйте шаблон именования с датой, если планируете автоматическое создание секций через SQL Agent. Например:logs_20260415.ndf. Это упростит идентификацию секций при мониторинге.
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs01, FILENAME = '<file-groups-path>\logs01.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs01;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs02, FILENAME = '<file-groups-path>\logs02.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs02;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs03, FILENAME = '<file-groups-path>\logs03.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs03;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs04, FILENAME = '<file-groups-path>\logs04.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs04;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs05, FILENAME = '<file-groups-path>\logs05.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs05;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs06, FILENAME = '<file-groups-path>\logs06.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs06;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs07, FILENAME = '<file-groups-path>\logs07.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs07;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs08, FILENAME = '<file-groups-path>\logs08.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs08;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs09, FILENAME = '<file-groups-path>\logs09.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs09;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs10, FILENAME = '<file-groups-path>\logs10.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs10;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs11, FILENAME = '<file-groups-path>\logs11.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs11;
ALTER DATABASE ltoolslogs ADD FILE (
NAME = logs12, FILENAME = '<file-groups-path>\logs12.ndf',
SIZE = 10 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB
) TO FILEGROUP logs12;2. Создание функции секционирования
CREATE PARTITION FUNCTION LogsPartitionFunction(int)
AS RANGE RIGHT FOR VALUES (2,3,4,5,6,7,8,9,10,11,12);Функция создает 12 секций (по одной на месяц). Количество значений в
FOR VALUESравно 11, так как они задают границы между секциями, а не сами секции.
3. Создание схемы секционирования
CREATE PARTITION SCHEME LogsPartitionScheme
AS PARTITION LogsPartitionFunction
TO (
'logs01', 'logs02', 'logs03', 'logs04', 'logs05', 'logs06',
'logs07', 'logs08', 'logs09', 'logs10', 'logs11', 'logs12'
);4. Предварительная проверка данных
Перед добавлением вычисляемой колонки убедитесь, что в таблицах Logs и OrchEvents нет NULL значений в поле OrchTimestampUtc. При наличии NULL секционирование может работать некорректно.
-- Проверка на NULL
SELECT COUNT(*) FROM Logs WHERE OrchTimestampUtc IS NULL;
SELECT COUNT(*) FROM OrchEvents WHERE OrchTimestampUtc IS NULL;Если запросы вернули количество больше 0, необходимо обработать NULL значения перед продолжением.
5. Настройка таблицы Logs
Добавляем вычисляемую колонку для секционирования:
ALTER TABLE Logs ADD PartitionColumn AS MONTH(OrchTimestampUtc) PERSISTED;Создаём индекс для партиционирования:
CREATE NONCLUSTERED INDEX IX_Logs_Partition ON [Logs] ([PartitionColumn])
ON [LogsPartitionScheme]([PartitionColumn]);6. Настройка таблицы OrchEvents
Добавляем вычисляемую колонку для секционирования:
ALTER TABLE OrchEvents ADD PartitionColumn AS MONTH(OrchTimestampUtc) PERSISTED;Создаём индекс для партиционирования:
CREATE NONCLUSTERED INDEX IX_OrchEvents_Partition ON [OrchEvents] ([PartitionColumn])
ON [LogsPartitionScheme]([PartitionColumn]);7. Примечание по порядку выполнения
При первоначальном включении секционирования (выполнение пунктов 1–6) секция на следующий месяц создается автоматически только через сутки, после первого переключения таблиц в секционированный режим.
Порядок действий по дням:
| День | Действие |
|---|---|
| День 1 | Выполнить пункты 1–6 документации (создание файловых групп, функции, схемы, индексов) |
| День 2 и далее | Настроить задание SQL Agent для ежедневного выполнения EXEC dbo.create_partition; |
Важно: Если запустить процедуру
EXEC dbo.create_partition;в тот же день (День 1), она завершится с ошибкой, потому что автоматическое переключение таблиц еще не произошло, и механизм секционирования не до конца инициализирован. Файлltoolslogs_YYYYMMDD.ndfуспешно создается на следующий день после настройки.
8. Удаление данных из секций
Удаление данных из секций успешно выполняется командой:
DROP TABLE public."Logs/OrchEvents....";