​​Есть ли смысл в индексе, если выгребаем треть таблицы?



После вебинара мне и организаторам писали, что я не прав: индекс по валюте используется даже если в запросе выгребается треть таблицы при равномерном распределении трёх валют по таблице счетов. Причем аргументировали: заполнили таблицу равномерно, сняли планы запросов, приложили скрины.



Очень круто, что вскопали так глубоко! Напомню, вопрос был: имеет ли смысл индекс по currency? Прежде, чем я признаюсь, что меня раскусили, предлагаю посмотреть план запроса. Вникать в план — как раз то, что двигает мидла в сеньора :)



Давайте посмотрим, что мы могли бы увидеть в плане.



1️⃣ Index Only Scan — Cамый производительный вариант. Это когда все нужные для запроса данные находятся в индексе (индекс по нескольким колонкам) или покрыты индексом (covering index).



2️⃣ Index Scan — Классический вариант. Поиск по индексу + доступ к таблице. Тут останавливаться не будем.



3️⃣ Sequence scan. Ну тут всё понятно, перебираем данные в таблице



4️⃣ Bitmap Index Scan + Bitmap Heap Scan. Как раз наш третий вариант. Он возможен благодаря тому что данные хранятся в куче (heap).

Если в двух словах, то это значит, что по индексу БД составит битовую карту блоков, отметит блоки содержащие нужные данные и затем просканирует эти блоки в таблице. В некоторых случаях это более эффективно, чем sequence scan. А еще это позволяет использовать несколько индексов при поиске. Короче, механика крутая.



Казалось бы, обмазаться индексами и будет Bitmap Scan с использованием всех возможных индексов на таблице) Но напомню про оверхед на обслуживание индекса, и то что Bitmap scan всё еще "чуть лучше" чем Sequence scan. Посмотрите на cost: для sequence scan он 0..56, а для bitmap heap scan 14..51.



Вот вам еще один аспект в трейд-оффе для принятия решения об использовании индекса. Решать, как всегда, вам :)



Вот статья из цикла про EXPLAIN: https://habr.com/ru/post/276973/ В ней более детально описана механика Bitmap Heap Scan с примерами.