ALTER PARTITION FUNCTION (Transact-SQL)ALTER PARTITION FUNCTION (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Эта инструкция изменяет функцию секционирования путем разбиения или слияния ее пограничных значений.Alters a partition function by splitting or merging its boundary values. С помощью выполнения инструкции ALTER PARTITION FUNCTION можно разделить одну секцию таблицы или индекс, использующий функцию секционирования, на две секции.Running an ALTER PARTITION FUNCTION statement can split one table partition or index that uses the partition function into two partitions. Инструкция также может объединить две секции в одну меньшую секцию.The statement can also merge two partitions into one less partition.

Внимание!

Несколько таблиц или индексов могут использовать одинаковую функцию секционирования.More than one table or index can use the same partition function. Инструкция ALTER PARTITION FUNCTION применяется ко всем таблицам и индексам в рамках одной транзакции.ALTER PARTITION FUNCTION affects all of them in a single transaction.

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

СинтаксисSyntax

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

АргументыArguments

partition_function_namepartition_function_name
Это имя функции секционирования, которую необходимо изменить.Is the name of the partition function to be modified.

SPLIT RANGE ( boundary_value )SPLIT RANGE ( boundary_value )
Добавляет одну секцию к функции секционирования.Adds one partition to the partition function. Аргумент boundary_value определяет диапазон новой секции, который должен отличаться от существующих пограничных значений функции секционирования.boundary_value determines the range of the new partition, and must differ from the existing boundary ranges of the partition function. На основе аргумента boundary_value Компонент Database EngineDatabase Engine разбивает один существующий диапазон на два.Based on boundary_value, the Компонент Database EngineDatabase Engine splits one of the existing ranges into two. Из этих двух диапазонов один с новым border_value является новой секцией.Of these two ranges, the one with the new boundary_value is the new partition.

Файловая группа должна существовать в режиме "в сети",A filegroup must exist online. и схема секционирования, которая использует функцию секционирования, как NEXT USED для хранения новой секции, должна помечать файловую группу.And, the partition scheme that uses the partition function as NEXT USED to hold the new partition must mark the filegroup. В инструкции CREATE PARTITION SCHEME для секций назначаются файловые группы.A CREATE PARTITION SCHEME statement assigns filegroups to partitions. Инструкция CREATE PARTITION FUNCTION создает меньше секций, чем файловых групп для их хранения.The CREATE PARTITION FUNCTION statement creates fewer partitions than filegroups to hold them. Инструкция CREATE PARTITION SCHEME может выделить больше файловых групп, чем необходимо.A CREATE PARTITION SCHEME statement may set aside more filegroups than needed. Если это произойдет, то в конечном итоге вы получите неназначенные файловые группы.If that happens, then you'll end up with unassigned filegroups. Кроме того, схема секционирования помечает одну из файловых групп как NEXT USED.Also, the partition scheme marks one of the filegroups as NEXT USED. Данная файловая группа содержит новую секцию.This filegroup holds the new partition. Если нет файловых групп, помеченных схемой секционирования как NEXT USED, необходимо использовать инструкцию ALTER PARTITION SCHEME.If there are no filegroups the partition scheme marks as NEXT USED, you must use an ALTER PARTITION SCHEME statement.

Инструкция ALTER PARTITION SCHEME может добавить файловую группу или выбрать имеющуюся для хранения новой секции.The ALTER PARTITION SCHEME statement can either add a filegroup, or select an existing one, to hold the new partition. Вы можете назначить файловую группу, которая уже содержит секции, для вмещения дополнительных секций.You can assign a filegroup that already holds partitions to hold additional partitions. Функция секционирования может участвовать в двух и более схемах секционирования.A partition function can participate in more than one partition scheme. По этой причине все схемы секционирования, которые используют функцию секционирования, к которой вы добавляете секции, должны иметь файловую группу NEXT USED.For this reason, all the partition schemes that use the partition function to which you're adding partitions must have a NEXT USED filegroup. Иначе инструкция ALTER PARTITION FUNCTION дает сбой и выдает ошибку, в которой показаны схема или схемы секционирования с отсутствующей файловой группой NEXT USED.Otherwise, the ALTER PARTITION FUNCTION statement fails with an error that displays the partition scheme or schemes that lack a NEXT USED filegroup.

Если все секции создаются в одной файловой группе, то данная группа первоначально автоматически назначается как NEXT USED.If you create all the partitions in the same filegroup, that filegroup is initially assigned to be the NEXT USED filegroup automatically. Однако после выполнения операции разбиения выбранная файловая группа NEXT USED будет отсутствовать.However, after a split operation runs, there's no longer a selected NEXT USED filegroup. Необходимо явным образом назначить файловую группу как NEXT USED с помощью ALTER PARTITION SCHEME. В противном случае предстоящая операция разбиения завершится ошибкой.Explicitly assign the filegroup as the NEXT USED filegroup by using ALTER PARTITION SCHEME or an upcoming split operation will fail.

Примечание

Ограничения с индексом columnstore. Если для таблицы имеется индекс columnstore, разделять можно только пустые секции.Limitations with columnstore index: Only empty partitions can be split in when a columnstore index exists on the table. Перед выполнением этой операции необходимо удалить или отключить индекс columnstore.You will need to drop or disable the columnstore index before performing this operation.

MERGE [ RANGE ( boundary_value) ]MERGE [ RANGE ( boundary_value) ]
Удаляет секцию и объединяет все значения, существующие в секции, в оставшуюся.Drops a partition and merges any values that exist in the partition into a remaining partition. Аргумент RANGE (boundary_value) должен быть существующим пограничным значением, в которое объединяются значения из удаленной секции.RANGE (boundary_value) must be an existing boundary value, into which the values from the dropped partition are merged. Этот аргумент удаляет файловую группу, изначально содержащую аргумент boundary_value, из схемы секционирования, если она не используется оставшейся секцией или не помечена свойством NEXT USED.This argument removes the filegroup that originally held boundary_value from the partition scheme unless a remaining partition uses it, or marks it with the NEXT USED property. Объединенная секция существует в файловой группе, которая первоначально не содержала boundary_value.The merged partition exists in the filegroup that didn't hold boundary_value at first. boundary_value является константным выражением, которое может ссылаться на переменные (включая переменные определяемых пользователем типов) или функции (включая определяемые пользователем).boundary_value is a constant expression that can reference variables (including user-defined type variables) or functions (including user-defined functions). Не может ссылаться на выражение Transact-SQLTransact-SQL.It can't reference a Transact-SQLTransact-SQL expression. boundary_value должен совпадать или быть с возможностью неявного преобразования в тип данных соответствующего столбца секционирования.boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column. Вы также не можете усечь border_value во время неявного преобразования таким образом, чтобы размер и масштаб значения не совпадали с соответствующим ему аргументом input_parameter_type.You also can't truncate boundary_value during implicit conversion in a way that the size and scale of the value doesn't match that of its corresponding input_parameter_type.

Примечание

Ограничения с индексом columnstore. Выполнить объединение двух непустых секций, содержащих индекс columnstore, невозможно.Limitations with columnstore index: Two nonempty partitions containing a columnstore index can't be merged. Перед выполнением этой операции необходимо удалить или отключить индекс columnstoreYou will need to drop or disable the columnstore index before performing this operation

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

Всегда оставляйте пустые секции в начале и в конце диапазона секционирования.Always keep empty partitions at both ends of the partition range. Это гарантирует отсутствие любого перемещения данных при разбиении секций и их слиянии.Keep the partitions at both ends to guarantee that the partition split and the partition merge don't incur any data movement. Разбиение секций возникает в начале, а слияние секций возникает в конце.The partition split occurs at the beginning and the partition merge occurs at the end. Избегайте разбиения или слияния заполненных секций.Avoid splitting or merging populated partitions. Разбиение или слияние заполненных секций может быть неэффективным.Splitting or merging populated partitions can be inefficient. Разбиение и слияние могут быть неэффективными, так как могут увеличить время формирования журнала в четыре раза, а также вызвать блокировку.They can be inefficient because the split or merge may cause as much as four times more log generation, and may also cause severe locking.

ОграниченияLimitations and Restrictions

Инструкция ALTER PARTITION FUNCTION повторно секционирует все таблицы и индексы, которые применяют функцию в рамках одной атомной операции.ALTER PARTITION FUNCTION repartitions any tables and indexes that use the function in a single atomic operation. Однако данная операция происходит в режиме вне сети и, в зависимости от масштаба повторного секционирования, может потребовать большого количества ресурсов.However, this operation occurs offline, and depending on the extent of repartitioning, may be resource-intensive.

Инструкция ALTER PARTITION FUNCTION может использоваться только для разбиения одной секции на две или слияния двух секций в одну.Only use ALTER PARTITION FUNCTION for splitting one partition into two, or merging two partitions into one. Чтобы разбить таблицу другим способом (например, от 10 секций до пяти), можно использовать следующие параметры.To change the way a table is otherwise partitioned (for example, from 10 partitions to five partitions), exercise any of the following options. В зависимости от конфигурации системы данные параметры могут различаться по ресурсоемкости.Depending on the configuration of your system, these options may vary in resource consumption:

  • Создайте секционированную таблицу с необходимой функцией секционирования.Create a new partitioned table with the necessary partition function. Затем вставьте данные из старой таблицы в новую с помощью инструкции INSERT INTO...SELECT FROM.Then, insert the data from the old table into the new table by using an INSERT INTO...SELECT FROM statement.

  • Создайте секционированный кластеризованный индекс по всей куче.Create a partitioned clustered index on a heap.

    Примечание

    Удаление результатов секционированного кластеризованного индекса в секционированной куче.Dropping a partitioned clustered index results in a partitioned heap.

  • Удалите и заново создайте существующий секционированный индекс с помощью инструкции Transact-SQLTransact-SQL CREATE INDEX с предложением DROP EXISTING = ON.Drop and rebuild an existing partitioned index by using the Transact-SQLTransact-SQL CREATE INDEX statement with the DROP EXISTING = ON clause.

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

Все файловые группы, обрабатываемые ALTER PARTITION FUNCTION, должны находиться в режиме в сети.All filegroups that are affected by ALTER PARTITION FUNCTION must be online.

ALTER PARTITION FUNCTION завершается неудачно, если в какой-либо таблице, использующей функцию секционирования, находится отключенный кластеризованный индекс.ALTER PARTITION FUNCTION fails when a disabled clustered index exists on any tables that use the partition function.

SQL ServerSQL Server не поддерживает репликацию для изменения функций секционирования.doesn't provide replication support for modifying a partition function. Изменения в функции секционирования в базе данных публикации нужно вручную применять к базе данных подписки.Changes to a partition function in the publication database must be manually applied in the subscription database.

РазрешенияPermissions

Для выполнения инструкции ALTER PARTITION FUNCTION может использоваться одно из перечисленных ниже разрешений.Any one of the following permissions can be used to execute ALTER PARTITION FUNCTION:

  • Разрешение ALTER ANY DATASPACE.ALTER ANY DATASPACE permission. Это разрешение назначено по умолчанию членам предопределенной роли сервера sysadmin и предопределенных ролей базы данных db_owner и db_ddladmin.This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.

  • Разрешение CONTROL или ALTER в базе данных, в которой была создана функция секционирования.CONTROL or ALTER permission on the database in which the partition function was created.

  • Разрешение CONTROL SERVER или ALTER ANY DATABASE на сервере базы данных, в которой была создана функция секционирования.CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function was created.

ПримерыExamples

A.A. Разбиение секции секционированной таблицы или индекса на две частиSplitting a partition of a partitioned table or index into two partitions

В следующем примере создается функция секционирования для разделения таблицы или индекса на четыре секции.The following example creates a partition function to partition a table or index into four partitions. ALTER PARTITION FUNCTION разбивает одну из секций на две, в результате получается пять секций.ALTER PARTITION FUNCTION splits one of the partitions into two to create a total of five partitions.

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. Объединение двух секций секционированной таблицы в одну секциюMerging two partitions of a partitioned table into one partition

Следующий пример создает такую же функцию секционирования, как описано выше, и затем объединяет две секции в одну, чтобы в итоге получилось три секции.The following example creates the same partition function as above, and then merges two of the partitions into one partition, for a total of three partitions.

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

См. также:See Also

Секционированные таблицы и индексы Partitioned Tables and Indexes
CREATE PARTITION FUNCTION (Transact-SQL) CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL) DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL) ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL) DROP PARTITION SCHEME (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
sys.partition_functions (Transact-SQL) sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL) sys.partition_range_values (Transact-SQL) sys.partition_parameters (Transact-SQL) sys.partition_range_values (Transact-SQL)
sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)sys.index_columns (Transact-SQL)