Я тестирую CrateDB с набором данных из 80 миллионов событий, отправленных из веб-приложения, как в виде нормализованного реляционного решения, так и в виде денормализованного решения с одной базой данных.
Я импортировал все 80 миллионов денормализованных событий в таблицу и выполнил следующий запрос агрегации:
select productName, SUM(elapsed)/60 as total_minutes from denormalized
where country_code = 'NL' AND eventType = 'mediaPlay'
group by productName
order by total_minutes desc
limit 1000;
и запрос занял 0,009 секунды. Wowza! CrateDB горит быстро!
Затем я импортировал документы всей сессии в одну таблицу, называемую «сеансы», и все отдельные документы событий в каждой сессии в другую таблицу, называемую «события», и выполнил следующий запрос:
select e.productName, SUM(e.elapsed)/60 as total_minutes from sessions s
join events e ON e.sessionGroup = s.sessionGroup
where s.country_code = 'NL' AND e.eventType = 'mediaPlay'
group by e.productName
order by total_minutes desc
limit 1000;
, что заняло 21 секунду.
У меня вопрос: есть ли способ повысить производительность реляции, возможно, путем создания индексов или изменения запроса каким-либо образом?
Тангенциальная мысль:
Мы использовали Elasticsearch для аналитики, очевидно, для денормализации данных, и это довольно быстро, но CrateDB, кажется, предлагает все, что делает Elasticsearch (быстрые запросы по денормализованным данным, кластеризация, динамическая схема, полнотекстовый поиск), плюс дополнительные преимущества:
- улучшенная поддержка SQL
- возможность развертывания реляционных решений на небольших наборах данных (замечательно стандартизировать на одной БД, без переключения контекста или наращивания для разработчиков, знающих SQL).