SQL: расчет статистики загрузки системы - PullRequest
1 голос
/ 19 мая 2009

У меня есть такая таблица, в которой хранятся сообщения, поступающие через систему:

Message
-------
ID (bigint)
CreateDate (datetime)
Data (varchar(255))

Меня попросили вычислить количество сообщений, сохраняемых за секунду при пиковой нагрузке. Единственные данные, с которыми мне действительно приходится работать - это CreateDate. Нагрузка на систему не постоянна, бывают случаи, когда мы получаем тонну трафика, и времена, когда мы получаем мало трафика. Я думаю, что есть две части этой проблемы: 1. Определить интервалы времени, которые считаются пиковыми нагрузками, 2. Рассчитать среднее количество сообщений в секунду за это время.

Это правильный подход? Есть ли в SQL вещи, которые могут помочь с этим? Любые советы будут с благодарностью.

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

Я согласен, вы должны выяснить, что такое Пиковая нагрузка, прежде чем начинать создавать отчеты по ней.

Первое, что я хотел бы сделать, это выяснить, как я собираюсь определить пиковую нагрузку. Ex. Собираюсь ли я смотреть на разбивку по часам.

Далее я бы сделал группирование по CreateDate, сформированному за секунды (без миллисекунд). Как часть группы, я бы сделал среднее число на основе количества записей.

1 голос
/ 20 мая 2009

Не думаю, что вам нужно знать часы пик; Вы можете сгенерировать их с помощью SQL, добавив полный запрос и выбрав 20 лучших записей, например:

select top 20 *
from (
     [...load query here...]
) qry
order by LoadPerSecond desc

В этом ответе был хороший урок о средних. Вы можете рассчитать нагрузку в секунду, посмотрев на нагрузку в час и разделив на 3600.

Чтобы получить первое представление о загрузке за последнюю неделю, вы можете попробовать (синтаксис Sql Server):

select datepart(dy,createdate) as DayOfYear,
       hour(createdate) as Hour, 
       count(*)/3600.0 as LoadPerSecond
from message
where CreateDate > dateadd(week,-7,getdate())
group by datepart(dy,createdate), hour(createdate)

Чтобы найти пиковую нагрузку в минуту:

select max(MessagesPerMinute)
from (
  select count(*) as MessagesPerMinute
  from message
  where CreateDate > dateadd(days,-7,getdate())
  group by datepart(dy,createdate),hour(createdate),minute(createdate)
)

Группировка по датам (dy, ...) - это простой способ различать дни, не беспокоясь о границах месяца. Он работает до тех пор, пока вы не выберете больше года назад, но это было бы необычно для запросов производительности.

1 голос
/ 19 мая 2009

предупреждение, они будут работать медленно!

это сгруппирует ваши данные во «вторые» сегменты и перечислит их от наибольшей активности к наименьшему:

SELECT
    CONVERT(char(19),CreateDate,120) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY CONVERT(Char(19),CreateDate,120)
    ORDER BY 2 Desc

это сгруппирует ваши данные в "минутные" сегменты и перечислит их от наибольшей активности к наименьшему:

SELECT
    LEFT(CONVERT(char(19),CreateDate,120),16) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY LEFT(CONVERT(char(19),CreateDate,120),16)
    ORDER BY 2 Desc

Я бы взял эти значения и вычислил, что они хотят

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...