Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
module 3 Create Table.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
112 Кб
Скачать
☆

Создание секционированной таблицы или индекса

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

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

  • Столбец, по которому таблица должна быть секционирована (столбец секционирования). Столбец секционирования должен совпадать с указанным в функции секционирования, которая используется схемой секционирования, по типу данных, длине и точности. Если столбец является вычисляемым, он должен быть указан как PERSISTED.

Пример:

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

CREATE PARTITION FUNCTION myRangePF (int)

AS RANGE LEFT FOR VALUES (1, 100, 1000);

GO

CREATE PARTITION SCHEME myRangePS

AS PARTITION myRangePF

TO (test1fg, test2fg, test3fg, test4fg);

GO

CREATE TABLE PartitionTable (col1 int, col2 char(10))

ON myRangePS (col1) ;

Секционирование индексов

Секционировать можно не только данные, но и индексы. Индексы можно секционировать с помощью той же функции, что и базовую таблицу, либо любой другой. Однако с точки зрения производительности лучше всего разделять таблицу и ее индексы, используя одну и ту же функцию. Если таблица и индексы используют одну и ту же функцию секционирования, и секционируются по одним и тем же столбцам (в том же порядке), такая таблица и индексы называются выровненными. Если индекс создается по уже секционированной таблице, SQL Server автоматически выровняет новый индекс согласно схеме секционирования таблицы, если только индекс явно не секционирован по-другому. Если таблица и ее индексы выровнены, тогда SQL Server может перемещать секции внутри секционированных таблиц более эффективно, поскольку все связанные данные и индексы разделены по одному алгоритму. Если таблица и индексы определены не только по одной и той же функции, но и по одной и той же схеме, тогда они называются выровненным хранилищем. В мультипроцессорных системах в случае выровненных хранилищ SQL Server может заставить каждый процессор работать с определенным файлом или файловой группой, и при этом быть уверенным, что не будет конфликтов при доступе к данным, поскольку все необходимые для объединения или поиска по индексу данные будут локализованы на одном и том же диске. Это позволяет большему количеству процессов выполняться параллельно без прерываний

Слияние, разделение и переключение секций

Поскольку секционирование применяется к большим таблицам для обеспечения масштабируемости и поддержания лучшей производительности этих таблиц, весьма вероятно, что количество секций, выбранное в момент создания функции секционирования, со временем изменится.

Для изменения количества секций используются следующие операции:

  • Операция разделения используется при необходимости разделить существующую секцию на две, фактически добавляя новую граничную точку функции разбиения

  • Слияние позволяет объединить две рядом стоящие секции, то есть удалить граничную точку функции разбиения.

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

Операции слияния и разделения осуществляются путем изменения функции секционирования командой 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 для сохранения новой секции. Если нет ни одной файловой группы, отмеченной схемой секционирования как NEXT USED, то для хранения новой секции необходимо добавить файловую группу или назначить уже существующую при помощи инструкции ALTER PARTITION SCHEME. Файловая группа, которая уже содержит секции, может быть назначена для содержания дополнительных секций. Так как функция секционирования может использоваться в нескольких схемах секционирования, то все схемы с такой функцией, к которым добавляются секции, должны иметь файловую группу NEXT USED. Иначе ALTER PARTITION FUNCTION выдаст ошибку.

MERGE RANGE ( boundary_value )

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

Аргумент boundary_value должен быть существующим пограничным значением, на основе которого компонент Database Engine объединяет две смежные секции. Данный аргумент должен быть константой или выражением, которое может ссылаться на переменные или функции (включая определенные пользователем), при этом он не может ссылаться на выражения Transact-SQL.

Файловая группа, содержавшая значение boundary_value, удаляется из схемы секционирования, если она не используется оставшимися секциями или не обозначена как NEXT USED. Объединенная секция находится в файловой группе, которая изначально не содержит boundary_value.

Пример 1:

В следующем примере изменяется ранее созданная функция секционирования, из нее удаляется граничная точка 100.

CREATE PARTITION FUNCTION myRangePF ()

MERGE RANGE (100);

GO

Пример 2:

В следующем примере изменяется ранее созданная функция секционирования, путем добавления новой граничной точки 500.

CREATE PARTITION FUNCTION myRangePF ()

SPLIT RANGE (500);

GO

Переключение секций осуществляется командой ALTER TABLE.

ALTER TABLE table_name

{

SWITCH [ PARTITION source_partition_number_expression ]

TO target_table

[ PARTITION target_partition_number_expression ]

}

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

  • Переназначает все табличные данные как секцию в уже существующей секционированной таблице.

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

  • Переназначает все данные одной секции секционированной таблицы в уже существующую несекционированную таблицу.

Значения table и target_table не могут совпадать. Исходная и целевая таблицы должны иметь одинаковые столбцы с одинаковыми именами и одинаковым типом данных, длиной, параметром сортировки, точностью, масштабом и ограничениями на значения.

Если таблица table_name является секционированной, то необходимо указать аргумент source_partition_number_expression. Если таблица target_table секционирована, то должен быть указан аргумент target_partition_number_expression. Аргументы source_partition_number_expression и target_partition_number_expression должны быть константой или выражением, которое может ссылаться на переменные или функции (включая определенные пользователем), при этом аргумент не может ссылаться на выражения Transact-SQL.

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

Пример:

В следующем примере значения из первой секции ранее созданной секционированной таблицы PartitionTable переключаются в отдельную таблицу HistoryTable.

ALTER TABLE PartitionTable

SWITCH PARTITION 1

TO HistoryTable

GO

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]