ALTER PARTITION FUNCTION (Transact-SQL)

Эта инструкция изменяет функцию секционирования путем разбиения или слияния ее пограничных значений. При выполнении инструкции ALTER PARTITION FUNCTION одна секция какой-либо таблицы или индекса, которые используют функцию секционирования, может быть разбита на две секции или две секции могут быть объединены в одну.

ПредупреждениеВнимание!

Несколько таблиц или индексов могут использовать одинаковую функцию секционирования. Инструкция ALTER PARTITION FUNCTION применяется ко всем таблицам и индексам в рамках одной транзакции.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

ALTER PARTITION FUNCTION partition_function_name()
{ 
    SPLIT RANGE ( boundary_value )
  | MERGE RANGE ( boundary_value ) 
} [ ; ]

Аргументы

  • partition_function_name
    Это имя функции секционирования, которую необходимо изменить.

  • SPLIT RANGE ( boundary_value )
    Добавляет одну секцию к функции секционирования. Аргумент boundary_value определяет диапазон новой секции, который должен отличаться от существующих пограничных значений функции секционирования. На основе аргумента boundary_value компонент Database Engine разбивает один существующий диапазон на два. Один из них,содержащий новый аргумент boundary_value, является новой секцией.

    Файловая группа должна существовать в режиме в сети и быть помеченной схемой секционирования, использующей функцию секционирования, как NEXT USED для сохранения новой секции. В инструкции CREATE PARTITION SCHEME для файловых групп выделяются секции. Если инструкция CREATE PARTITION SCHEME размещает больше файловых групп, чем необходимо (в этой инструкции создано меньше секций, чем файловых групп для их хранения), то появляются неназначенные файловые группы, и одна из них отмечается схемой секционирования как NEXT USED. Данная файловая группа будет содержать новую секцию. Если нет ни одной файловой группы, отмеченной схемой секционирования как NEXT USED, то для хранения новой секции необходимо добавить файловую группу или назначить уже существующую при помощи инструкции ALTER PARTITION SCHEME. Файловая группа, которая уже содержит секции, может быть назначена для содержания дополнительных секций. Так как функция секционирования может использоваться в нескольких схемах секционирования, то все схемы с такой функцией, к которым добавляются секции, должны иметь файловую группу NEXT USED. Иначе ALTER PARTITION FUNCTION дает сбой и выдает ошибку, в которой показаны схема или схемы секционирования с отсутствующей файловой группой NEXT USED.

    Если все секции создаются в одной файловой группе, то эта файловая группа первоначально автоматически назначается как NEXT USED. Однако после выполнения операции разделения назначение файловой группы NEXT USED будет отсутствовать. Необходимо явным образом назначить файловую группу NEXT USED через ALTER PARITION SCHEME, в противном случае следующая операция разделения завершится ошибкой.

  • MERGE [ RANGE ( boundary_value) ]
    Удаляет секцию и объединяет все значения, существующие в секции, в одну из оставшихся. Аргумент RANGE (boundary_value) должен быть существующим пограничным значением, в которое объединяются значения из удаленной секции. Файловая группа, изначально содержащая аргумент boundary_value, удаляется из схемы секционирования, если она не используется оставшейся секцией или не обозначена как NEXT USED. Объединенная секция находится в файловой группе, которая изначально не содержит boundary_value. Аргумент boundary_value является константным выражением, которое может ссылаться на переменные (включая определяемый пользователем тип переменных) или функции (включая определенные пользователем). Он не может ссылаться на выражение Transact-SQL. Аргумент boundary_value должен либо совпадать, либо неявно преобразовываться в тип данных соответствующего столбца секционирования, и в процессе неявного преобразования он не может быть усечен таким образом, чтобы размер и диапазон его значения не совпадали с соответствующим ему аргументом input_parameter_type.

Рекомендации

Всегда оставляйте пустые секции по обоим концам диапазона секций, чтобы при выполнении операции разбиения секции (перед загрузкой новых данных) и объединения секций (после выгрузки старых данных) не было необходимости перемещать данные. Не следует разделять или объединять заполненные секции. Это может быть очень неэффективно. В этом случае на формирование журнала может потребоваться в четыре раза больше времени, кроме того, это может вызвать серьезную блокировку.

Ограничения

Инструкция ALTER PARTITION FUNCTION повторно секционирует все таблицы и индексы, которые применяют функцию в рамках одной атомарной операции. Однако данная операция происходит в режиме вне сети и, в зависимости от масштаба повторного секционирования, может потребовать большого количества ресурсов.

Инструкция ALTER PARTITION FUNCTION может использоваться только для разбиения одной секции на две или слияния двух секций в одну. Чтобы разбить таблицу другим способом (например, от 10 секций до 5), можно использовать следующие параметры. В зависимости от конфигурации системы данные параметры могут различаться по ресурсоемкости.

  • Создайте новую секционированную таблицу с необходимой функцией секционирования, затем вставьте данные из старой таблицы в новую при помощи инструкции INSERT INTO...SELECT FROM.

  • Создайте секционированный кластеризованный индекс по всей куче.

    ПримечаниеПримечание

    Удаление результатов секционированного кластеризованного индекса в секционированной куче.

  • Удалите и заново создайте существующий секционированный индекс с помощью инструкции Transact-SQL CREATE INDEX с предложением DROP EXISTING = ON.

  • Выполните последовательность инструкций ALTER PARTITION FUNCTION.

Все файловые группы, обрабатываемые ALTER PARITITION FUNCTION, должны находиться в режиме в сети.

ALTER PARTITION FUNCTION завершается неудачно, если в какой-либо таблице, использующей функцию секционирования, находится отключенный кластеризованный индекс.

SQL Server не поддерживает репликацию для изменения функций секционирования. Изменения в функции секционирования в базе данных публикации нужно вручную применять к базе данных подписки.

Разрешения

Для выполнения инструкции ALTER PARTITION FUNCTION может использоваться одно из перечисленных ниже разрешений.

  • Разрешение ALTER ANY DATASPACE. Данное разрешение по умолчанию назначено членам предопределенной роли сервера sysadmin и предопределенных ролей базы данных db_owner и db_ddladmin.

  • Разрешение CONTROL или ALTER в базе данных, в которой была создана функция секционирования.

  • Разрешение CONTROL SERVER или ALTER ANY DATABASE на сервере базы данных, в котором была создана функция секционирования.

Примеры

A. Разбиение секции секционированной таблицы или индекса на две части

Следующий пример создает функцию секционирования для разделения таблицы или индекса на четыре секции. ALTER PARTITION FUNCTION разбивает одну из секций на две, чтобы в итоге получилось пять секций.

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Split the partition between boundary_values 100 and 1000
--to create two partitions between boundary_values 100 and 500
--and between boundary_values 500 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
SPLIT RANGE (500);

Б. Объединение двух секций секционированной таблицы в одну секцию

Следующий пример создает такую же функцию секционирования, как описано выше, и затем объединяет две секции в одну, чтобы в итоге получилось три секции.

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Merge the partitions between boundary_values 1 and 100
--and between boundary_values 100 and 1000 to create one partition
--between boundary_values 1 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
MERGE RANGE (100);