Привет,
Нужен совет по написанию эффективно работающего 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.
Спасибо,
Газиз
SQL vopros2
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Gaziz
- Житель
- Сообщения: 944
- Зарегистрирован: 17 фев 2003, 15:57
- Откуда: Almaty-Toronto-Vancouver-Seattle
-
- Частый Гость
- Сообщения: 41
- Зарегистрирован: 02 авг 2005, 16:14
- Откуда: Vancouver
Re: SQL vopros2
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)
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
> колонку которую сразуже будете округлять до того, что надо,
не совсем понятно, что ты имеешь в виду?
не совсем понятно, что ты имеешь в виду?
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
Re: SQL vopros2
я так понял это боевая таблица, в которую постоянно пишется? если так, то создай отдельную таблицу, возможно даже в отдельной базе данных которая будет соптимизирована под твои репорты и будет дополнятся намример ночью или как часто тебе надо только за тот промежуток которые еще не загружен в репорт таблицу.Gaziz писал(а):> колонку которую сразуже будете округлять до того, что надо,
не совсем понятно, что ты имеешь в виду?