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


Изменение функции секционирования

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

Вы можете изменить способ секционирования таблицы или индекса в SQL Server, Azure SQL Database и Azure SQL Managed Instance, добавляя или вычитая число секций в функции секционирования таблицы или индекса с помощью Transact-SQL, с шагом 1. Добавление секции осуществляется путем разбиения существующей секции на две и переопределением границ новых секций. При удалении раздела границы двух разделов объединяются в одну. Это действие повторно заполняет одну секцию и оставляет другую незаполненной. Ознакомьтесь с рекомендациями перед изменением функции секционирования.

Внимание

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

Секционирование таблиц также доступно в выделенных пулах SQL в Azure Synapse Analytics с некоторыми различиями синтаксиса. Дополнительные сведения о секционированиях таблиц в выделенном пуле SQL.

Ограничения

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

    • Создайте новую секционированную таблицу с нужной функцией секционирования, а затем вставьте данные из старой таблицы в новую с помощью оператора INSERT INTO ... SELECT FROM Transact-SQL или Manage Partition Wizard в SQL Server Management Studio (SSMS).

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

      Примечание.

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

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

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

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

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

Разрешения

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

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

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

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

Запрос секционированных объектов в базе данных

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

SELECT 
	PF.name AS PartitionFunction,
	ds.name AS PartitionScheme,
    OBJECT_SCHEMA_NAME(si.object_id) as SchemaName,
	OBJECT_NAME(si.object_id) AS PartitionedTable, 
	si.name as IndexName
FROM sys.indexes AS si
JOIN sys.data_spaces AS ds
	ON ds.data_space_id = si.data_space_id
JOIN sys.partition_schemes AS PS
	ON PS.data_space_id = si.data_space_id
JOIN sys.partition_functions AS PF
	ON PF.function_id = PS.function_id
WHERE ds.type = 'PS'
AND OBJECTPROPERTYEX(si.object_id, 'BaseType') = 'U'
ORDER BY PartitionFunction, PartitionScheme, SchemaName, PartitionedTable;

Разделение секции с помощью Transact-SQL

  1. В обозреватель объектов подключитесь к целевой базе данных.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.

    В этом примере:

    • Проверяет предыдущую версию функции раздела myRangePF1 и удаляет ее, если она найдена.
    • Создает функцию секционирования под названием myRangePF1, которая разбивает таблицу на четыре раздела.
    • Разделяет раздел между границами значений 100 и 1000 на раздел между границами значений 100 и 500, а также на раздел между границами значений 500 и 1000.
    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  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    SPLIT RANGE (500);  
    

Объединение двух разделов с помощью Transact-SQL

  1. В обозреватель объектов подключитесь к целевой базе данных.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.

    В этом примере:

    • Проверяет, существует ли предыдущая версия функции myRangePF1 секционирования и удаляет ее, если она найдена.
    • Создает функцию разбиения с именем myRangePF1, использующую три значения границ, что приведет к четырём разбиениям.
    • Объединяет секцию между boundary_values 1 и 100 с секцией между boundary_values 100 и 1000.
    • Это приводит к тому, что функция myRangePF1 секционирования имеет две точки границы, 1 и 1000.
    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  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    MERGE RANGE (100);  
    

Удаление функции секционирования с помощью SSMS

  1. В обозреватель объектов подключитесь к целевой базе данных.

  2. Разверните базу данных, где вы хотите удалить функцию секционирования, а затем разверните папку Хранение.

  3. Разверните папку Функции секционирования .

  4. Щелкните правой кнопкой мыши функцию секционирования, которую нужно удалить, и выберите пункт Удалить.

  5. В диалоговом окне "Удалить объект" убедитесь, что выбрана правильная функция секции, а затем нажмите кнопку "ОК".

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

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