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

Bloom filter индексы

В этом разделе описывается создание и изменение bloom filter индексов, а также принципы их работы.

Bloom filter индекс - это пространственно-эффективная структура данных, которая используется для определения возможного наличия фильтруемых данных в файлах данных таблицы. Если bloom filter индекс определяет, что данные для фильтрации отсутствуют в определённом файле данных, Selena пропускает сканирование этого файла. Bloom filter индексы могут сократить время отклика, когда колонка (например, ID) имеет относительно высокую кардинальность.

Если запрос обращается к колонке sort key, Selena эффективно возвращает результат запроса, используя prefix индекс. Однако запись prefix индекса для блока данных не может превышать 36 байт в длину. Если вы хотите улучшить производительность запросов по колонке, которая не используется как sort key и имеет относительно высокую кардинальность, вы можете создать bloom filter индекс для этой колонки.

Как это работает

Например, вы создаёте bloom filter индекс на колонке column1 таблицы table1 и выполняете запрос типа Select xxx from table1 where column1 = something;. Тогда происходит следующее, когда Selena сканирует файлы данных table1.

  • Если bloom filter индекс определяет, что файл данных не содержит данные для фильтрации, Selena пропускает файл данных для повышения производительности запроса.
  • Если bloom filter индекс определяет, что файл данных может содержать данные для фильтрации, Selena читает файл данных, чтобы проверить, существуют ли данные. Обратите внимание, что bloom filter может точно сказать, что значение отсутствует, но не может с уверенностью сказать, что значение присутствует - только что оно может присутствовать. Использование bloom filter индекса для определения наличия значения может давать ложноположительные срабатывания, что означает, что bloom filter индекс определяет, что файл данных содержит данные для фильтрации, но на самом деле файл данных их не содержит.

Примечания по использованию

  • Вы можете создавать bloom filter индексы для всех колонок таблицы Duplicate Key или Primary Key. Для таблиц Aggregate или Unique Key вы можете создавать bloom filter индексы только для key колонок.
  • Bloom filter индексы могут быть созданы для колонок следующих типов данных:
    • Числовые типы: SMALLINT, INT, BIGINT и LARGEINT.
    • Строковые типы: CHAR, STRING и VARCHAR.
    • Типы дат: DATE и DATETIME.
  • Bloom filter индексы могут улучшить производительность только тех запросов, которые содержат операторы in и =, например Select xxx from table where x in {} и Select xxx from table where column = xxx.
  • Вы можете проверить, использует ли запрос bloom filter индексы, просмотрев поле BloomFilterFilterRows в профиле запроса.

Создание bloom filter индексов

Вы можете создать bloom filter индекс для колонки при создании таблицы, указав параметр bloom_filter_columns в PROPERTIES. Например, создание bloom filter индексов для колонок k1 и k2 в table1.

CREATE TABLE table1
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2)
PROPERTIES("bloom_filter_columns" = "k1,k2");

Вы можете создать bloom filter индексы для нескольких колонок одновременно, указав имена этих колонок. Обратите внимание, что имена колонок необходимо разделять запятыми (,). Описание других параметров оператора CREATE TABLE см. в CREATE TABLE.

Отображение bloom filter индексов

Например, следующий оператор отображает bloom filter индексы для table1. Описание выходных данных см. в SHOW CREATE TABLE.

SHOW CREATE TABLE table1;

Изменение bloom filter индексов

Вы можете добавлять, уменьшать и удалять bloom filter индексы с помощью оператора ALTER TABLE.

  • Следующий оператор добавляет bloom filter индекс на колонку v1.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
  • Следующий оператор удаляет bloom filter индекс с колонки k2.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
  • Следующий оператор удаляет все bloom filter индексы для table1.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "");

Примечание: Изменение индекса является асинхронной операцией. Вы можете просмотреть прогресс этой операции, выполнив SHOW ALTER TABLE. Одновременно можно выполнять только одну задачу изменения индекса для таблицы.