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

Bitmap индексы

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

Введение

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

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

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

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

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

к сведению

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

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

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

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

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

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

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

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

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

Возьмем другой запрос на основе комбинации нескольких столбцов, например SELECT * FROM employees WHERE gender = 'male' AND city IN ('Beijing', 'Shanghai');. Кардинальность столбца 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, а также на 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 в Query Profile. Для информации о просмотре Profile обратитесь к Анализу запросов.

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

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

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

Этот раздел также сравнивает производительность между постоянным использованием 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: Строковый тип, кардинальность 7, занимает 130M
  • lo_quantity: Целочисленный тип, кардинальность 50, занимает 291M
  • lo_discount: Целочисленный тип, кардинальность 11, занимает 198M
  • lo_orderdate: Целочисленный тип, кардинальность 2406, занимает 191M
  • lo_tax: Целочисленный тип, кардинальность 9, занимает 160M
  • lo_partkey: Целочисленный тип, кардинальность 600,000, занимает 601M

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

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

Запрос:

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

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

Общее время: Примерно 0.91 секунды, с загрузкой данных, занимающей 0.47 секунды, декодированием словаря для оптимизации низкой кардинальности, занимающим 0.31 секунды, и фильтрацией предикатов, занимающей 0.23 секунды.

PullRowNum: 20.566M (20566493) // Количество строк в результирующем наборе.
CompressedBytesRead: 55.283 MB // Общий объем прочитанных данных.
RawRowsRead: 143.999M (143999468) // Количество прочитанных строк. Поскольку нет bitmap индекса, все данные в этом столбце читаются.
ReadPagesNum: 8.795K (8795) // Количество прочитанных страниц. Поскольку нет bitmap индекса, все страницы, содержащие данные для этого столбца, читаются.
IOTaskExecTime: 914ms // Общее время сканирования данных.
BlockFetch: 469ms // Время загрузки данных.
DictDecode: 311.612ms // Время декодирования словаря для оптимизации низкой кардинальности.
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";

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

Общее время: 2.077 секунды, с 0.93 секундами, потраченными на загрузку данных и bitmap индекса, 0.33 секундами на декодирование словаря для оптимизации низкой кардинальности, 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 // Время декодирования словаря для оптимизации низкой кардинальности аналогично, поскольку количество выходных строк одинаково.
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 индекс используется только если количество различных значений в столбце условия фильтрации / кардинальность столбца < 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 индекс не используется, все страницы, содержащие данные для этого столбца, читаются.
IOTaskExecTime: 914.279ms // Общее время сканирования данных.
BlockFetch: 475.890ms // Время загрузки данных.
DictDecode: 312.019ms // Время декодирования словаря для оптимизации низкой кардинальности.
PredFilterRows: 123.433M (123432975) // Количество строк, отфильтрованных предикатом.

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

Запрос к таблице без 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;

Анализ производительности запроса: Поскольку это комбинированный запрос на основе нескольких столбцов с низкой кардинальностью, 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 индекс используется, если количество различных значений в столбцах условия фильтрации / кардинальность столбца < 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: Запрос к одному столбцу с высокой кардинальностью

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

Запрос:

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

Анализ производительности запроса: Поскольку запрашиваемая таблица не имеет bitmap индекса, страницы, содержащие данные столбца 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) // Количество прочитанных страниц. Поскольку нет 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;

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

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

PullRowNum: 255 // Количество строк в результирующем наборе.
CompressedBytesRead: 13.600 MB // Общий объем прочитанных данных. Фильтрация Bitmap Index эффективна, отфильтровывая большое количество данных.
RawRowsRead: 255 // Количество прочитанных строк.
ReadPagesNum: 225 // Количество прочитанных страниц. Bitmap индекс может эффективно фильтровать данные, отфильтровывая большое количество страниц.
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 используется, когда количество различных значений/кардинальность столбца < 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 // Количество прочитанных страниц. Bitmap индекс может эффективно фильтровать данные, отфильтровывая большое количество страниц.
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, это значительно сокращает время загрузки данных.