Перейти к основному содержимому

Оптимизация производительности

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

Selena поддерживает четыре типа таблиц: таблица Duplicate Key, таблица Aggregate, таблица Unique Key и таблица Primary Key. Все они сортируются по 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

Для ускорения запросов таблицы с одинаковым распределением могут использовать общий столбец для разбиения на корзины. В этом случае данные могут быть объединены локально без передачи по кластеру во время операции 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 и управлении репликами см. Colocate join

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

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

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

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

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

Разделение и корзины

Selena поддерживает два уровня разделения: первый уровень - это разделение RANGE, а второй уровень - корзины HASH.

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

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

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

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

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);

Schema change

Существует три способа изменения схем в 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';

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