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

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

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

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

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