Нужно выбрать последний, скажем, курс валюты, за каждый час.
Я делаю так:
Заодно исполняется и на HQL.
Исполняется, инфекция, разумеется, фулсканом. На MySQL несчастные полторы тыщи записей по этим формулам группируются минуту. На hsql - пять минут.
1. К сожалению, индекс по функции от поля строитс не в каждой СУБД. Не получится написать
create index blabla on currency_course(
year(grouped.timestamp), month(grouped.timestamp), day(grouped.timestamp), hour(grouped.timestamp) ). А очень жаль.
2. Можно или вынести в отдельную таблицу "дайджест" - уже подготовленные последние записи.
3. Или выставить в таблице currency_course поля-флажки "последний за час/день/неделю", проиндексировать их и выгребать по ним.
Пока собираюсь так.
Кстати, инфекция, в HQL нет функции week(). И произвольного выкусывания части даты тоже нет 8(
Я делаю так:
select * from currency_course c where c.id in (select max(grouped.id) from currency_course grouped where grouped.timestamp between :from and :to group by year(grouped.timestamp), month(grouped.timestamp), day(grouped.timestamp), hour(grouped.timestamp) )
Заодно исполняется и на HQL.
Исполняется, инфекция, разумеется, фулсканом. На MySQL несчастные полторы тыщи записей по этим формулам группируются минуту. На hsql - пять минут.
1. К сожалению, индекс по функции от поля строитс не в каждой СУБД. Не получится написать
create index blabla on currency_course(
year(grouped.timestamp), month(grouped.timestamp), day(grouped.timestamp), hour(grouped.timestamp) ). А очень жаль.
2. Можно или вынести в отдельную таблицу "дайджест" - уже подготовленные последние записи.
3. Или выставить в таблице currency_course поля-флажки "последний за час/день/неделю", проиндексировать их и выгребать по ним.
Пока собираюсь так.
Кстати, инфекция, в HQL нет функции week(). И произвольного выкусывания части даты тоже нет 8(
(no subject)
19/8/09 12:51 (UTC)Но я не думаю, что индекс по ним сильно поможет: всё равно для каждого часа придётся доходить до каждого листа индекса.