Pull to refresh

Comments 9

Теперь нужно разобраться с понятием Primary Index: каким образом проставляются эти индексы и как они влияют на быстродействие.

Это намек на продолжение? Тогда хотелось бы и про Hash Index и Join Index.
Да, я собираюсь написать продолжение. Постараюсь учесть ваши пожелания!
В общем, кратко об индексах:

Primary Index — это один или несколько столбцов уникальных (UPI) или неуникальных (NUPI) данных таблицы, которые используются для доступа к строкам AMP-ов. Самый быстрый способ доступа — через PI, но только если в запросе участвуют все столбцы индекса с условием "=".
Если используется UPI, то строки распределяются равномерно между AMP-ами, а если NUPI, то строки с одинаковым значением индекса попадают на один AMP и рапределение строк зависит от степени неуникальности PI.
Доступ к строкам происходит с помощью алгоритма хеширования.
Строки отсортированы по значению PI (для каждого AMP-а в хеш-таблице хранится диапазон значений индекса), поэтому добавление строк занимает больше времени, чем в случае NoPI-table, когда строки записываются в конец таблицы.
Когда AMP, на котором находится искомая строка, определен, Teradata использует индексные структуры для поиска требуемого блока данных. Последовательно просматриваются: Master Index для поиска цилиндра, содержащего нужный блок данных и Cylinder Index для поиска нужного блока данных.

Secondary Index — индексные подтаблицы, в которых записаны значения индекса и соответствующие им идентификаторы строк базовой таблицы. Вторичных индексов в таблице может быть несколько.
Доступ по уникальному (USI) и неуникальному (NUSI) вторичному индексу отличается.
Строки индексной подтаблицы USI распределяются по AMP-ам с использованием результата хеширования колонки индексирования. Строка индексной таблицы и соответствующая строка базовой таблицы могут находиться на разных AMP-ах. Доступ по USI так же эффективен, как и доступ по PI, и в запросе также должны участвовать все столбцы индекса с условием "=".
Строки индексной подтаблицы NUSI расположены на тех же AMP-ах, что и строки базовой таблицы, и отсортированы по хэш-значению индекса. Если при выполнении запроса будет отобрано более 1 % строк таблицы, то оптимизатор выберет FTS — полный просмотр таблицы. NUSI может быть использован и для запросов с диапазонным доступом (<, >, >=, <=, BETWEEN) к строкам таблицы, если строки индексной подтаблицы отсортированы (опция «ORDER BY VALUES») по значению индексной колонки.
Hash NUSI — это NUSI-индекс, отсортированный по хэш-значению конкретного поля, входящего в индекс, а не по хэш-значению от всех входящих в него колонок. Такой индекс позволяет оптимизировать производительность запросов с условиями на равенство.
Value Ordered NUSI — это NUSI-индекс, отсортированный по значению конкретного поля. Такой индекс позволяет оптимизировать запросы, имеющие в качестве условия фильтрации диапазоны или условия неравенства.

Оптимизатор Teradata при наличии альтернатив всегда предпочтет первичный индекс вторичному и уникальный — неуникальному.

Join Index — особый вид индекса, представляющий собой сохраненный и обновляемый результат SQL-запроса, который может содержать соединение таблиц. Он используется при наличии частых запросов соединения нескольких таблиц и/или выполнения агрегаций. Если включить в Join Index поле «ROWID» — тогда СУБД сможет в случае необходимости выполнять эффективное соединение индекса с базовой таблицей.
Single-Table Join Index — это Join Index, в котором нет соединения таблиц. Он используется для соединений в больших таблицах без необходимости перераспределения присоединенных строк между AMP-ами.
Multi-Table Join Index — индекс для предварительного соединения множества таблиц. Он хранит и обрабатывает результат соединения двух и более таблиц.
Aggregate Join Index — объединяет (SUM or COUNT) один или несколько столбцов одной или нескольких таблиц в сводную таблицу.

Hash Index — используется с той же целью, что и Single-Table Join Index. Этот индекс создает полную или частичную копию базовой таблицы с первичным индексом на столбец внешнего ключа, чтобы облегчить соединение очень больших таблиц, путем хеширования их к тому же AMP-у. Hash Index можно определить только на отдельной таблице. Хэш-индексы не являются индексами в обычном смысле этого слова, это базовые таблицы, которые не могут быть доступны непосредственно в запросе.

Sparse Index — любой редкий Join Index (простой или совокупный, Multi-Table или Single-Table).
Sparse Join Index использует постоянное выражение в условии WHERE в своем определении, чтобы строго фильтровать заполнение строки.
Большое спасибо Автору за статью.

Однако хочу заметить, что:
— мысль, высказанная в предисловии, конфликтует с указанием в статье ссылок на русскоязычные ресурсы, включая блог компании Teradata.
— в статье присутствуют неточности. Для примера: «Основное понятие в архитектуре Teradata Database — это AMP (Access Module Processor), отдельная нода/узел, содержащая и самостоятельно обрабатывающая свои данные». В действительности AMP — виртуальный процессор, управляющий ассоциированным с ним объемом дискового пространства. Для ознакомления с основами Teradata могу порекомендовать статью habrahabr.ru/company/teradata/blog/160821/ в блоге компании (там же можно задать интересующие вопросы).
— в блоге компании Teradata (http://habrahabr.ru/company/teradata/blog/) есть ряд технических статей, написанных специалистами компании, обладающими бОльшими знаниями платформы и СУБД Teradata и готовыми ответить на возникающие вопросы.
Четыре статьи в блоге компании — как-то маловато, я бы хотела почитать подробную документацию на русском, начиная с основ «для новичков».
Честно говоря, когда я писала эту статью, я надеялась, что кто-нибудь меня поправит и дополнит, а еще лучше — если компания Teradata продолжит писать свой блог.
Поправлять и дополнять я не стал сознательно, дабы не переписывать уже написанное и не обсуждать обсужденное в блоге Teradata.

Также мы по мере возможностей стараемся оправдывать ожидания наших подписчиков и на днях опубликуем статью об основных принципах физического дизайна для СУБД Teradata.
Вот цитата из рекомендованной вами статьи: «PE и AMP объединяются термином VPROC, или виртуальный процессор».
AMP — это компонента, которая извлекает данные с ассоциированного с ним диска и возвращает ее PE через BYNET.

Да, в блоге компании написаны хорошие технические статьи, но они не представляют полной картины. Могли бы хоть сделать отдельную статью с кратким описанием преимуществ Терадаты по сравнению с другими СУБД, почему ее вообще стоит покупать.
Разве приведенная вами цитата противоречит тому, что я написал? AMP — виртуальный процессор, а не узел.

Та статья, ссылку на которую я привел, и цитату из которой вы использовали, как раз и является вводной и описывает отличительные особенности СУБД Teradata.
В ней также есть следующие предложения: «Мы планируем подготовить небольшую серию статей о самых интересных, на наш взгляд, технических особенностях СУБД и работы с ней. Если у вас есть опыт работы с Teradata или в вашей компании используется наша платформа и у вас есть вопросы – подкидывайте их, и мы либо ответим на них в комментариях, либо подготовим соответствующую полноценную статью.».
Only those users with full accounts are able to leave comments. Log in, please.