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


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

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

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

Внимание

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

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

Ограничения

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

    • Создайте секционированную таблицу с требуемой функцией секционирования, а затем вставьте данные из старой таблицы в новую таблицу с помощью инструкции INSERT INTO ... Инструкция SELECT FROM Transact-SQL или мастер управления секциями в 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 называется секционированием таблицы на четыре секции.
    • Разделяет раздел между boundary_values 100 и 1000, чтобы создать секцию между boundary_values 100 и 500 и секцией между boundary_values 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. В диалоговом окне "Удалить объект" убедитесь, что выбрана правильная функция секции, а затем нажмите кнопку "ОК".

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

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