Перейти к основному содержимому
Версия: 2.0.x

Рецепты настройки схемы

Этот документ предоставляет практические советы и рекомендации по оптимизации производительности запросов в Selena через эффективный дизайн схемы и выбор базовых типов таблиц. Понимая, как различные типы таблиц, ключи и стратегии распределения влияют на выполнение запросов, вы можете значительно улучшить как скорость, так и эффективность использования ресурсов. Используйте эти рекомендации для принятия обоснованных решений при проектировании схем, выборе типов таблиц и настройке вашей среды Selena для высокопроизводительной аналитики.

Выбор типа таблицы

Selena поддерживает четыре типа таблиц: Duplicate Key table, Aggregate table, Unique Key table и Primary Key table. Все они сортируются по KEY.

  • AGGREGATE KEY: Когда записи с одинаковым AGGREGATE KEY загружаются в Selena, старые и новые записи агрегируются. В настоящее время таблицы Aggregate поддерживают следующие функции агрегации: SUM, MIN, MAX и REPLACE. Таблицы Aggregate поддерживают предварительную агрегацию данных, облегчая бизнес-операторы и многомерные анализы.
  • DUPLICATE KEY: Вам нужно указать только ключ сортировки для таблицы DUPLICATE KEY. Записи с одинаковым DUPLICATE KEY существуют одновременно. Это подходит для анализов, не включающих предварительную агрегацию данных.
  • UNIQUE KEY: Когда записи с одинаковым UNIQUE KEY загружаются в Selena, новая запись перезаписывает старую. Таблица UNIQUE KEY похожа на таблицу Aggregate с функцией REPLACE. Обе подходят для анализов с постоянными обновлениями.
  • PRIMARY KEY: Таблицы Primary Key гарантируют уникальность записей и позволяют выполнять обновления в реальном времени.
CREATE TABLE site_visit
(
siteid INT,
city SMALLINT,
username VARCHAR(32),
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, city, username)
DISTRIBUTED BY HASH(siteid);


CREATE TABLE session_data
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid);

CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
UNIQUE KEY(orderid)
DISTRIBUTED BY HASH(orderid);

CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
PRIMARY KEY(orderid)
DISTRIBUTED BY HASH(orderid);

Colocate Table

Для ускорения запросов таблицы с одинаковым распределением могут использовать общий столбец для bucketing. В этом случае данные могут быть соединены локально без передачи по cluster во время операции join.

CREATE TABLE colocate_table
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid)
PROPERTIES(
"colocate_with" = "group1"
);

Для получения дополнительной информации о colocate join и управлении replica см. Colocate join

Плоские таблицы и схема звезды

Selena поддерживает схему звезды, которая более гибка в моделировании, чем плоские таблицы. Вы можете создать представление для замены плоских таблиц во время моделирования, а затем запрашивать данные из нескольких таблиц для ускорения запросов.

Плоские таблицы имеют следующие недостатки:

  • Дорогие обновления измерений, потому что плоская таблица обычно содержит огромное количество измерений. Каждый раз, когда измерение обновляется, вся таблица должна быть обновлена. Ситуация усугубляется с увеличением частоты обновлений.
  • Высокая стоимость обслуживания, потому что плоские таблицы требуют дополнительных рабочих нагрузок разработки, пространства хранения и операций backfilling данных.
  • Высокая стоимость загрузки данных, потому что плоская таблица имеет много полей, а таблица Aggregate может содержать еще больше ключевых полей. Во время загрузки данных необходимо отсортировать больше полей, что продлевает загрузку данных.

Если у вас высокие требования к конкурентности запросов или низкой задержке, вы все еще можете использовать плоские таблицы.

Partition и bucket

Selena поддерживает два уровня партиционирования: первый уровень — RANGE partition, а второй уровень — HASH bucket.

  • RANGE partition: RANGE partition используется для разделения данных на различные интервалы (можно понимать как разделение исходной таблицы на несколько подтаблиц). Большинство пользователей выбирают установку партиций по времени, что имеет следующие преимущества:

    • Легче различать горячие и холодные данные
    • Возможность использовать многоуровневое хранилище Selena (SSD + SATA)
    • Быстрее удалять данные по partition
  • HASH bucket: Разделяет данные на разные bucket в соответствии с хеш-значением.

    • Рекомендуется использовать столбец с высокой степенью различения для bucketing, чтобы избежать перекоса данных.
    • Для облегчения восстановления данных рекомендуется поддерживать размер сжатых данных в каждом bucket между 100 MB и 1 GB. Мы рекомендуем настроить соответствующее количество bucket при создании таблицы или добавлении partition.
    • Случайный bucketing не рекомендуется. Вы должны явно указать столбец HASH bucketing при создании таблицы.

Разреженный индекс и bloomfilter index

Selena хранит данные упорядоченным образом и строит разреженные индексы с детализацией в 1024 строки.

Selena выбирает префикс фиксированной длины (в настоящее время 36 байтов) в схеме в качестве разреженного индекса.

При создании таблицы рекомендуется размещать общие поля фильтрации в начале объявления схемы. Поля с наибольшей дифференциацией и частотой запросов должны быть размещены первыми.

Поле VARCHAR должно быть размещено в конце разреженного индекса, потому что индекс обрезается с поля VARCHAR. Если поле VARCHAR появляется первым, индекс может быть меньше 36 байтов.

Используйте приведенную выше таблицу site_visit в качестве примера. Таблица имеет четыре столбца: siteid, city, username, pv. Ключ сортировки содержит три столбца siteid, city, username, которые занимают 4, 2 и 32 байта соответственно. Таким образом, префиксный индекс (разреженный индекс) может быть первыми 30 байтами siteid + city + username.

Помимо разреженных индексов Selena также предоставляет bloomfilter-индексы, которые эффективны для фильтрации столбцов с высокой дифференциацией. Если вы хотите разместить поля VARCHAR перед другими полями, вы можете создать bloomfilter-индексы.

Инвертированный индекс

Selena использует технологию Bitmap Indexing для поддержки инвертированных индексов, которые могут применяться ко всем столбцам таблицы Duplicate Key и ключевому столбцу таблицы Aggregate и таблицы Unique Key. Bitmap Index подходит для столбцов с небольшим диапазоном значений, таких как пол, город и провинция. По мере расширения диапазона bitmap-индекс расширяется параллельно.

Материализованное представление (rollup)

Rollup по сути является материализованным индексом исходной таблицы (базовой таблицы). При создании rollup можно выбрать только некоторые столбцы базовой таблицы в качестве схемы, и порядок полей в схеме может отличаться от порядка в базовой таблице. Ниже приведены некоторые случаи использования rollup:

  • Агрегация данных в базовой таблице невысока, потому что базовая таблица имеет поля с высокой дифференциацией. В этом случае вы можете рассмотреть выбор некоторых столбцов для создания rollup. Используйте приведенную выше таблицу site_visit в качестве примера:

    site_visit(siteid, city, username, pv)

    siteid может привести к плохой агрегации данных. Если вам нужно часто вычислять PV по городам, вы можете создать rollup только с city и pv.

    ALTER TABLE site_visit ADD ROLLUP rollup_city(city, pv);
  • Префиксный индекс в базовой таблице не может быть использован, потому что способ построения базовой таблицы не может охватить все паттерны запросов. В этом случае вы можете рассмотреть создание rollup для настройки порядка столбцов. Используйте приведенную выше таблицу session_data в качестве примера:

    session_data(visitorid, sessionid, visittime, city, province, ip, browser, url)

    Если есть случаи, когда вам нужно анализировать посещения по browser и province в дополнение к visitorid, вы можете создать отдельный rollup:

    ALTER TABLE session_data
    ADD ROLLUP rollup_browser(browser,province,ip,url)
    DUPLICATE KEY(browser,province);

Изменение схемы

Существует три способа изменения схем в Selena: сортированное изменение схемы, прямое изменение схемы и связанное изменение схемы.

  • Сортированное изменение схемы: Изменение сортировки столбца и переупорядочивание данных. Например, удаление столбца в сортированной схеме приводит к переупорядочиванию данных.

    ALTER TABLE site_visit DROP COLUMN city;

  • Прямое изменение схемы: Преобразование данных вместо их переупорядочивания, например, изменение типа столбца или добавление столбца в разреженный индекс.

    ALTER TABLE site_visit MODIFY COLUMN username varchar(64);

  • Связанное изменение схемы: Завершение изменений без преобразования данных, например, добавление столбцов.

    ALTER TABLE site_visit ADD COLUMN click bigint SUM default '0';

    Рекомендуется выбрать подходящую схему при создании таблиц для ускорения изменений схемы.