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

в 8:24, , рубрики: big data, sql, teradata, метки:

Предыдущий пост: Что такое Teradata?

Как 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 я писать не буду.
Надеюсь, компания продолжит регулярную серию статей, и мне не придется переводить документацию с английского.

Автор: alfiruna

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js