Предыдущий пост: Что такое 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