...

четверг, 16 января 2014 г.

Распределение строк и доступ в СУБД Teradata (Primary Index)

Как Teradata распределяет строки?

  • Teradata использует алгоритм хэширования для рандомного распределения строк таблицы между AMP-ами (преимущества: распределение одинаково, независимо от объема данных, и зависит от содержания строки, а не демографии данных)

  • Primary Index определяет, будут ли строки таблицы распределены равномерно или неравномерно между AMP-ами

  • Равномерное распределение строк таблицы ведет к равномерному распределению нагрузки

  • Каждый AMP отвечает только за свое подмножество строк каждой таблицы

  • Строки размещаются неупорядоченно (преимущества: не требуется поддержка сохранения порядка, порядок не зависит от любого представленного запроса)


Primary Key (PK) vs. Primary Index (PI)



Primary Key (первичный ключ) – это условность реляционной модели, которая однозначно определяет каждую строку.

Primary Index – это условность Teradata, которая определяет распределение строк и доступ.

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
















































Primary Key (PK)Primary Index (PI)
Логическая концепция моделирования данныхМеханизм для распределения строк и доступа
Teradata не нуждается в определении PKТаблица должна обязательно иметь один PI
Нет ограничения на количество столбцовМожет быть от 1 до 64 столбцов
PK определен в логической модели данныхPI определяется при создании таблицы
Значение должно быть уникальнымЗначение не обязательно должно быть уникальным
Уникальность идентифицирует каждую строкуИспользуется для размещения строки в AMP
Значения не должны менятьсяЗначения могут меняться (обновляться)
Не может принимать значения NULLМожет принимать значения NULL
Не относится к пути доступаОпределяет наиболее эффективный путь доступа
Выбирается для логической корректностиВыбирается для физической производительности соединения значений



Существует два типа PI: UPI (Unique Primary Index) и NUPI (Non-Unique Primary Index). При использовании UPI строки распределяются равномерно между AMP-ами, а при использовании NUPI строки с одинаковыми значениями индекса относятся к одному и тому же AMP-у.

Создание таблиц с UPI и NUPI:



CEATE TABLE Table1
( Col1 INTEGER,
Col2 INTEGER )
UNIQUE PRIMARY INDEX (Col1);



CEATE TABLE Table2
( Col1 INTEGER,
Col2 INTEGER )
PRIMARY INDEX (Col2);


Распределение строк с помощью хеширования



Значение Primary Index передается в алгоритм хеширования, который обеспечивает равномерное распределение уникальных значений среди всех AMP-ов. Алгоритм выдает 32-битное значение хэш-строки. Первые 16 бит (Hash Bucket Number) используются в качестве указателя на хэш-карту (Hash Map). Хэш-значения вычисляются с помощью алгоритма хэширования. Хэш-карта уникально сконфигурирована для каждой системы, это массив, который связывает DSW (ключ статистики) с определенным AMP. Две системы с одинаковым количеством AMP-ов будут иметь одинаковую хэш-карту. Изменение количества AMP-ов в системе требует изменений в хэш-карте.
NoPI Table



NoPI-таблица – это таблица без Primary Index (фича 13-й версии Терадаты). В этом случае новые строки добавляются всегда в конец таблицы и никогда не добавляются в середину хэш-последовательности.

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

Преимущества:

Таблица уменьшит смещение в промежуточных таблицах ETL (Extract, Transform, Load —извлечение, преобразование, загрузка), которые не имеют Primary Index.

Загрузки (FastLoad and TPump Array Insert) в NoPI промежуточной таблицы происходят быстрее.


PPI и MLPPI



PPI (Partitioned Primary Index) – это механизм партиционирования, который используется для улучшения производительности для больших таблиц при отправке запросов, задающих ограничение диапазона.

Распределение данных с помощью PPI основано на PI: Primary Index -> Hash-значение -> определение AMP-а, который получит строку. С NPPI (No Partitioned Primary Index) строки в AMP-е располагаются в порядке хэш-строки. При использовании PPI строки сначала располагаются по партициям, а затем в порядке хеш-строки.

MLPPI (Multi-Level Partitioned Primary Index) позволяет мультипартиционирование или использование несжатого Join Index. В многоуровневом партиционировании каждый уровень партиционирования определяется независимо с помощью выражений RANGE_N или CASE_N.


Цель партиционирования (секционирования) – уменьшение нагрузки на систему в случае, если данные в таблице редко или даже никогда не обновляются (например, различные логи).


P.S.

Как раз сегодня опубликовали статью Физический дизайн структур хранения в СУБД Teradata в блоге компании Teradata, поэтому про Secondary Index я писать не буду.

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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий