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

Bitmap индексы

В этой теме описывается, как создавать и управлять bitmap индексом, а также варианты использования.

Введение

Bitmap индекс - это специальный индекс базы данных, который использует bitmap, который представляет собой массив битов. Бит всегда находится в одном из двух значений: 0 и 1. Каждый бит в bitmap соответствует одной строке в таблице. Значение каждого бита зависит от значения соответствующей строки.

Bitmap индекс может помочь улучшить производительность запросов по заданному столбцу. Если условия фильтра запроса соответствуют prefix индексу, это может значительно улучшить эффективность запроса и быстро вернуть результаты. Однако таблица может иметь только один prefix индекс. Если условия фильтра запроса не включают prefix prefix индекса, bitmap индекс может быть создан для этого столбца для улучшения эффективности запроса.

Как разработать bitmap индекс для ускорения запросов

Основные соображения при выборе bitmap индекса - это cardinality столбца и эффект фильтрации bitmap индекса на запросы. Вопреки распространенному мнению, bitmap индексы в Selena больше подходят для запросов к столбцам с высокой cardinality и запросов к комбинации нескольких столбцов с низкой cardinality. Кроме того, bitmap индексы должны эффективно фильтровать данные, потенциально отфильтровывая по крайней мере 999/1000 данных, тем самым уменьшая объем данных Page, которые необходимо прочитать.

Для запросов к одному столбцу с низкой cardinality эффект фильтрации bitmap индекса плохой, поскольку необходимо прочитать слишком много строк, разбросанных по нескольким Pages.

к сведению

Вам нужно учитывать стоимость загрузки данных при оценке эффекта фильтрации bitmap индексов на запросы. В Selena базовые данные организованы и загружаются по Pages (размер по умолчанию 64K). Стоимость загрузки данных включает время загрузки Pages с диска, распаковки Pages и декодирования.

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

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

Чтобы определить подходящую cardinality и условия запроса для bitmap индексов, рекомендуется обратиться к Тесту производительности bitmap индекса в этой теме для проведения тестов производительности. Вы можете использовать фактические бизнес-данные и запросы для создания bitmap индексов на столбцах с различной cardinality, чтобы проанализировать эффект фильтрации bitmap индексов на запросы (по крайней мере, отфильтровывая 999/1000 данных), использование дискового пространства, влияние на производительность загрузки и накладные расходы на загрузку bitmap индексов во время запросов.

Selena имеет встроенный механизм адаптивного выбора bitmap индексов. Если bitmap индекс не может ускорить запросы, например, если он не может отфильтровать много Pages, или накладные расходы на загрузку bitmap индексов во время запросов высоки, он не будет использоваться во время запроса, поэтому производительность запроса не будет существенно затронута.

Адаптивный выбор bitmap индексов

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

Selena определяет, использовать ли bitmap индекс, на основе отношения количества значений, участвующих в условии запроса, к cardinality столбца. Как правило, чем меньше это отношение, тем лучше эффект фильтрации bitmap индекса. Таким образом, Selena использует bitmap_max_filter_ratio/1000 в качестве порога. Когда количество значений в условии фильтра/cardinality столбца меньше bitmap_max_filter_ratio/1000, bitmap индекс будет использоваться. Значение по умолчанию для bitmap_max_filter_ratio равно 1.

Возьмем в качестве примера запрос на основе одного столбца, такой как SELECT * FROM employees WHERE gender = 'male';. Столбец gender в таблице employees имеет значения 'male' и 'female', поэтому cardinality равна 2 (два различных значения). Условие запроса включает одно значение, поэтому отношение составляет 1/2, что больше 1/1000. Следовательно, этот запрос не будет использовать bitmap индекс.

Возьмем другой запрос на основе комбинации нескольких столбцов в качестве примера, такой как SELECT * FROM employees WHERE gender = 'male' AND city IN ('Beijing', 'Shanghai');. Cardinality столбца city составляет 10 000, и условие запроса включает два значения, поэтому отношение рассчитывается как (1*2)/(2*10000), что меньше 1/1000. Следовательно, этот запрос будет использовать bitmap индекс.

к сведению

Диапазон значений для bitmap_max_filter_ratio составляет 1-1000. Если bitmap_max_filter_ratio установлено в 1000, любой запрос к столбцу с bitmap индексом будет принудительно использовать bitmap индекс.

Преимущества

  • Bitmap индексы могут быстро определить номера строк запрошенных значений столбцов, подходят для точечных запросов или запросов с небольшим диапазоном.
  • Bitmap индексы могут оптимизировать многомерные запросы, включающие операции объединения и пересечения (операции OR и AND).

Рекомендации

Запросы, которые могут быть оптимизированы

Bitmap индексы подходят для оптимизации запросов на равенство =, запросов диапазона [NOT] IN, запросов >, >=, <, <= и запросов IS NULL. Они не подходят для оптимизации запросов != и [NOT] LIKE.

Поддерживаемые столбцы и типы данных

Bitmap индексы могут быть созданы на всех столбцах в primary key и duplicate key таблицах, и на ключевых столбцах в aggregate и unique key таблицах. Bitmap индексы могут быть созданы на столбцах следующих типов данных:

  • Типы дат: DATE, DATETIME.
  • Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DECIMAL, BOOLEAN.
  • Строковые типы: CHAR, STRING, VARCHAR.
  • Другие типы: HLL.

Базовые операции

Создание индекса

  • Создание bitmap индекса во время создания таблицы.

    CREATE TABLE `lineorder_partial` (
    `lo_orderkey` int(11) NOT NULL COMMENT "",
    `lo_orderdate` int(11) NOT NULL COMMENT "",
    `lo_orderpriority` varchar(16) NOT NULL COMMENT "",
    `lo_quantity` int(11) NOT NULL COMMENT "",
    `lo_revenue` int(11) NOT NULL COMMENT "",
    INDEX lo_orderdate_index (lo_orderdate) USING BITMAP
    ) ENGINE=OLAP
    DUPLICATE KEY(`lo_orderkey`)
    DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 1;

    В этом примере bitmap индекс с именем lo_orderdate_index создается на столбце lo_orderdate. Требования к именованию bitmap индексов можно найти в Системные ограничения. Идентичные bitmap индексы не могут быть созданы в одной таблице.

    Несколько bitmap индексов могут быть созданы для нескольких столбцов, разделенных запятыми (,).

    примечание

    Для дополнительных параметров создания таблицы обратитесь к CREATE TABLE.

  • CREATE INDEX может использоваться для создания bitmap индекса после создания таблицы. Для подробных описаний параметров и примеров обратитесь к CREATE INDEX.

    CREATE INDEX lo_quantity_index ON lineorder_partial (lo_quantity) USING BITMAP;

Прогресс создания индекса

Создание bitmap индекса - это асинхронный процесс. После выполнения оператора создания индекса вы можете проверить прогресс создания индекса с помощью команды SHOW ALTER TABLE. Когда поле State в возвращаемом значении показывает FINISHED, индекс успешно создан.

SHOW ALTER TABLE COLUMN;
к сведению

Каждая таблица может иметь только одну выполняющуюся задачу Schema Change одновременно. Вы не можете создать новый bitmap индекс, пока текущий bitmap индекс не будет создан.

Просмотр индекса

Просмотр всех bitmap индексов для указанной таблицы. Для подробных параметров и возвращаемых результатов обратитесь к SHOW INDEX.

SHOW INDEXES FROM lineorder_partial;
примечание

Создание bitmap индекса - это асинхронный процесс. Используя приведенный выше оператор, вы можете просматривать только индексы, которые успешно завершили создание.

Удаление индекса

Удаление bitmap индекса для указанной таблицы. Для подробных параметров и примеров обратитесь к DROP INDEX.

DROP INDEX lo_orderdate_index ON lineorder_partial;

Проверка того, ускоряет ли bitmap индекс запросы

Проверьте поле BitmapIndexFilterRows в Profile запроса. Для информации о просмотре Profile обратитесь к Анализ запросов.

Тест производительности bitmap индекса

Цель тестирования

Анализ эффекта фильтрации и других влияний, таких как использование диска, bitmap индексов на запросы с различной cardinality:

Этот раздел также сравнивает производительность между всегда использующим bitmap индекс и адаптивным использованием bitmap индексов для проверки эффективности адаптивного выбора bitmap индексов Selena.

Создание таблицы и bitmap индекса

warning

Чтобы избежать кэширования данных Page, влияющего на производительность запроса, убедитесь, что конфигурационный параметр BE disable_storage установлен в true.

В этом разделе в качестве примера используется таблица lineorder (SSB 20G).

  • Исходная таблица (без bitmap индексов) в качестве эталона

    CREATE TABLE `lineorder_without_index` (
    `lo_orderkey` int(11) NOT NULL COMMENT "",
    `lo_linenumber` int(11) NOT NULL COMMENT "",
    `lo_custkey` int(11) NOT NULL COMMENT "",
    `lo_partkey` int(11) NOT NULL COMMENT "",
    `lo_suppkey` int(11) NOT NULL COMMENT "",
    `lo_orderdate` int(11) NOT NULL COMMENT "",
    `lo_orderpriority` varchar(16) NOT NULL COMMENT "",
    `lo_shippriority` int(11) NOT NULL COMMENT "",
    `lo_quantity` int(11) NOT NULL COMMENT "",
    `lo_extendedprice` int(11) NOT NULL COMMENT "",
    `lo_ordtotalprice` int(11) NOT NULL COMMENT "",
    `lo_discount` int(11) NOT NULL COMMENT "",
    `lo_revenue` int(11) NOT NULL COMMENT "",
    `lo_supplycost` int(11) NOT NULL COMMENT "",
    `lo_tax` int(11) NOT NULL COMMENT "",
    `lo_commitdate` int(11) NOT NULL COMMENT "",
    `lo_shipmode` varchar(11) NOT NULL COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`lo_orderkey`)
    DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 1;
  • Таблица с bitmap индексами: Bitmap индексы созданы на основе lo_shipmode, lo_quantity, lo_discount, lo_orderdate, lo_tax и lo_partkey.

    CREATE TABLE `lineorder_with_index` (
    `lo_orderkey` int(11) NOT NULL COMMENT "",
    `lo_linenumber` int(11) NOT NULL COMMENT "",
    `lo_custkey` int(11) NOT NULL COMMENT "",
    `lo_partkey` int(11) NOT NULL COMMENT "",
    `lo_suppkey` int(11) NOT NULL COMMENT "",
    `lo_orderdate` int(11) NOT NULL COMMENT "",
    `lo_orderpriority` varchar(16) NOT NULL COMMENT "",
    `lo_shippriority` int(11) NOT NULL COMMENT "",
    `lo_quantity` int(11) NOT NULL COMMENT "",
    `lo_extendedprice` int(11) NOT NULL COMMENT "",
    `lo_ordtotalprice` int(11) NOT NULL COMMENT "",
    `lo_discount` int(11) NOT NULL COMMENT "",
    `lo_revenue` int(11) NOT NULL COMMENT "",
    `lo_supplycost` int(11) NOT NULL COMMENT "",
    `lo_tax` int(11) NOT NULL COMMENT "",
    `lo_commitdate` int(11) NOT NULL COMMENT "",
    `lo_shipmode` varchar(11) NOT NULL COMMENT "",
    INDEX i_shipmode (`lo_shipmode`) USING BITMAP,
    INDEX i_quantity (`lo_quantity`) USING BITMAP,
    INDEX i_discount (`lo_discount`) USING BITMAP,
    INDEX i_orderdate (`lo_orderdate`) USING BITMAP,
    INDEX i_tax (`lo_tax`) USING BITMAP,
    INDEX i_partkey (`lo_partkey`) USING BITMAP
    ) ENGINE=OLAP
    DUPLICATE KEY(`lo_orderkey`)
    DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 1;

Использование дискового пространства bitmap индексами

  • lo_shipmode: Строковый тип, cardinality 7, занимает 130M
  • lo_quantity: Целочисленный тип, cardinality 50, занимает 291M
  • lo_discount: Целочисленный тип, cardinality 11, занимает 198M
  • lo_orderdate: Целочисленный тип, cardinality 2406, занимает 191M
  • lo_tax: Целочисленный тип, cardinality 9, занимает 160M
  • lo_partkey: Целочисленный тип, cardinality 600 000, занимает 601M

Запрос 1: Запрос к одному столбцу с низкой cardinality

Запрос к таблице без bitmap индекса

Запрос:

SELECT count(1) FROM lineorder_without_index WHERE lo_shipmode="MAIL";

Анализ производительности запроса: Поскольку запрашиваемая таблица не имеет bitmap индекса, все pages, содержащие данные столбца lo_shipmode, должны быть прочитаны, а затем применяется фильтрация предикатов.

Общее время: Приблизительно 0,91 секунды, из которых загрузка данных заняла 0,47 секунды, декодирование словаря для оптимизации низкой cardinality заняло 0,31 секунды, а фильтрация предикатов заняла 0,23 секунды.

PullRowNum: 20.566M (20566493) // Количество строк в результирующем наборе.
CompressedBytesRead: 55.283 MB // Общий объем прочитанных данных.
RawRowsRead: 143.999M (143999468) // Количество прочитанных строк. Поскольку bitmap индекса нет, все данные в этом столбце читаются.
ReadPagesNum: 8.795K (8795) // Количество прочитанных pages. Поскольку bitmap индекса нет, все pages, содержащие данные для этого столбца, читаются.
IOTaskExecTime: 914ms // Общее время сканирования данных.
BlockFetch: 469ms // Время загрузки данных.
DictDecode: 311.612ms // Время декодирования словаря для оптимизации низкой cardinality.
PredFilter: 23.182ms // Время фильтрации предикатов.
PredFilterRows: 123.433M (123432975) // Количество отфильтрованных строк.

Запрос к таблице с bitmap индексом

Принудительное использование bitmap индекса
к сведению

Для принудительного использования bitmap индекса, согласно конфигурации Selena, необходимо установить bitmap_max_filter_ratio=1000 в файле be.conf каждого узла BE, а затем перезапустить узлы BE.

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_shipmode="MAIL";

Анализ производительности запроса: Поскольку запрашиваемый столбец имеет низкую cardinality, bitmap индекс не фильтрует данные эффективно. Хотя bitmap индекс может быстро определить номера строк фактических данных, необходимо прочитать большое количество строк, разбросанных по нескольким pages. В результате он не может эффективно отфильтровать pages, которые необходимо прочитать. Более того, возникают дополнительные накладные расходы на загрузку bitmap индекса и использование bitmap индекса для фильтрации данных, что приводит к более длительному общему времени.

Общее время: 2,077 секунды, из которых 0,93 секунды потрачено на загрузку данных и bitmap индекса, 0,33 секунды на декодирование словаря для оптимизации низкой cardinality, 0,42 секунды на фильтрацию данных с помощью bitmap индекса и 0,17 секунды на фильтрацию данных с помощью ZoneMap Index.

PullRowNum: 20.566M (20566493) // Количество строк в результирующем наборе.
CompressedBytesRead: 72.472 MB // Общий объем прочитанных данных. Размер bitmap индекса для этого столбца составляет 130MB, с 7 уникальными значениями. Размер bitmap индекса для каждого значения составляет 18MB. Размер данных Pages составляет 55MB = 73MB.
RawRowsRead: 20.566M (20566493) // Количество прочитанных строк. Фактически прочитано 20 миллионов строк.
ReadPagesNum: 8.802K (8802) // Количество прочитанных Pages. Все Pages читаются, поскольку 20 миллионов строк, отфильтрованных bitmap индексом, случайно распределены по разным Pages, а Page является наименьшей единицей чтения данных. Следовательно, bitmap индекс не фильтрует Pages.
IOTaskExecTime: 2s77ms // Общее время сканирования данных, больше, чем без bitmap индекса.
BlockFetch: 931.144ms // Время загрузки данных и bitmap индекса. По сравнению с предыдущим запросом дополнительные 400ms были потрачены на загрузку bitmap индекса (18MB).
DictDecode: 329.696ms // Время декодирования словаря для оптимизации низкой cardinality аналогично, поскольку количество выходных строк одинаковое.
BitmapIndexFilter: 419.308ms // Время фильтрации данных с помощью bitmap индекса.
BitmapIndexFilterRows: 123.433M (123432975) // Количество строк, отфильтрованных bitmap индексом.
ZoneMapIndexFiter: 171.580ms // Время фильтрации данных с помощью ZoneMap Index.
Определение использования bitmap индекса на основе конфигурации по умолчанию Selena

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_shipmode="MAIL";

Анализ производительности запроса: Согласно конфигурации по умолчанию Selena, bitmap индекс используется только в том случае, если количество различных значений в столбце условия фильтра / cardinality столбца < bitmap_max_filter_ratio/1000 (по умолчанию 1/1000). В этом случае значение больше 1/1000, поэтому bitmap индекс не используется, что приводит к производительности, аналогичной запросу к таблице без bitmap индекса.

PullRowNum: 20.566M (20566493) // Количество строк в результирующем наборе.
CompressedBytesRead: 55.283 MB // Общий объем прочитанных данных.
RawRowsRead: 143.999M (143999468) // Количество прочитанных строк. Поскольку bitmap индекс не используется, все данные в этом столбце читаются.
ReadPagesNum: 8.800K (8800) // Количество прочитанных Pages. Поскольку bitmap индекс не используется, все pages, содержащие данные для этого столбца, читаются.
IOTaskExecTime: 914.279ms // Общее время сканирования данных.
BlockFetch: 475.890ms // Время загрузки данных.
DictDecode: 312.019ms // Время декодирования словаря для оптимизации низкой cardinality.
PredFilterRows: 123.433M (123432975) // Количество строк, отфильтрованных предикатом.

Запрос 2: Запрос к комбинации нескольких столбцов с низкой cardinality

Запрос к таблице без bitmap индекса

Запрос:

SELECT count(1)
FROM lineorder_without_index
WHERE lo_shipmode = "MAIL"
AND lo_quantity = 10
AND lo_discount = 9
AND lo_tax = 8;

Анализ производительности запроса: Поскольку запрашиваемая таблица не имеет bitmap индекса, все Pages, содержащие данные столбцов lo_shipmode, lo_quantity, lo_discount и lo_tax, читаются, а затем применяется фильтрация предикатов.

Общее затраченное время: 1,76 секунды, из которых 1,6 секунды потрачено на загрузку данных (4 столбца), и 0,1 секунды на фильтрацию предикатов.

PullRowNum: 4.092K (4092) // Количество строк в результирующем наборе.
CompressedBytesRead: 305.346 MB // Общий объем прочитанных данных. Данные 4 столбцов читаются, всего 305MB.
RawRowsRead: 143.999M (143999468) // Количество прочитанных строк. Поскольку bitmap индекса нет, все данные этих 4 столбцов читаются.
ReadPagesNum: 35.168K (35168) // Количество прочитанных Pages. Поскольку bitmap индекса нет, все Pages, содержащие данные этих 4 столбцов, читаются.
IOTaskExecTime: 1s761ms // Общее время сканирования данных.
BlockFetch: 1s639ms // Время загрузки данных.
PredFilter: 96.533ms // Время фильтрации предикатов с 4 условиями фильтрации.
PredFilterRows: 143.995M (143995376) // Количество строк, отфильтрованных предикатами.

Запрос к таблице с bitmap индексом

Принудительное использование bitmap индекса
к сведению

Для принудительного использования bitmap индекса, согласно конфигурации Selena, необходимо установить bitmap_max_filter_ratio=1000 в файле be.conf каждого узла BE, затем узлы BE должны быть перезапущены.

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_shipmode="MAIL" AND lo_quantity=10 AND lo_discount=9 AND lo_tax=8;

Анализ производительности запроса: Поскольку это комбинированный запрос на основе нескольких столбцов с низкой cardinality, bitmap индекс эффективен, отфильтровывая часть Pages и значительно сокращая время чтения данных.

Общее затраченное время: 0,68 секунды, из которых 0,54 секунды потрачено на загрузку данных и bitmap индекса, и 0,14 секунды на фильтрацию данных с помощью bitmap индекса.

PullRowNum: 4.092K (4092) // Количество строк в результирующем наборе.
CompressedBytesRead: 156.340 MB // Общий объем прочитанных данных. Bitmap индекс эффективно фильтрует 2/3 данных. Из этих 156MB 60MB - это данные индекса, а 90MB - фактические данные.
ReadPagesNum: 11.325K (11325) // Количество прочитанных Pages. Bitmap индекс эффективно фильтрует 2/3 Pages.
IOTaskExecTime: 683.471ms // Общее время сканирования данных, значительно меньше общего времени без bitmap индекса.
BlockFetch: 537.421ms // Время загрузки данных и bitmap индекса. Хотя дополнительное время тратится на загрузку bitmap индекса, это значительно сокращает время загрузки данных.
BitmapIndexFilter: 139.024ms // Время фильтрации данных с помощью bitmap индекса.
BitmapIndexFilterRows: 143.995M (143995376) // Количество строк, отфильтрованных bitmap индексом.
Определение использования bitmap индекса на основе конфигурации по умолчанию Selena

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_shipmode="MAIL" AND lo_quantity=10 AND lo_discount=9 AND lo_tax=8;

Анализ производительности запроса: Согласно конфигурации по умолчанию Selena, bitmap индекс используется, если количество различных значений в столбцах условия фильтра / cardinality столбца < bitmap_max_filter_ratio/1000 (по умолчанию 1/1000). В этом случае значение меньше 1/1000, поэтому bitmap индекс используется, что приводит к производительности, аналогичной принудительному использованию bitmap индекса.

Общее затраченное время: 0,67 секунды, из которых 0,54 секунды потрачено на загрузку данных и bitmap индекса, и 0,13 секунды на фильтрацию данных с помощью bitmap индекса.

PullRowNum: 4.092K (4092) // Количество строк в результирующем наборе.
CompressedBytesRead: 154.430 MB // Общий объем прочитанных данных.
ReadPagesNum: 11.209K (11209) // Количество прочитанных Pages.
IOTaskExecTime: 672.029ms // Общее время сканирования данных, значительно меньше, чем без bitmap индекса.
BlockFetch: 535.823ms // Время загрузки данных и bitmap индекса. Хотя загрузка bitmap индекса занимает немного больше времени, это значительно сокращает время загрузки данных.
BitmapIndexFilter: 128.403ms // Время фильтрации данных с помощью bitmap индекса.
BitmapIndexFilterRows: 143.995M (143995376) // Количество строк, отфильтрованных bitmap индексом.

Запрос 3: Запрос к одному столбцу с высокой cardinality

Запрос к таблице без bitmap индекса

Запрос:

select count(1) from lineorder_without_index where lo_partkey=10000;

Анализ производительности запроса: Поскольку запрашиваемая таблица не имеет bitmap индекса, pages, содержащие данные столбца lo_partkey, читаются, а затем применяется фильтрация предикатов.

Общее время: приблизительно 0,43 секунды, включая 0,39 секунды на загрузку данных и 0,02 секунды на фильтрацию предикатов.

PullRowNum: 255 // Количество строк в результирующем наборе.
CompressedBytesRead: 344.532 MB // Общий объем прочитанных данных.
RawRowsRead: 143.999M (143,999,468) // Количество прочитанных строк. Поскольку bitmap индекса нет, все данные в этом столбце читаются.
ReadPagesNum: 8.791K (8,791) // Количество прочитанных pages. Поскольку bitmap индекса нет, все данные этого столбца читаются.
IOTaskExecTime: 428.258ms // Общее время сканирования данных.
BlockFetch: 392.434ms // Время загрузки данных.
PredFilter: 20.807ms // Время фильтрации предикатов.
PredFilterRows: 143.999M (143,999,213) // Количество строк, отфильтрованных предикатами.

Запрос к таблице с bitmap индексом

Принудительное использование bitmap индекса
к сведению

Для принудительного использования bitmap индекса, согласно конфигурации Selena, вы должны установить bitmap_max_filter_ratio=1000 в файле be.conf на каждом узле BE, а затем перезапустить узлы BE.

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_partkey=10000;

Анализ производительности запроса: Поскольку запрашиваемый столбец имеет высокую cardinality, bitmap индекс эффективен, позволяя отфильтровать часть pages и значительно сокращая время чтения данных.

Общее время: 0,015 секунды, включая 0,009 секунды на загрузку данных и bitmap индекса, и 0,003 секунды на фильтрацию bitmap индекса.

PullRowNum: 255 // Количество строк в результирующем наборе.
CompressedBytesRead: 13.600 MB // Общий объем прочитанных данных. Фильтрация Bitmap Index эффективна, отфильтровывая большой объем данных.
RawRowsRead: 255 // Количество прочитанных строк.
ReadPagesNum: 225 // Количество прочитанных pages. Bitmap индекс может эффективно фильтровать данные, отфильтровывая большое количество pages.
IOTaskExecTime: 15.354ms // Общее время сканирования данных, значительно меньше общего времени без Bitmap Index.
BlockFetch: 9.530ms // Время загрузки данных и Bitmap Index. Хотя дополнительное время тратится на загрузку Bitmap Index, это значительно сокращает время загрузки данных.
BitmapIndexFilter: 3.450ms // Время фильтрации данных с помощью Bitmap Index.
BitmapIndexFilterRows: 143.999M (143,999,213) // Количество строк, отфильтрованных Bitmap Index.
Определение использования bitmap индекса на основе конфигурации по умолчанию Selena

Запрос:

SELECT count(1) FROM lineorder_with_index WHERE lo_partkey=10000;

Анализ производительности запроса: Согласно конфигурации по умолчанию Selena, Bitmap Index используется, когда количество различных значений/cardinality столбца < bitmap_max_filter_ratio/1000 (по умолчанию 1/1000). Поскольку это условие выполнено, запрос использует Bitmap Index, и производительность аналогична той, когда Bitmap Index используется принудительно.

Общее время: 0,014 секунды, включая 0,008 секунды на загрузку данных и bitmap индекса, и 0,003 секунды на фильтрацию Bitmap Index.

PullRowNum: 255 // Количество строк в результирующем наборе.
CompressedBytesRead: 13.600 MB // Общий объем прочитанных данных. Bitmap индекс может эффективно фильтровать данные, отфильтровывая большой объем данных.
RawRowsRead: 255 // Количество прочитанных строк.
ReadPagesNum: 225 // Количество прочитанных pages. Bitmap индекс может эффективно фильтровать данные, отфильтровывая большое количество pages.
IOTaskExecTime: 14.387ms // Общее время сканирования данных, значительно меньше общего времени без Bitmap Index.
BitmapIndexFilter: 2.979ms // Время фильтрации данных с помощью Bitmap Index.
BitmapIndexFilterRows: 143.999M (143,999,213) // Количество строк, отфильтрованных Bitmap Index.
BlockFetch: 8.988ms // Время загрузки данных и Bitmap Index. Хотя дополнительное время тратится на загрузку Bitmap Index, это значительно сокращает время загрузки данных.