SQL: Calculando estatísticas de carga do sistema

votos
1

Eu tenho uma tabela como esta que armazena mensagens que chegam através de um sistema:

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

Fui convidado para calcular as mensagens gravadas por segundo no pico de carga. Os únicos dados que eu realmente tenho que trabalhar com é o CreateDate. A carga sobre o sistema não é constante, há momentos em que temos uma tonelada de tráfego, e momentos em que temos pouco tráfego. Estou pensando há duas partes para este problema: 1. Determinar intervalos de tempo em que são considerados carga de pico, 2. calcular a média por segundo durante estes tempos.

É este o caminho certo? Existem coisas em SQL que podem ajudar com isso? Quaisquer dicas seriam extremamente apreciadas.

Publicado 19/05/2009 em 18:50
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Concordo, você tem que descobrir o que pico de carga é primeiro antes de poder começar a criar relatórios sobre ele.

A primeira coisa que eu faria é descobrir como eu estou indo para definir a carga de pico. Ex. Estou indo olhar uma hora por quebra hora.

Em seguida gostaria de fazer um grupo, na CreateDate formatada em segundos (sem milleseconds). Como parte do grupo, eu faria uma média com base no número de registros.

Respondeu 19/05/2009 em 18:56
fonte usuário

votos
1

Eu não acho que você precisa saber os horários de pico; você pode gerá-los com SQL, envolvendo uma consulta completa e selecionando os 20 melhores entradas, por exemplo:

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

Esta resposta teve uma boa lição sobre médias. Você pode calcular a carga por segundo, olhando para a carga por hora, e dividindo por 3600.

Para obter um primeiro vislumbre da carga para a última semana, você poderia tentar (sintaxe 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)

Para encontrar o pico de carga por minuto:

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)
)

O agrupamento por datepart (dy, ...) é uma maneira fácil de distinguir entre os dias sem se preocupar com fronteiras mês. Ele funciona até que você selecionar mais que um ano atrás, mas que seria incomum para consultas de desempenho.

Respondeu 19/05/2009 em 22:24
fonte usuário

votos
1

aviso, estes irão correr devagar!

Este grupo irá seus dados em "segunda" baldes e incluí-los desde o mais atividade para menos:

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

Este grupo irá seus dados em baldes "minuto" e incluí-los desde o mais atividade para menos:

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

Eu levaria esses valores e calcular o que eles querem

Respondeu 19/05/2009 em 20:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more