Что такое битмап индекс и когда его используют
Что проверяют
Понимаете ли вы, что индекс выбирают под кардинальность колонки и характер нагрузки, а не по привычке. Для инженера данных это ещё и проверка, отличаете ли вы аналитическое хранилище от транзакционного.
Как отвечать
Битмап-индекс хранит для каждого различного значения колонки битовую строку длиной в число строк таблицы: единица там, где строка содержит это значение. Условие по колонке превращается в готовую маску, а комбинация условий в побитовые AND и OR над масками, что процессор делает очень быстро и что отлично сжимается.
Отсюда область применения: аналитика на больших таблицах, фильтры сразу по нескольким колонкам, редкая точечная запись. Классика это витрины и OLAP, куда данные грузят пачками, а запросы читают миллионы строк.
Где встречается: Oracle даёт отдельный тип BITMAP INDEX, колоночные аналитические СУБД используют битовые карты и словарное кодирование внутри себя, а PostgreSQL собственного битмап-индекса не имеет, но планировщик строит битовую карту в памяти при bitmap scan и так объединяет несколько обычных индексов.
Главное ограничение назовите сами. Точечная запись правит целый сегмент карты, поэтому параллельные транзакции по разным строкам начинают ждать друг друга. Для оперативной нагрузки это приговор.
Где спотыкаются
Путают тип индекса и bitmap scan в PostgreSQL, а потом уверенно советуют создать битмап-индекс там, где такого синтаксиса нет. Заодно смешивают его с BRIN, у которого совсем другая идея.
Повторяют правило про «только пол и флаг активности», не понимая, откуда оно. Важна не абсолютная кардинальность, а её отношение к числу строк, и сжатые представления вроде roaring переносят порог заметно выше.
Молчат про конкуренцию на запись. Это первая причина, по которой битмап не ставят на оперативные таблицы, и её отсутствие в ответе выдаёт знание по верхам.