Pergunta

Eu tenho um banco de dados contendo registros coletados a cada 0,1 segundos e preciso a média do tempo os dados de um determinado dia a uma vez a cada 20 minutos. Portanto, preciso retornar um dia de dados em média a cada 20 minutos, o que é de 24*3 valores.
Atualmente, faço uma chamada AVG separada para o banco de dados para cada período de 20 minutos dentro do dia, que é de 24*3 chamadas. Minha conexão com o banco de dados parece um pouco lenta (é remoto) e leva ~ 5 minutos para fazer todas as médias. Seria mais rápido fazer uma única consulta na qual eu acesse o dia inteiro de dados do que a média a cada 20 minutos? Se ajudar a responder à pergunta, tenho que fazer alguma aritmética com os dados antes da média, a saber, multiplicando várias colunas de tabela.

Foi útil?

Solução

Você pode calcular o número de minutos desde a meia -noite, como:

datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)

Se você dividir isso aos 20 anos, obterá o número do intervalo de 20 minutos. Por exemplo, 00:10 cairia em intervalo 0, 00:30 em intervalo 1, e 15:30 em intervalo 46, e assim por diante. Com esta fórmula, você pode agrupar em intervalos de 20 minutos como:

select
    (datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20 as IntervalNr
,   avg(value)
from      YourTable
group by  (datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20

Você pode fazer matemática dentro do avg Ligue para:

avg(col1 * col2 - col3 / col4)

Outras dicas

Em geral, reduzir o número de consultas é uma boa ideia. Agregue e faça qualquer aritmética/filtragem/agrupamento que puder na consulta (ou seja, no banco de dados) e, em seguida, faça cálculos 'iterativos' no lado do servidor (por exemplo, PHP).

Para ter certeza se seria mais rápido ou não, deve ser medido.

No entanto, deve ser mais rápido, pois você tem uma conexão lenta com o banco de dados e, dessa maneira, o número de itens redondos tem um impacto maior no tempo total de execução.

Que tal um procedimento armazenado no seu banco de dados? Se o seu mecanismo de banco de dados não suportar um, que tal ter um script ou algo fazendo as contas e preencher uma tabela 'médias' separada no seu servidor de banco de dados. Então você só precisa ler as médias do cliente remoto uma vez por dia.

A computação em uma única consulta seria um pouco mais rápida. Pense na sobrecarga em várias solicitações, como configurar a conexão, analisar a consulta ou carregar o procedimento armazenado, etc.

Mas também certifique -se de que você tenha indicios precisos que possam resultar em um aumento de desempenho do Hugh. Algumas operações nos bancos de dados Hugh podem durar de minutos a horas.

Se você estiver enviando muitos dados e a conexão é o gargalo, como e quando você agrupa e envia os dados não importa. Não há uma boa maneira de enviar 100 MB a cada 10 minutos sobre um modem de 56k. Descubra o tamanho dos seus dados e a largura de banda e certifique -se de enviá -los.

Dito isto:

Primeiro, tenha certeza de que a rede é o gargalo. Nesse caso, tente trabalhar com um conjunto de dados menor, se possível, e teste diferentes cenários. Em geral, um grande conjunto de registros usará menos largura de banda que 2 registros que são metade do tamanho.

Se possível, adicione colunas à sua tabela e calcule e armazene o produto da coluna e o índice de intervalo (consulte a postagem de Andomar) toda vez que você publica dados no banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top