Как стать автором
Обновить

SQL HowTo: один индекс на два диапазона

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров3.8K
Всего голосов 21: ↑21 и ↓0+21
Комментарии7

Комментарии 7

А зачем вы использовали индекс по паре знаний, а не два индекса, если у вас значения не связанные?

Странное говорите... У вас-то он выиграл относительно составного индекса, хоть и немного. И по моему опыту он всегда выигрывает, что очевидно. Сравнивать только время поиска, то выиграл он очень хорошо.

И по количеству прочитанных страниц он вас тоже впереди составного индекса (в полтора раза, однако!), причем, по мере роста объема базы отрыв будет нарастать. А уж если увеличить количество условий и/или индексов, то там и в разы разница будет. Нельзя так индексы использовать, это по количеству страниц при поиске видео.

И более того, по количеству страниц он на уровне примера с gist!

И теперь возникли вопросы к gist и чистоте эксперимента - количество страниц одинаковое, а время исполнения запросов отличается на порядок. Тут что-то не так. Тут совершенно точно дело не во времени поиска. Кэширование, разное хранение данных, что-то ещё разное.

Относительно составного по времени он тут выиграл 5.03 против 5.30, и 410 против 461 по страницам - то есть "копейку". Но выиграл ровно потому, что "двихдиапазонный" поиск по btree заведомо неэффективен.

А вот gist как раз выигрывает за счет более оптимизированного хранения самого дерева индекса - из heap страницы-то читались все разы одни и те же 338 за примерно 0.28-0.30мс.

Я про первый вариант gist. Количество страниц индекса совпадает с их количеством в случае двух индексов, но время чтения этих страниц в 15 раз меньше. Вот это странно. Что-то тут с временами не так, а если ориентироваться только на количество страниц, то картина получается немного иной, хотя sp-gist всё равно окажется впереди. Но зато обычный gist сравняется с правильными индексами, что логично, так как чудес не бывает и никаких супер-волшебных алгоритмов там под капотом нет.

Кроме того, у вас эксперимент все равно не чистый. Тогда нужно было и с обычными (двумя!) индексами date в целое/плавающее преобразовать!

Самая страшная тайна заключается в том, что внутри себя gist использует ровно те же b-trees ровно таким же образом! По индексу на каждое изменение - всё так, как и должно быть в нормальной базе. Там нет никакой магии. И при поиске не должно быть большой разницы с обычными индексами плавающих или целых чисел. А вы почему-то исходите из того, что у gist под капотом какая-то волшебная магия.

Какая уж тут магия? Все вполне объяснимо: gist достаточно быстро "схлапывается" до нужного прямоугольника, где находятся только искомые точки, а вот btree, фактически, для каждого подходящего значения dt делает вложенный поиск интервала по sum, что явно не быстро, поскольку линейно растет с количеством уникальных подходящих значений dt в интервале.

То есть нашли мы, например, значение dt = '2023-12-15', полезли искать внутри по sum - там ничего подходящего, а время уже потрачено.

Ради интереса полез в gist. Да, там должен быть заметный прирост скорости, так как поиск осуществляется сразу по двум индексам, а деревья сбалансированы.
Тем не менее результаты странные, так как при равном количестве страниц индекса скорость поиска отличается на порядок.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий