Поделиться через


ALTER PARTITION FUNCTION (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Эта инструкция изменяет функцию секционирования путем разбиения или слияния ее пограничных значений. С помощью выполнения инструкции 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 ядро СУБД разделяет один из существующих диапазонов на два. Из этих двух диапазонов один с новым border_value является новой секцией.

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

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

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

Примечание.

Ограничения для индекса columnstore: если для таблицы имеется индекс columnstore, разделять можно только пустые секции. Перед выполнением этой операции необходимо удалить или отключить индекс columnstore.

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

Примечание.

Ограничения с индексом columnstore: невозможно объединить две секции nonempty, содержащие индекс columnstore. Перед выполнением этой операции необходимо удалить или отключить индекс columnstore

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

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

Главная причина, по которой секции разделяются по нескольким файловым группам, заключается в возможности независимого выполнения операций резервного копирования и восстановления в секции. Дополнительные сведения о файловых группах и стратегиях секционирования см. в разделе Файловые группы.

Ограничения

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

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

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

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

    Примечание.

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

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

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

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

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

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

Разрешения

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

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

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

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

Примеры

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

В следующем примере создается функция секционирования для разделения таблицы или индекса на четыре секции. 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);  

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

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

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);  

Следующие шаги

Дополнительные сведения о секционировании таблиц и связанных с ними понятиях см. в следующих статьях: