450× Faster Joins with Index Condition Pushdown
Проблема
При промахе кэша Readyset выполняет запрос с нуля. Для «расколотых» соединений (предикаты есть и в WHERE
, и в ON
) старый hash-join читал обе таблицы полностью:
- фильтр по
email
возвращал 1 строкуusers
; - фильтр по
status='SHIPPED'
— 99 % таблицыorders
.
Материализовав миллионы лишних строк, система строила хэш-таблицу и лишь потом отбрасывала ненужное. Профилирование показало: 30 % времени уходило на распаковку RocksDB, затем на 10 K IOPS и 81 % загрузки NVMe.
Решение: Index Condition Pushdown
Новый план использует индексы и «проталкивает» условия вниз:
- Сначала выбираем 1 строку
users
по индексуemail
. - Для каждой найденной
u.id
делаем индексный lookup вorders
с условиемuser_id = u.id AND status='SHIPPED'
.
Так читаются только нужные строкиorders
, объём I/O падает на порядки, а хэш-таблица больше не строится.
Результат
ICP устраняет лишнее чтение и распаковку, превращая холодный straddled-join из многомиллисекундной операции в субмиллисекундную.