SQL Server - разбиение таблицы по дням месяца - PullRequest
0 голосов
/ 26 марта 2019

Я новичок в разделении, поэтому я читал об этом, пытаясь понять его и как его реализовать.У нас есть таблица, которую мы ожидаем получить очень большой, поэтому администратор БД рекомендовал ее разбить.Было решено разделить таблицу по дням месяца.Поэтому я создал файлы и файловые группы для каждого дня месяца.Затем я запустил следующий скрипт для создания функции секционирования:

CREATE PARTITION FUNCTION pfPartitionFunction (INT)
AS
RANGE LEFT FOR VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31)

Затем я запустил следующий скрипт для создания схемы секционирования:

CREATE PARTITION SCHEME psPartitionScheme
AS
PARTITION pfPartitionFunction TO (FG1, FG2, FG3, FG4, FG5, FG6, FG7, FG8, FG9, FG10, FG11, FG12, FG13, FG14, FG15, FG16, FG17, FG18, FG19, FG20, FG21, FG22, FG23, FG24, FG25, FG26, FG27, FG28, FG29, FG30, FG31, [PRIMARY])

Затем я попытался создать таблицу свычисляемый столбец, который будет содержать день месяца для созданного столбца даты, а также будет служить столбцом раздела:

CREATE TABLE [dbo].[PartitionedTable](
    [Id] [varchar](255) NOT NULL,
    .
    .
    .
    [CreatedDate] [datetime] NOT NULL,
    [CreatedDay] AS DAY(CreatedDate) PERSISTED,
 CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON psPartitionScheme([CreatedDay])
) ON psPartitionScheme([CreatedDay])

Но я получил следующее сообщение об ошибке: «Столбец« CreatedDay »является столбцом разбиенияиндекса 'PK_ID'. Столбцы разделов для уникального индекса должны быть подмножеством ключа индекса. "Я не могу включить вычисляемый столбец как часть первичного ключа, так как мы должны убедиться, что идентификаторы уникальны.Поэтому я указал [PRIMARY] для первичного ключа вместо psPartitionScheme.Когда я запустил это, я получил следующее сообщение: «Файловая группа« PRIMARY », указанная для кластерного индекса« PK_ID », использовалась для таблицы« dbo.PartitionedTable », даже если для нее указана схема разбиения« psPartitionScheme »».Когда я запускаю следующий запрос для проверки разделов:

SELECT * FROM sys.partitions
WHERE OBJECT_NAME([object_id]) = 'PartitionedTable'

я вижу только один раздел: enter image description here

У меня также есть два других индекса в таблице,Когда я создаю эти индексы таблиц в схеме секционирования, я вижу 31 секцию для каждого в таблице sys.partitions.Так что это похоже на работу.Но поскольку таблица не секционирована, я не могу воспользоваться преимуществами переключения секций, что является еще одним требованием для этой таблицы.Когда я запускаю сценарий переключения раздела:

ALTER TABLE PartitionedTable
SWITCH PARTITION 3
TO PartitionedTableArchive PARTITION 3

, я получаю следующее предупреждение: «Указанный раздел 3 для таблицы« MyDatabase.dbo.PartitionedTable »был проигнорирован в операторе ALTER TABLE SWITCH, поскольку таблица не являетсясекционирован. "

И я также получаю следующую ошибку:" Оператор 'ALTER TABLE SWITCH' не выполнен. Индекс 'IX' секционирован, а таблица 'MyDatabase.dbo.PartitionedTable' не секционирована. "

Есть ли что-нибудь еще, что я могу сделать, чтобы правильно разделить таблицу, не включая вычисляемый столбец как часть первичного ключа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...