Добрый день, коллеги.
Бьюсь над следующей проблемой:
Есть таблица "Intervals", где для множества элементов хранятся значения с указанием диапазона актуальности этих значений по дате. Список полей:
ItemID - идентификатор элемента
ValueTypeID - тип значения
Value - значение
DateStart - дата начала актуальности значения
DateEnd - дата окончания актуальности значения
В таблице около 70млн записей, разных ItemID - несколько миллионов, разных ValueTypeID - несколько десятков.
Интервалы не пересекаются.
Самый частый запрос к таблице - суммирование всех значений определенного типа на определенную дату, вида:
select
...
sum(Value)
from
Intervals i
left join Dates d -- календарь
on i.DateStart <= d.[Date]
and i.DateEnd >= d.[Date]
where
i.ValueTypeID = ...
and d.[Date] = ...
group by
...
Самый удачный вариант индекса, который я пока придумал, это кластеризованный индекс по ValueTypeID, DateStart, DateEnd.
Если делать запрос ровно на одну дату - работает быстро. Если за серию дат (за все дни месяца) - значительно медленнее. А если еще к этому запросу, не дай бог, начать джойнить какие-либо свойства Item'ов по ItemID для дополнительных группировок - пиши пропало...
Как правильно проиндексировать таблицу Intervals, чтобы сервер мог быстро отбирать и группировать значения по дате? Или, быть может, есть какие-то хитрые приемы работы с такими таблицами?
Я уже настолько устал с ней бороться, что всерьез рассматриваю вариант записать в отдельную таблицу все известные значения всех Item'ов на каждую календарную дату :) Такая таблица будет иметь миллиарды записей и занимать много-много гигабайт, но ее хоть по датам проиндексировать можно будет по-человечески.