Команда SM Lab, развивающая IT-системы для Спортмастера, столкнулась с проблемами производительности при проверке доступности товаров. Система должна проверять каждый товар по 3 типам доступности в 15 геозонах, что требует обработки 4500 ключей в рамках одного запроса.

Эксперименты на Oracle Exadata показали, что одиночные SQL-запросы с большими предикатами «in» не справляются с нагрузкой. Использование «json_table» позволило достичь 2000 запросов в секунду с временем ответа 250–300 мс по 99-му перцентилю, однако часть запросов все равно завершалась по таймауту.

Проблема заключалась в высокой нагрузке на буферный кэш базы данных. Разработчики пришли к выводу, что для оптимизации необходимо дробить крупные SQL-запросы на несколько параллельных «маленьких» запросов и объединять результаты непосредственно в памяти приложения.

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