Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

silderado

Performace

Recommended Posts

Olá Pessoal!Estou com o seguinte problema.Tenho um banco de dados onde administro banners, basicamente hits e clicks.Gravo tudo isso numa tabela, cada hits e cada clicks, gravo junto data, hora, cod_banner e ip da maquina.Diferencio o hits do click por um codigo, por exemplo 1 é para hits e 2 é para clicksLogo a tabela de logs tem a seguinte estruturacodigo bigint(8)data char(10)hora char(15)ip char(20) marquei aqui.. deveria ter criado varchar.. agora fica espaços em brancocod_log int(1) - 1 para hits e 2 para clicks..cod_banner (int(4)Essa tabela tem muitos registros... cada mês tem em média 880.000 registros, já tenho uns 10 meses de logs.O problema que estou tendo é na hora de tirar um relatório disso, por exemplo.Pego um banner e quero saber os hits e clicks dele em um determinado mês de um determinado ano.Está dando muito time out para tirar esses relatório, em alguns casos funciona certinho.Já revisei o código varias vezes e está tudo certinho, uso SELECT COUNT(codigo) para pegar o total de registro e uso a clausula WHERE para filtar a data.Bom!Minha dúvida é a seguinte, como posso otimizar essa tabela?Pensei em excluir o campo Ip, já que não está tendo nenhum uso desde que foi criado e como dito acima é char.Gostaria de saber tbm, se ganho performance se colocar as consultas em Store Procedure.Se alguém tiver uma idéia é bem vinda..[]s a todos..

Compartilhar este post


Link para o post
Compartilhar em outros sites

putz velho, axo q se você criar indices e talz, fika jóia, mais nem me pergunte como fazer, q eu nom sei...posta la no forum de sql Server q o eriva_br é "o cara" do sql, ele vai te ajudar...falowww

Compartilhar este post


Link para o post
Compartilhar em outros sites

kra não usa o select count. Como você tem muitos registros no banco, ao tentar tirar o relatório vai dar timeout mesmo. O count ele demora muito para trazer os dados.O que o select count faz é basicamente isso: ele irá ler os registros da base. depois ele vai verificar qual registro pediu ou não e depois vai mandar a resposta. Isso demora muito então utiliza isso.SELECT codigo AS codigo FROM suatabelaWHERE codigo = object_ID('suatabela)AND codigo >= 1o segredo é: que você está selecionando apenas uma coluna e usando o obeject_ID.isso resolve seu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

normalmente, qdo existe esta necessidade, criamos uma tabela auxiliar.. somente para relatórios.. q vai ter as informações consolidadas por dia...algo como: idbanner | data (dia_mes_ano) | hits | clicstodo dia você gera uma linha para cada banner nesta tabela de forma automatica (jobs no sqlserver, por exemplo)...ai os relatórios você tira desta tabela... manjou? vai ter uma quantidade muito menor de linhas na sua tabela para tirar os relatórios, beleza... ai você otimiza com indices em campos chaves.. e começa a contar usando SUM(CLICK) ao invles de COUNT(CLICK)..bom.. acho q deu pra pegar a ideia, beleza;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a ideia é criar tabela para cada mes por exemplotblBannersLogs_072006tblBannersLogs_082006e ai em diante???Outr dúvida, o SUM não vai somar o conteudo desse campo??por exemplo cod_log que em caso de hits vai ter 2 e em caso de clicks vai ter 2SUM(cod_log) vai somar tudo isso 1+2+1+2+2+2+1+1+3.Entendeu minha dúvida?Pelo que eu sei SUM soma e COUNT conta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

axo q nao velho, é para criar uma tabela auxiliar só, nela sim você cria um campo com a data...

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom..depende de qtos banners você tem.. vamos dizer q você tem 50 banners.. cada dia vai gerar 50 registros... ai da pra fazer em uma table de boa... algo como:id_banner | data | clique | hits00000001 | 2006-06-07 | 00004 | 000400000002 | 2006-06-07 | 00024 | 002400000003 | 2006-06-07 | 00014 | 001400000001 | 2006-06-08 | 00002 | 000200000002 | 2006-06-08 | 00023 | 002600000003 | 2006-06-08 | 00014 | 001500000001 | 2006-06-09 | 00002 | 002200000002 | 2006-06-09 | 00022 | 001600000003 | 2006-06-09 | 00013 | 0025ai só somar... SELECT id_banner, sum(clique) total_clique, sum(hits) total_hitsFROM tabela_consolidadaWHERE id_banner = 1 AND data BETWEEN '2006-06-01' AND '2006-06-31 23:59:59.999';)

Compartilhar este post


Link para o post
Compartilhar em outros sites

ska_ska!!Agora eu entendi o que você quis dizer.Acho a idéia bem interessante, porém vai me limitar um pouco.Pois tenho N tipos de relatórios.Para ter uma ideia tem um relatório que exibe o total de hits e clicks por mes, por dia, e por periodo do dia, (manha, tarde, noite, madrugada)tenho tbm um relatório que chamo de Ativos por dia, e mostra o total de hits e clicks por dia de um determinado banner..tudo sempre em periodo de mês em mês.talvez criar uma tabela com dados consolidados para cada um desses relatórios.[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

eh.. por isso q falo, cada caso um caso... você poderia, neste processo q vai gerar todo dia informações nesta tabela colocar algo como:id_banner | data | periodo |clique | hits00000001 | 2006-06-07 | 1 |00004 | 000400000002 | 2006-06-07 | 1 | 00024 | 002400000003 | 2006-06-07 | 1 | 00014 | 001400000001 | 2006-06-07 | 2 |00004 | 000400000002 | 2006-06-07 | 2 | 00024 | 002400000003 | 2006-06-07 | 2 | 00014 | 001400000001 | 2006-06-07 | 3 |00004 | 000400000002 | 2006-06-07 | 3 | 00024 | 002400000003 | 2006-06-07 | 3 | 00014 | 0014onde o periodo 1,2,3 eh manha, tarde e noite, respectivamente... velho.. ai eh adaptar para sua necessidade, beleza?

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza!!!Vou dar uma analizada aqui com o pessoal, mas acho que é por esse caminho a solução.[]s todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.