Select/where/group by на 100m-200m таблицах?

Ощущение что я упускаю что то с noSql решениями, коментарии приветствуются


Есть табличка с 100-200 миллионов записей, сортированные по времени на которой хочется быстро выполнять запросы вида
select time, field, sum(field2) 
from t inner join t2 on ...
where field3 = x and field  = y 
and time between time1 and time2
group by time, field 
order by time



сейчас все это живет на одном сервере, на sql server и проблема в том что индексы к этой таблице занимают столько же места сколько данные.


Какие noSql решения хорошо подойдут для такой задачи? я пока успел посмотреть только на CoachDb — на вид не взлетит
  • Вопрос задан
  • 2901 просмотр
Пригласить эксперта
Ответы на вопрос 7
@shagguboy
Я к тому что такие задачи решаются гораздо проще просто доп-таблицей (field, sum_cache) и обновлением на основе триггеров или самостоятельно

матвью это называется.
Ответ написан
@edogs
Ответ не совсем в тему.
Но поскольку запрос у Вас как бы совсем не noSQL-ный, и индексы занимают много места… возможно есть смысл или тупо округлить время до минут (индексы сразу займут раз в 60 меньше места), или ввести доп. поле с временем округленным до минут (таблица подраздуется, но индексы будут меньше).
Ответ написан
Комментировать
@rPman
Меняется ли sum(field2) для каждого field и как часто? Критично ли скорость его записи?
Если быть более точным, изменяется ли поле field2? или только добавляются и удаляются новые записи?

Я к тому что такие задачи решаются гораздо проще просто доп-таблицей (field, sum_cache) и обновлением на основе триггеров или самостоятельно… кстати на сколько я знаю есть БД поддерживающие кеш-индексы на основе выражений (фактически они и создают поле и наполняют его триггерами)
Ответ написан
@shagguboy
покрывающий кластерный индекс вас спасет.
Ответ написан
@shagguboy
ну или если хотите совсем по взрослому сделайте ОЛАП куб и работайте с ним. В MS SQL ОЛАП идет бесплатно к серверу
Ответ написан
kuzemchik
@kuzemchik
Кубы нужны для многомерных срезов, у них есть собственный кеш, который обновляется sql-запросами. Если field-ов по которым вы группируете много разных — то куб будет полезен.
Если нет, то, мне кажется, вам лучше подойдет Partitioning таблицы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы