Greenplum: хранение таблиц
Хранение в GP - выбор между heap и append-optimized, партиции и способ загрузки. Вопрос-детектор: «как зальёшь терабайт» - ответ «INSERT'ами» закрывает собеседование.
// Дух AO-мира: append-only; правки - перезагрузкой партиций, не UPDATE'ами.
Heap против AO/AOCO
Heap - постгресовое хранение: для небольших часто меняемых таблиц (справочники, статусные). Append-Optimized - для больших фактов с массовыми вставками.
AO бывает строчным и колоночным (AOCO): колоночный - широкие таблицы, аналитические чтения избранных колонок, сжатие по колонке (zstd/zlib, RLE). UPDATE/DELETE на AO дороги и оставляют дырки это append-мир.
// Выбор одним вопросом: таблица меняется построчно или дописывается порциями? Первое - heap, второе - AO/AOCO.
- AO / AOCO
- append-optimized строчный / колоночный со сжатием
- RLE
- run-length encoding
Партиции и их ортогональность дистрибуции
Партиционирование по диапазону дат (плюс list по категориям): pruning в запросах, DROP PARTITION вместо DELETE, exchange partition для загрузок.
Партиция и дистрибуция ортогональны: партиция режет таблицу «по значению», дистрибуция раскладывает каждую партицию по сегментам. Это два независимых решения.
// Тысячи мелких партиций «на всякий случай» - пухнущий каталог и тормозящее планирование: партиция - под реальные паттерны запросов и обслуживания.
- exchange partition
- подмена партиции готовой таблицей - приём загрузки
Загрузка мимо мастера и индексы
Параллельная загрузка - gpfdist: сегменты тянут файлы напрямую с файловых серверов, мимо мастера. Терабайт INSERT'ами через мастер - часы против минут. PXF - федерация к HDFS (Hadoop Distributed File System)/S3/внешним БД.
Индексы в GP вторичны: полный параллельный скан обычно быстрее, btree - для редких селективных точечных запросов. Строить индексы на фактах «как в OLTP (online transaction processing)» - место и замедление загрузок без пользы.
// Правки больших фактов - перезагрузкой партиций (exchange), а не UPDATE'ами: так AO-мир остаётся быстрым.
- gpfdist
- параллельная загрузка: сегменты тянут файлы мимо мастера
Как отвечать: «Как загрузишь терабайт данных в Greenplum?»
Параллельно и мимо мастера: gpfdist-серверы раздают файлы, сегменты тянут их напрямую - все узлы грузят одновременно, это минуты против часов построчных INSERT'ов через мастер. Целевая таблица - AO/AOCO со сжатием, партиционированная по дате; загрузка идёт в staging, затем exchange partition подменяет партицию атомарно. После загрузки обязательные два шага: ANALYZE, иначе оптимизатор слеп, и проверка skew по сегментам - равномерно ли легло. Из HDFS или S3 - тот же паттерн через PXF.
Правильный механизм, паттерн staging+exchange и пост-шаги - полный производственный маршрут загрузки.
На чём валят
- −AOCO для таблицы с частыми UPDATE - не для того построено.
- −Терабайт INSERT'ами через мастер вместо gpfdist - часы против минут.
- −Тысячи мелких партиций «на всякий случай» - каталог пухнет.
- −Индексы на факт-таблицах как в OLTP - место и тормоза загрузок без пользы.
- −Heap для гигантского лога - AOCO сжал бы в разы.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Что такое append-optimized (AO) таблица в Greenplum и когда её выбирают?A)AO-таблицы предназначены прежде всего для частых точечных UPDATE и DELETE отдельных строкB)Под bulk-загрузку/чтение и сжатие; для больших append-таблицC)AO — это способ хранить таблицу целиком в оперативной памяти сегментов ради скоростиD)AO не поддерживает сжатие данных, поэтому занимает больше места на диске, чем обычный heap
показать ответ и разбор
+B)Под bulk-загрузку/чтение и сжатие; для больших append-таблиц// разбор: Append-optimized (AO) — формат хранения, оптимизированный под массовую загрузку и аналитическое чтение: он компактнее heap, поддерживает сжатие и контрольные суммы, и заточен под добавление данных. Его берут для больших факт-таблиц и данных, которые в основном пишутся пачками и читаются, а не правятся построчно. AO плохо подходит под частые точечные UPDATE/DELETE (они дороги и логически, а не физически, удаляют данные — нужна периодическая компакция). Бывает строковым (AO row) и колоночным (AOCO).
- Что такое AOCO (append-optimized column-oriented) хранение и в чём его выгода?A)AOCO хранит данные построчно, но с более агрессивным сжатием, чем обычная heap-таблицаB)Колоночное хранение в Greenplum доступно и для heap-таблиц, и для append-optimized одинаковоC)Колоночное AO — читаем нужные колонки, сильнее сжатиеD)AOCO выгоден прежде всего для запросов, читающих каждую строку целиком со всеми её колонками
показать ответ и разбор
+C)Колоночное AO — читаем нужные колонки, сильнее сжатие// разбор: AOCO хранит данные по столбцам (а не по строкам): для аналитического запроса, берущего несколько колонок из широкой таблицы, читаются только они, а не вся строка, — меньше I/O. Однотипные значения в колонке жмутся сильнее, чем разнородные в строке. В Greenplum колоночное хранение возможно только для append-optimized таблиц (AOCO). Идеально для больших витрин с широкими таблицами и запросами по подмножеству колонок; для узких таблиц или доступа «вся строка целиком» выгода мала, а точечные правки дороги.
- Как в Greenplum партиционируют большую факт-таблицу и что это даёт?A)Партиционирование в Greenplum раскидывает строки по сегментам вместо ключа распределенияB)Партиции дают уникальность строк и заменяют собой первичный ключ большой факт-таблицыC)Партиционирование поддерживается по хешу столбца, диапазоны и списки в Greenplum недоступныD)Range/list-партиции по дате → partition pruning + дешёвый drop
показать ответ и разбор
+D)Range/list-партиции по дате → partition pruning + дешёвый drop// разбор: Greenplum поддерживает партиционирование по диапазону (range, чаще по дате) и списку (list), с вложенными подпартициями. Это делит таблицу на части внутри каждого сегмента (независимо от распределения по сегментам). Выгода: partition pruning — запрос с фильтром по дате читает только соответствующие партиции, а не всю таблицу; управление данными — удалить/переналить период это drop/exchange партиции, а не тяжёлый DELETE. Партиционирование ортогонально распределению: крупную таблицу и распределяют по ключу, и партиционируют по дате.
- Зачем в Greenplum внешние (external) таблицы поверх gpfdist/PXF?A)Читать/грузить данные из внешних файлов (сегменты тянут их параллельно) без предварительной загрузки в таблицы кластераB)External-таблицы хранят данные внутри Greenplum, но в отдельной сжатой области на координатореC)Через gpfdist данные грузятся строго последовательно через координатор, по одной строке за разD)External-таблицы нужны для экспорта результатов и не могут служить источником загрузки
показать ответ и разбор
+A)Читать/грузить данные из внешних файлов (сегменты тянут их параллельно) без предварительной загрузки в таблицы кластера// разбор: External table описывает данные, лежащие вне Greenplum (файлы на ETL-хостах, S3/HDFS через PXF), как таблицу, к которой можно обращаться SQL. Ключевое — параллелизм загрузки: сервис gpfdist отдаёт файлы, а сегменты Greenplum тянут их части одновременно, минуя узкое горлышко координатора. Так грузят большие объёмы на порядки быстрее, чем построчными INSERT через координатор. External-таблицы используют и для ELT (SELECT прямо из внешних данных), и как источник для INSERT ... SELECT в целевую таблицу.
- Как выбирают между heap, AO-row и AOCO для таблицы в Greenplum?A)Берут heap: он поддерживает и обновления, и эффективное аналитическое чтение сразуB)Heap — правки; AO-row — append целыми строками; AOCO — колоночная аналитикаC)AOCO выбирают под частые точечные обновления, а heap — под массовую аналитическую загрузку данныхD)Тип хранения на производительность не влияет, поэтому выбор между ними — чистая формальность
показать ответ и разбор
+B)Heap — правки; AO-row — append целыми строками; AOCO — колоночная аналитика// разбор: Выбор диктует профиль нагрузки. Heap — данные с частыми точечными UPDATE/DELETE/singleton INSERT (staging с апдейтами, изменяемые справочники): MVCC-модель это тянет, ценой bloat/VACUUM. AO row-oriented — большие, преимущественно дописываемые таблицы, которые часто читают целыми строками или широким срезом колонок; компактно и со сжатием. AOCO (колоночное) — широкие аналитические таблицы, где запросы берут немного колонок из многих: читаются только нужные колонки, сильное сжатие. Общее правило: меняется часто — heap; льётся пачками и читается аналитикой — AO, а по узкому набору колонок — AOCO.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.