Секционированные таблицы и индексы SQL Server 2005 - CREATE PARTITION FUNCTION для диапазонных секций

ОГЛАВЛЕНИЕ

 

CREATE PARTITION FUNCTION для диапазонных секций

Диапазонные секции должны быть определены с граничными условиями. Кроме того, все границы должны быть включены; функция диапазонного секционирования должна включать все значения даже притом, что диапазон значений таблицы может быть (и должен быть) более ограниченным (посредством CHECK constraint). Никакие значения (с любого конца диапазона) не должны быть исключены. Кроме того, поскольку данные, вероятно, будут добавляться и удаляться из секции, вам потребуется последняя пустая секция, которую вы сможете постоянно "расщеплять", выделяя тем самым место для новой секции данных. Эта последняя секция будет всегда оставаться пустой, находясь в ожидании новых записей, которые вы будете периодически в нее включать.

При диапазонном секционировании вначале определяют граничные точки. Если Вы определяете пять секции, то потребуются только четыре граничные точки. Для того чтобы разделить данные на пять групп, Вы определяете четыре граничных значения для секций, а затем определяете, какой из секций будет принадлежать каждое из этих значений: первой (LEFT) или второй (RIGHT).

У Вас всегда будет одна секция (крайне правая для LEFT-функции, или крайне левая для RIGHT-функции), у которой не будет явно заданной граничной точки. Это объяснение может показаться несколько запутывающим, однако помните, что функция секционирования включает все значения данных (- бесконечность слева и бесконечность справа).
Определяя режим LEFT или RIGHT, Вы определяете, является ли граничное значение верхней границей первой секции (LEFT) или нижней границей второй секции (RIGHT). Другими словами, если первое значение (граничное условие) функции секционирования будет '20001001', тогда значения в пределах соседствующих секций распределятся так:

    Для LEFT:
    1-ая секция - диапазон данных <= '20001001'
    2-ая секция - диапазон данных > '20001001'
    Для RIGHT:
    1-ая секция - диапазон данных < '20001001'
    2-ая секция - диапазон данных => '20001001'

Поскольку Ваши диапазонные секции наверняка будут определяться по столбцам с типом данных datetime, то вам следует знать об импликациях (implication - "вовлечение").

Примечание: Импликация (от лат . implico - тесно связываю) - приблизительный логический эквивалент оборота "если..., то..."; операция, формализующая логические свойства этого оборота.

Применяя тип данных datetime, Вы всегда используете ОДНОВРЕМЕННО и дату и время. Дата без определенного значения времени подразумевает нулевое время - 12:00am. Если, к примеру, LEFT-функция базируется на этом типе данных, то тогда данные за 1 октября 12:00am попадут в 1-ую секцию, а остальная часть октября - во 2-ую. По логике, лучше всего использовать начальные значения (набора данных второй секции) с RIGHT-функцией и конечные значения (набора данных первой секции) с LEFT-функцией. Три следующих выражения создают логически идентичные структуры секционирования:

RANGE LEFT FOR VALUES ('20000930 23:59:59.997',
'20001231 23:59:59.997',
'20010331 23:59:59.997',
'20010630 23:59:59.997')
OR
RANGE RIGHT FOR VALUES ('20001001 00:00:00.000',
'20010101 00:00:00.000',
'20010401 00:00:00.000',
'20010701 00:00:00.000')
OR
RANGE RIGHT FOR VALUES ('20001001', '20010101', '20010401', '20010701')

Примечание: Использование типа данных datetime добавляет сложности, поскольку Вы должны будете удостовериться в том, что установили правильные граничные значения. В случае с RIGHT-функцией все предельно просто, т.к. время по умолчанию равняется 12:00:00.000am. Для LEFT дополнительная сложность обусловлена точностью типа данных datetime. Причина, по которой вы ДОЛЖНЫ выбирать в качестве граничного значения 23:59:59.997, состоит в том, что тип данных datetime не гарантирует точность в 1 миллисекунду. Вместо этого, datetime-данные абсолютно точны в пределах 3.33 миллисекунд. Значение такта таймера процессора (tick) равное 23:59:59.999 не доступно для SQL Server, вместо этого значение округляется до ближайшего такта, которым является 12:00:00.000am следующего дня. Из-за такого округления границы могут быть неверно определены. Проявляйте осмотрительность при задании значений в миллисекундах для типа данных datetime.

Примечание: Функции секционирования также позволяют в качестве определения использовать другие функции. Вы можете использовать функцию DATEADD (ms,-3, '20010101') вместо явного определения '20001231 23:59:59.997'.

За дополнительной информацией обратитесь к разделу BOL: "Date and Time" in the Transact-SQL Reference.

Для того чтобы хранить по одной четверти данных таблицы Orders в четырех активных секциях (представляющих календарные кварталы) и иметь пятую секцию для последующего использования (в качестве полигона для добавления/исключения данных из секционированной таблицы), используйте такую LEFT-функцию секционирования с четырьмя граничными условиями:

CREATE PARTITION FUNCTION OrderDateRangePFN(datetime)
AS
RANGE LEFT FOR VALUES ('20000930 23:59:59.997',
'20001231 23:59:59.997',
'20010331 23:59:59.997',
'20010630 23:59:59.997')

Помните, что четыре граничные точки создают 5 секции - с одной пустой секцией справа, если функция секционирования определена как LEFT, и одной пустой секцией слева, если функция определена как RIGHT. Посмотрите какие наборы данных создаются этой функцией секционирования:

    Граничная точка '20000930 23:59:59.997' LEFT-ФУНКЦИИ (задает модель):
              КРАЙНЕ ЛЕВАЯ секция будет включать все значения <= '20000930 23:59:59.997'
    Граничная точка '20001231 23:59:59.997':
              ВТОРАЯ секция будет включать все значения > '20000930 23:59:59.997' и <= '20001231 23:59:59.997'
    Граничная точка '20010331 23:59:59.997':
              ТРЕТЬЯ секция будет включать все значения > '20001231 23:59:59.997' и <= '20010331 23:59:59.997'
    Граничная точка '20010630 23:59:59.997':
              ЧЕТВЕРТАЯ секция будет включать все значения > '20010331 23:59:59.997' и <= 20010630 23:59:59.997'
    Наконец, ПЯТАЯ секция будет включать все значения > '20010630 23:59:59.997'.

Независимо от модели (LEFT или RIGHT), функция диапазонного секционирования должна включать все значения: от бесконечно малого до бесконечно большого. Для функции LEFT последняя граничная точка определит последнее абсолютное значение секций, но поскольку функция должна охватывать всю область данных, то для значений, больших чем значение последней граничной точки, должна существовать заключительная секция. При использовании LEFT-функций всегда будет существовать одна дополнительная секция в конце, и одна дополнительная секция вначале - для RIGHT-функций.