Teradata - разделенный первичный индекс
Разделенный первичный индекс (PPI) - это механизм индексации, который полезен для повышения производительности определенных запросов. Когда строки вставляются в таблицу, они сохраняются в AMP и упорядочиваются по их порядку хеширования строк. Когда таблица определяется с помощью PPI, строки сортируются по номеру раздела. Внутри каждого раздела они упорядочены по хэшу строк. Строки назначаются разделу на основе определенного выражения раздела.
Преимущества
Избегайте полного сканирования таблицы для определенных запросов.
Избегайте использования вторичного индекса, который требует дополнительной физической структуры и дополнительного обслуживания ввода-вывода.
Быстрый доступ к подмножеству большой таблицы.
Быстро отбросьте старые данные и добавьте новые.
пример
Рассмотрим следующую таблицу заказов с первичным индексом для номера заказа.
Хранить нет | № заказа | Дата заказа | Весь заказ |
---|---|---|---|
101 | 7501 | 2015-10-01 | 900 |
101 | 7502 | 2015-10-02 | 1,200 |
102 | 7503 | 2015-10-02 | 3 000 |
102 | 7504 | 2015-10-03 | 2,454 |
101 | 7505 | 2015-10-03 | 1201 |
103 | 7506 | 2015-10-04 | 2,454 |
101 | 7507 | 2015-10-05 | 1201 |
101 | 7508 | 2015-10-05 | 1201 |
Предположим, что записи распределены между AMP, как показано в следующих таблицах. Записанные хранятся в AMP, отсортированных по хэшу их строк.
RowHash | № заказа | Дата заказа |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | № заказа | Дата заказа |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
Если вы запустите запрос для извлечения заказов на определенную дату, тогда оптимизатор может выбрать использование полного сканирования таблицы, после чего можно будет получить доступ ко всем записям в AMP. Чтобы избежать этого, вы можете определить дату заказа как Partitioned Primary Index. Когда строки вставляются в таблицу заказов, они разделяются по дате заказа. Внутри каждого раздела они будут отсортированы по хешу строки.
Следующие данные показывают, как записи будут храниться в AMP, если они разделены по дате заказа. Если запрос выполняется для доступа к записям по дате заказа, то будет доступен только раздел, содержащий записи для этого конкретного заказа.
Раздел | RowHash | № заказа | Дата заказа |
---|---|---|---|
0 | 3 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
Раздел | RowHash | № заказа | Дата заказа |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 3 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
Ниже приведен пример создания таблицы с первичным индексом раздела. Предложение PARTITION BY используется для определения раздела.
CREATE SET TABLE Orders (
StoreNo SMALLINT,
OrderNo INTEGER,
OrderDate DATE FORMAT 'YYYY-MM-DD',
OrderTotal INTEGER
)
PRIMARY INDEX(OrderNo)
PARTITION BY RANGE_N (
OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);
В приведенном выше примере таблица разделена по столбцу OrderDate. На каждый день будет один отдельный раздел.