Гибридное строково-колоночное хранение¶
Как OLAP‑база данных, StarRocks изначально использует колоночное хранение данных, что повышает производительность сложных запросов, например агрегирующих. Начиная с версии v3.2.3, StarRocks также поддерживает гибридное строково‑колоночное хранение, при котором данные хранятся одновременно построчно и поколоночно. Такое гибридное хранение хорошо подходит для сценариев с обращениями по первичному ключу, высококонкурентными низколатентными точечными запросами и частичными обновлениями столбцов, при этом обеспечивая аналитические возможности, сопоставимые с колоночным хранением. Кроме того, гибридное строково‑колоночное хранение поддерживает prepared statements, что повышает производительность и безопасность запросов.
Сравнение колоночного и гибридного строково‑колоночного хранения¶
Гибридное строково‑колоночное хранение
Метод хранения: данные хранятся одновременно построчно и поколоночно. Проще говоря, таблица с гибридным хранением содержит дополнительный скрытый столбец двоичного типа __row. При записи данных все значения value‑столбцов каждой строки кодируются и записываются в столбец __row (см. ниже). Поскольку данные дублируются в обоих форматах, возникают дополнительные затраты на хранение.

Сценарии: поддерживаются варианты использования как построчного, так и поколоночного хранения, но с дополнительными затратами на хранение.
Сценарии для построчного хранения это высококонкурентные точечные запросы по первичным ключам:
Запросы по большинству полей в таблицах с небольшим количеством полей.
Частичные обновления столбцов (в частности, нужно обновить несколько столбцов у небольшого числа строк).
Сценарии для поколоночного хранения: сложная аналитика.
Колоночное хранение
Метод хранения: данные хранятся поколоночно.

Сценарии: сложная аналитика. Сложные запросы и аналитика по большим наборам данных, такие как агрегирующий анализ и многотабличные JOIN‑запросы. Здесь таблицы с большим числом полей (широкие таблицы), при этом запросы затрагивают лишь несколько столбцов.
Базовые операции¶
Создание таблицы с гибридным строково‑колоночным хранением¶
Включите параметр конфигурации FE
enable_experimental_rowstore.ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");Укажите
"STORE_TYPE" = "column_with_row"в секцииPROPERTIESпри создании таблицы.Таблица должна быть типа
Primary Key.Длина столбца
__rowне может превышать 1 MB.Начиная с версии v3.2.4, поддерживаются следующие типы столбцов:
BITMAP,HLL,JSON,ARRAY,MAPиSTRUCT.CREATE TABLE users ( id bigint not null, country string, city string, revenue bigint ) PRIMARY KEY (id) DISTRIBUTED by HASH (id) PROPERTIES ("store_type" = "column_with_row");
Вставка, удаление и обновление данных¶
Аналогично таблице с колоночным хранением, в таблицу с гибридным хранением вы можете загружать данные и выполнять DML‑операции INSERT, DELETE и UPDATE. Ниже показаны примеры DML для созданной выше таблицы.
Вставка строк.
INSERT INTO users (id, country, city, revenue) VALUES (1, 'USA', 'New York', 5000), (2, 'UK', 'London', 4500), (3, 'France', 'Paris', 6000), (4, 'Germany', 'Berlin', 4000), (5, 'Japan', 'Tokyo', 7000), (6, 'Australia', 'Sydney', 7500);Удаление строки.
DELETE FROM users WHERE id = 6;Обновление строки.
UPDATE users SET revenue = 6500 WHERE id = 4;
Запрос данных¶
В качестве примера рассмотрим точечный запрос. Точечные запросы используют короткий обход (short circuit), напрямую читая данные из строкового хранения, что ускоряет выполнение запроса.
В примерах ниже используется созданная выше таблица с гибридным хранением. После операций создания и модификации таблица содержит следующие данные:
MySQL [example_db]> SELECT * FROM users ORDER BY id;
+------+---------+----------+---------+
| id | country | city | revenue |
+------+---------+----------+---------+
| 1 | USA | New York | 5000 |
| 2 | UK | London | 4500 |
| 3 | France | Paris | 6000 |
| 4 | Germany | Berlin | 6500 |
| 5 | Japan | Tokyo | 7000 |
+------+---------+----------+---------+
5 rows in set (0.03 sec)
Убедитесь, что в системе включён короткий обход для запросов. После включения запросы, удовлетворяющие определённым критериям (оценка «точечности» запроса), выполняются с коротким обходом и сканируют строковое хранение.
SHOW VARIABLES LIKE '%enable_short_circuit%';Если короткий обход отключён, выполните команду
SET enable_short_circuit = true;, чтобы установить системную переменнуюenable_short_circuitвtrue.Выполните запрос. Если все столбцы первичного ключа присутствуют в условии
WHERE, а используемые операторы —=илиIN, запрос пойдёт по короткому пути.В предложении WHERE могут присутствовать дополнительные столбцы помимо всех столбцов первичного ключа.
SELECT * FROM users WHERE id=1;Проверьте план выполнения, чтобы убедиться, что используется короткий обход. Если план содержит
Short Circuit Scan: true, запрос выполнится по короткому пути.MySQL [example_db]> EXPLAIN SELECT * FROM users WHERE id=1; +---------------------------------------------------------+ | Explain String | +---------------------------------------------------------+ | PLAN FRAGMENT 0 | | OUTPUT EXPRS:1: id | 2: country | 3: city | 4: revenue | | PARTITION: RANDOM | | | | RESULT SINK | | | | 0:OlapScanNode | | TABLE: users | | PREAGGREGATION: OFF. Reason: null | | PREDICATES: 1: id = 1 | | partitions=1/1 | | rollup: users | | tabletRatio=1/6 | | tabletList=10184 | | cardinality=-1 | | avgRowSize=0.0 | | Short Circuit Scan: true | -- The query can use the shortcut. +---------------------------------------------------------+ 17 rows in set (0.00 sec)
Использование prepared statements¶
Вы можете использовать prepared statements для выполнения запросов к таблицам с гибридным строково‑колоночным хранением.
-- Prepare the statements for execution.
PREPARE select_all_stmt FROM 'SELECT * FROM users';
PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';
-- Declare variables in the statements.
SET @id1 = 1, @id2 = 2;
-- Use the declared variables to execute the statements.
-- Query data with ID 1 or 2 separately.
EXECUTE select_by_id_stmt USING @id1;
EXECUTE select_by_id_stmt USING @id2;
Ограничения¶
В настоящий момент кластеры StarRocks в режиме
shared‑dataне поддерживают гибридное строково‑колоночное хранение.Начиная с версии v3.2.4, таблицу с гибридным хранением можно изменять с помощью оператора
ALTER TABLE.Короткий обход уместен только для запросов после плановой пакетной загрузки данных. Из‑за взаимного исключения индексов во время применения записей короткий обход может блокироваться операциями записи, что влияет на время ответа точечных запросов в процессе записи.
Гибридное хранение значительно увеличивает потребление хранилища, так как данные хранятся и в строковом, и в колоночном форматах, а степень сжатия в строковом формате ниже.
Гибридное хранение может увеличить время и потребление ресурсов при загрузке данных.
Таблицы с гибридным хранением подходят для онлайн‑сервисов, но по производительности могут уступать зрелым OLTP‑базам данных.
Таблицы с гибридным хранением не поддерживают функции, зависящие от чисто колоночного хранения, например частичные обновления в колоночном режиме.
Таблицы с гибридным хранением должны быть типа
Primary Key.