ALTER PARTITION FUNCTION (Transact-SQL)
Эта инструкция изменяет функцию секционирования путем разбиения или слияния ее пограничных значений. При выполнении инструкции ALTER PARTITION FUNCTION одна секция какой-либо таблицы или индекса, которые используют функцию секционирования, может быть разбита на две секции или две секции могут быть объединены в одну.
Внимание! |
---|
Несколько таблиц или индексов могут использовать одинаковую функцию секционирования. Инструкция ALTER PARTITION FUNCTION применяется ко всем таблицам и индексам в рамках одной транзакции. |
Синтаксис
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.
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 2008 не поддерживает репликацию для изменения функций секционирования. Изменения в функции секционирования в базе данных публикации нужно вручную применять к базе данных подписки.
Разрешения
Для выполнения инструкции 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);
См. также