ALTER PARTITION FUNCTION (Transact-SQL)

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

Эта инструкция изменяет функцию секционирования путем разбиения или слияния ее пограничных значений. Запуск 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
Это имя функции секционирования, которую необходимо изменить.

СПЛИТ-РЕЙНДЖ ( 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 [ ДИАПАЗОН ( 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 fail, если отключённый кластерный индекс существует в таблицах, использующих функцию раздела.

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

Разрешения

Для выполнения 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);  

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

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