SQL vopros2

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

SQL vopros2

Сообщение Gaziz »

Привет,

Нужен совет по написанию эффективно работающего SQL запроса

Исходная таблица в упрощенном виде выглядит так

time datetime
name char
value int

(для примера мы запрашиваем интерфейс каждые N (N не можем контролировать и оно постоянно меняется)
и записываем количтво принятых/посланных/ошибок/дубликатов/тд, причем value - это counter, который постоянно растет.

Нужно написать такой запрос чтобы появилась таблица для рисования графика вида

2008-01-01 11:00:00 sent 123123
2008-01-01 11:00:00 received 23123
2008-01-01 11:00:00 errors 3123
2008-01-01 11:00:00 dups 4123123
2008-01-01 11:10:00 sent 7123123
2008-01-01 11:10:00 received 723123
2008-01-01 11:10:00 errors 73123
2008-01-01 11:10:00 dups 74123123
2008-01-01 11:20:00 sent 123123
2008-01-01 11:20:00 received 23123
2008-01-01 11:20:00 errors 3123
2008-01-01 11:20:00 dups 4123123

где, например, sent - это количество посланых пакетов в период 11:00:00 и 11:10:00.

Мой алгоритм на stored procedures работает достаточно быстро при количестве записей до 50к
после чего все сильно замедляется.

Подкиньте идеи как можно это дело переписать на чистом SQL.


Спасибо,
Газиз
BB
Частый Гость
Сообщения: 41
Зарегистрирован: 02 авг 2005, 16:14
Откуда: Vancouver

Re: SQL vopros2

Сообщение BB »

just an idea...

select <timerounded>, name, sum(value) from table group by <timerounded>, name

where <timerounded> is the time rounded to whatever interval you need. I.e. for 10 minutes
<timerounded>=CAST(((ROUND(CAST(timefield as float)*144,0)+1)/144) as smalldatetime) -- +1 to do ceiling rather than floor

Test:
declare @aa datetime
set @aa='2008-06-26 12:42PM'
select CAST(((ROUND(CAST(@aa as float)*144,0)+1)/144) as smalldatetime)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: SQL vopros2

Сообщение папа Карло »

такой запрос будет очень стремно работать.... Газиз, можете добавить колонку которую сразуже будете округлять до того, что надо, тогда запрос будет гораздо лучше.... квери сверху будет тейблскан делать. еще лучше заведите отдельную таблицу для репортинга... которую будете будете заполнять как надо в зависимости от объемов....
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

Re: SQL vopros2

Сообщение Gaziz »

> колонку которую сразуже будете округлять до того, что надо,

не совсем понятно, что ты имеешь в виду?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: SQL vopros2

Сообщение папа Карло »

Gaziz писал(а):> колонку которую сразуже будете округлять до того, что надо,

не совсем понятно, что ты имеешь в виду?
я так понял это боевая таблица, в которую постоянно пишется? если так, то создай отдельную таблицу, возможно даже в отдельной базе данных которая будет соптимизирована под твои репорты и будет дополнятся намример ночью или как часто тебе надо только за тот промежуток которые еще не загружен в репорт таблицу.
Ответить