LINUX.ORG.RU

[SQL] Варианты решения задачи


0

1

Доброго всем вам.

Итак, имеем типичную задачу - есть таблица, в которой много-много событий, которые состоят из даты/времени, типа, кучи идентификаторов-ссылок, и кучки всевозможных флагов.

Функционально - необходимо подбить несколько десятков запросов на sum, avg, count, min, max и т.п. агрегации за определенный промежуток времени, при этом каждый запрос с определенными условиями where и group by по флагам и идентификаторам данной таблицы.

В свое время решались подобные задачи разными подходами:
1. последовательный перебор кучи select XXX from TTT where IDs and Flags group by CCC
2. копирование данных из таблицы в MEMORY-table (mysql) и все тот же последовательный перебор
3. выдергивание всех данных за промежуток времени (по индексу) в middleware и построчный подсчет необходимых значений, в потоковом режиме.

Первые два способа - говно, и обсуждать нечего - медленно до безобразия (второй быстрее, но надо очень много памяти, что не всегда доступно). Третий - очень быстро (в ~25 раз быстрее), минимальные затраты памяти.

Так сложилось исторически, что никто не пробовал все запросы запустить в параллель на базе - будет ли профит, допустим на mysql, 50-ти запросах, 2-8 головах CPU и 2-8GB RAM при среднем кол-ве строк ~10000000, около четверти килобайта на строку? Выборки - от 10000 до 1000000 строк за раз.

И самое главное - можно ли как-то решить эту задачу третьим способом, не пристраивая middleware, т.е. исключительно средствами SQL (mysql или pgsql). Глубинных знаний SQL не имею, т.ч. не пинайте.

спасибо.

★★★★★

надо вешать триггер на таблицу, чтоб в реальном времени агрегировалось в другую (или несколько), тогда не придется каждый раз выполнять тяжелые запросы и всегда будут в наличии нужные данные

s0L ()
Ответ на: комментарий от aydar

беда в том, что период запроса может быть совершенно произвольным, т.е. не просто с 20.09.2011 по 23.09.2011, а с 20.09.2011 15:43:38 по 23.09.2011 04:15:27

хотя, можно посчитать по целым суткам, а потом прибавить остатки внутри суток. будет ли это быстрее...

а вообще </thread>, так как ТС, невежда, совсем забыл про существование курсоров, которые собственно и решают данную задачу.

всем спасибо.

dib2 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.