lu002047 0 Denunciar post Postado Junho 10, 2015 Olá,Estou com um problema com o tempo de pesquisa no banco de dados e consequente montagem da página php.Uma consulta em uma tabela de mais de 50 mil registros executada via browser não consegue ser finalizada, ao mandar executar a pesquisa, a página fica tentando carregar e após uns 4 minutos ela desiste e aparece o erro "Ocorreu um erro durante a exibição desta página. Para continuar, atualize ou vá para outra página". Como faço para resolver isso? Seria alguma configuração do APACHE, do PHP ou algo do tipo???Segue o código: <?php function status($statu, $datIni, $datFim, $tip, $resp){ $query = " SELECT A.DAT_CADASTRO, A.COD_SOLICITACAO, A.COD_TIPO, B.COD_MOTIVO, B.DES_MOTIVO, C.NOM_USUARIO, D.DES_STATUS, D.COD_COR, E.COD_ANALISTA, F.COD_DETERMINACAO, F.COD_IMPACTO, F.COD_ALINHAMENTO, F.COD_SITUACAO, F.COD_URGENCIA, F.COD_COMPLEXIDADE, F.COD_VIABILIDADE, F.COD_CUSTO, F.COD_PRAZO, F.COD_RISCOS, F.COD_TEMPO, F.OBSERVACAO FROM helpdesk.hdk_solicitacao A, helpdesk.hdk_solicitacao_motivo B, helpdesk.hdk_usuario C, helpdesk.hdk_solicitacao_status D, helpdesk.hdk_solicitacao_grupo E, hdk_priorizacao.matriz F WHERE A.COD_MOTIVO = B.COD_MOTIVO AND A.COD_USUARIO = C.COD_USUARIO AND A.COD_STATUS = D.COD_STATUS AND A.COD_SOLICITACAO = E.COD_SOLICITACAO AND A.COD_SOLICITACAO = F.COD_SOLICITACAO AND A.COD_STATUS in (".$statu.") AND A.DAT_CADASTRO BETWEEN " .$datIni. " AND ".$datFim." AND A.COD_TIPO IN(".$tip.") AND E.IND_RESPONSAVEL = 1 AND E.COD_ANALISTA IN (0,".$resp.") AND E.COD_GRUPO IN (5,6,7,8,9,10) GROUP BY A.COD_SOLICITACAO ORDER BY A.COD_SOLICITACAO;"; $sql1 = mysql_query($query1, $conexao1); $time_end = microtime (true); $time_res = $time_end - $time_start ; echo " a consulta levou US $time_res segundos "; ?> <table id='matriz' border='1px' cellspacing='0' cellpadding='2'> <tr> <th>Data</th> <th>Responsável</th> <th>Tipo</th> <th>Cliente</th> <th>Chamado</th> <th>Status</th> <th><a href="#" class="dica" title="<h6 align='center'><b>Determinacação legal ou Administração Superior</b></h6>1- Não<br>5- Sim">Deter. legal ou Adm Superior</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Impacto nas metas (indicadores das áreas)</b></h6>1- Não<br>5- Sim">Impacto metas (Indicadores)</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Alinhamento à estratégia da empresa</b></h6>1- Não<br>5- Sim">Alinham. estrat. empresa</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Situação da implementação</b></h6>1- 0%<br>2- até 20%<br>3- até 30%<br>4- até 40%<br>5- acima de 50%">Situ. implem.</th> <th><a href="#" class="dica" title="<h6 align='center'><b>Urgência</b></h6>1- fora semestre<br>2- 1º semestre<br>3- 1º trimestre<br>4- 2º mês<br>5- 1º mês">Urgência</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Complexidade</b></h6>*Mais de uma tecnologia;<br>*Integrações;<br>*Regra de negócio com- plexa.<br><br>1- Baixa complexidade (utiliza 1 item)<br>3- Média complexidade (utiliza 2 itens)<br>5- Alta complexidade (utiliza os 3 itens)">Complexidade</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Viabilidade técnica</b></h6>1- totalmente viável<br>5- totalmente inviável">Viabilidade téc.</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Custo</b></h6>1- até R$ 5.000,00<br>2- até R$ 20.000,00<br>3 até R$ 50.000,00<br>4 até R$ 100,000,00<br>5 acima de R$ 100.000,00">Custo</th> <th><a href="#" class="dica" title="<h6 align='center'><b>Prazo de implementação</b></h6>1- até 10 dias<br>2- até 30 dias<br>3- até 60 dias<br>4- até 90 dias<br>5- acima de 90 dias">Prazo implem.</a></th> <th><a href="#" class="dica" title="<h6 align='center'><b>Riscos</b></h6>1- risco inexistente<br>2- muito baixo<br>3- baixo<br>4- alto<br>5- muito alto">Riscos</th> <th><a href="#" class="dica" title="<h6 align='center'><b>Tempo de geração de resultados</b></h6>1- até um mês<br>2- até três meses<br>3- até seis meses<br>4- até um ano<br>5- acima de um ano">Tempo geração result.</a></th> <th>Soma</th> <th>Observação</th> </tr> <?php //contador total $solicitacoes = 0; $i= 0; while ($dados = mysql_fetch_assoc($sql1)) { //---------------------------------ANALISTA-----------------------------------\\ $codigoAnalista = $dados['COD_ANALISTA']; if($codigoAnalista != '0'){ $nome = mysql_query( "SELECT NOM_USUARIO FROM helpdesk.hdk_usuario C WHERE C.COD_USUARIO = ".$codigoAnalista.";" , $conexao1); $nomeAnalista = mysql_fetch_row($nome); }elseif($codigoAnalista == '0'){ $codigoAnalista = $dados['COD_GRUPO']; $nome = mysql_query( "SELECT NOM_GRUPO FROM helpdesk.hdk_grupo C " ."WHERE C.COD_GRUPO = ".$codigoAnalista.";" , $conexao1); $nomeAnalista = mysql_fetch_row($nome); } //----------------------------CONTS PARA O GRÁFICO----------------------------\\ if ($dados['COD_MOTIVO'] === '2' or $dados['COD_MOTIVO'] === '6' or $dados['COD_MOTIVO'] === '10' or $dados['COD_MOTIVO'] === '15' or $dados['COD_MOTIVO'] === '21' or $dados['COD_MOTIVO'] === '24') { $contDes++; } elseif ($dados['COD_MOTIVO'] === '3' or $dados['COD_MOTIVO'] === '11' or $dados['COD_MOTIVO'] === '17' or $dados['COD_MOTIVO'] === '18' or $dados['COD_MOTIVO'] === '22' or $dados['COD_MOTIVO'] === '26') { $contProj++; } elseif ($dados['COD_MOTIVO'] === '4' or $dados['COD_MOTIVO'] === '8' or $dados['COD_MOTIVO'] === '12' or $dados['COD_MOTIVO'] === '19' or $dados['COD_MOTIVO'] === '20' or $dados['COD_MOTIVO'] === '27') { $contSup++; } elseif ($dados['COD_MOTIVO'] === '5' or $dados['COD_MOTIVO'] === '9' or $dados['COD_MOTIVO'] === '14' or $dados['COD_MOTIVO'] === '16' or $dados['COD_MOTIVO'] === '23' or $dados['COD_MOTIVO'] === '25') { $contManu++; } else { $contNaoInfo++; } //-----------------------------------DATA-------------------------------------\\ //Separação de data, pois no DB está no formato (YYYYMMDDHHMM) $DAT_CADASTRO = $dados['DAT_CADASTRO']; //ano $anoInt = explode(',', $DAT_CADASTRO); $anoString = implode(':', $anoInt); $anoMostrar = substr($anoString, 0, 4); //mes $mesMostrar = substr($anoString, 4, 2); //dia $diaMostrar = substr($anoString, 6, 2); //-----------------------MOSTRANDO AS INFORMAÇÕES NUMA TABELA----------------\\ ?> <tr> <td><?php echo $diaMostrar."/".$mesMostrar."/".$anoMostrar;?></td> <?php if ($dados ['COD_MOTIVO'] != '0') {?> <td><?php echo utf8_encode ($nomeAnalista[$i]);?></td> <?php }else {?> <td>Não Informado</td> <?php }?> <td><?php echo utf8_encode ($dados['DES_MOTIVO']);?></td> <td><?php echo utf8_encode($dados['NOM_USUARIO']);?></td> <td><?php echo $dados['COD_SOLICITACAO'];?></td> <td style='color:white' bgcolor=<?php echo $dados['COD_COR'];?>><?php echo utf8_encode($dados['DES_STATUS']);?></td> <td> <select name='determinacao' class="qnt"> <?php if($dados['COD_DETERMINACAO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_DETERMINACAO'] != '0'){?> <option value=<?php echo $dados['COD_DETERMINACAO'];?>><?php echo $dados['COD_DETERMINACAO'];?> </option> <?php } ?> <option value=1>1</option> <option value=5>5</option> </select> </td> <td> <select name='impacto' class="qnt"> <?php if($dados['COD_IMPACTO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_IMPACTO'] != '0'){ ?> <option value=<?php echo $dados['COD_IMPACTO'];?>><?php echo $dados['COD_IMPACTO'];?> </option> <?php } ?> <option value=1>1</option> <option value=5>5</option> </select> </td> <td> <select name='alinhamento' class="qnt"> <?php if($dados['COD_ALINHAMENTO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_ALINHAMENTO'] != '0'){ ?> <option value=<?php echo $dados['COD_ALINHAMENTO'];?>><?php echo $dados['COD_ALINHAMENTO'];?> </option> <?php } ?> <option value=1>1</option> <option value=5>5</option> </select> </td> <td> <select name='situacao' class="qnt"> <?php if($dados['COD_SITUACAO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_SITUACAO'] != '0'){ ?> <option value=<?php echo $dados['COD_SITUACAO'];?>><?php echo $dados['COD_SITUACAO'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td> <select name='urgencia' class="qnt"> <?php if($dados['COD_URGENCIA'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_URGENCIA'] != '0'){ ?> <option value=<?php echo $dados['COD_URGENCIA'];?>><?php echo $dados['COD_URGENCIA'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td> <select name='complexidade' class="qnt"> <?php if($dados['COD_COMPLEXIDADE'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_COMPLEXIDADE'] != '0'){ ?> <option value=<?php echo $dados['COD_COMPLEXIDADE'];?>><?php echo $dados['COD_COMPLEXIDADE'];?> </option> <?php } ?> <option value=1>1</option> <option value=3>3</option> <option value=5>5</option> </select> </td> <td> <select name='viabilidade' class="qnt"> <?php if($dados['COD_VIABILIDADE'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_VIABILIDADE'] != '0'){ ?> <option value=<?php echo $dados['COD_VIABILIDADE'];?>><?php echo $dados['COD_VIABILIDADE'];?> </option> <?php } ?> <option value=1>1</option> <option value=5>5</option> </select> </td> <td> <select name='custo' class="qnt"> <?php if($dados['COD_CUSTO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_CUSTO'] != '0'){ ?> <option value=<?php echo $dados['COD_CUSTO'];?>><?php echo $dados['COD_CUSTO'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td> <select name='prazo' class="qnt"> <?php if($dados['COD_PRAZO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_PRAZO'] != '0'){ ?> <option value=<?php echo $dados['COD_PRAZO'];?>><?php echo $dados['COD_PRAZO'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td> <select name='riscos' class="qnt"> <?php if($dados['COD_RISCOS'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_RISCOS'] != '0'){ ?> <option value=<?php echo $dados['COD_RISCOS'];?>><?php echo $dados['COD_RISCOS'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td> <select name='tempo' class="qnt"> <?php if($dados['COD_TEMPO'] == '0'){ ?> <option value=0>Selecione...</option> <?php }elseif($dados['COD_TEMPO'] != '0'){ ?> <option value=<?php echo $dados['COD_TEMPO'];?>><?php echo $dados['COD_TEMPO'];?> </option> <?php } ?> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> </select> </td> <td><input type='text' class="total" value=<?php echo (($dados['COD_DETERMINACAO']*8)+($dados['COD_IMPACTO']*7)+($dados['COD_ALINHAMENTO']*7)+($dados['COD_SITUACAO']*5)+($dados['COD_URGENCIA']*2))-(($dados['COD_COMPLEXIDADE']*2)+($dados['COD_VIABILIDADE']*5)+($dados['COD_CUSTO']*3)+($dados['COD_PRAZO'])+($dados['COD_RISCOS']*4)+($dados['COD_TEMPO']*2))?> /></td> <td><textarea rows="1" cols="33"><?php echo $dados['OBSERVACAO'];?></textarea></td> </tr> </table> ?> Obs.: Sei que funções mysql estão obsoletas, vou ajustar depois. Compartilhar este post Link para o post Compartilhar em outros sites
Marcelo Lipienski 9 Denunciar post Postado Junho 10, 2015 Execute um EXPLAIN na query e coloque o resultado aqui. Depois disso, limpe seu código, coloque apenas as partes relevantes para o problema, com certeza seu HTML não é o problema, não tem motivo para ele estar ali no código, apenas dificulta a leitura de quem quer te ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
BlackMix 15 Denunciar post Postado Junho 10, 2015 Remova o ";" daqui >> http://puu.sh/ijQoW/72a67645b4.png Compartilhar este post Link para o post Compartilhar em outros sites
Marcelo Lipienski 9 Denunciar post Postado Junho 10, 2015 Remova o ";" daqui >> http://puu.sh/ijQoW/72a67645b4.png Por que? Não tem nada de errado aí. Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Junho 10, 2015 De uma olha aqui, e outra, esta consulta pode ser melhor otimizada utilizando joins corretamente, eliminando a segunda consulta dentro loop, e usar SQL_CACHE para melhorar a performance. Edit:Pesquise também sobre Tuning mysql Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Junho 10, 2015 No link abaixo há algumas configurações para melhorar o desempenho do MySQL conforme o hardware/conectividade do servidor: http://forum.imasters.com.br/topic/536431-mysql-comandos-que-melhoram-o-desempenho/?p=2142518 Compartilhar este post Link para o post Compartilhar em outros sites
ExtremsX 58 Denunciar post Postado Junho 11, 2015 Isso é um relatorio com 50k linhas? se não for acho q você poderia fazer uma paginação para otimizar processo, se for um relatorio no qual precisa ser gerado as 50k linhas, isso pode ser um erro de otimização do banco de dados, pode ser por que ta dando erro no PHP mesmo (para isso tente colocar um LIMIT 100 por exemplo na consulta e veja se vai dar o mesmo erro), pode ser o set_time_limit do PHP (aumente ele para confirmar), pode ser o tamanho da memoria que pode ser pequena de mais para tantos dados. Enfim pode ser uma infinidade de coisas. Compartilhar este post Link para o post Compartilhar em outros sites
lu002047 0 Denunciar post Postado Junho 11, 2015 Execute um EXPLAIN na query e coloque o resultado aqui. Segue: id,"select_type","table","type","possible_keys","key","key_len","ref","rows","Extra" 1,"SIMPLE","B","ALL","PRIMARY,COD_MOTIVO","","","",25,"Using temporary 1,"SIMPLE","A","ref","PRIMARY,COD_SOLICITACAO,cod_solicitacao_idx,hdk_solicitacao_COD_USUARIO_idx,hdk_solicitacao_COD_STATUS_idx,hdk_solicitacao_COD_MOTIVO_idx,hdk_solicitacao_COD_TIPO_idx,cod_usuario_idx,cod_status_idx,cod_motivo_idx,cod_tipo_idx,dat_cadastro_idx","cod_motivo_idx","5","helpdesk.B.COD_MOTIVO",627,"Using where" 1,"SIMPLE","C","eq_ref","PRIMARY,COD_USUARIO,cod_usuario_idx","PRIMARY","8","helpdesk.A.COD_USUARIO",1,"Using where" 1,"SIMPLE","F","eq_ref","PRIMARY","PRIMARY","8","helpdesk.A.COD_SOLICITACAO",1,"Using where" 1,"SIMPLE","D","eq_ref","PRIMARY,COD_STATUS","PRIMARY","8","helpdesk.A.COD_STATUS",1,"Using where" 1,"SIMPLE","E","ref","unico_grupo_responsavel_idx,hdk_solicitacao_grupo_cod_solicitacao_idx,hdk_solicitacao_grupo_cod_grupo_idx,hdk_solicitacao_grupo_cod_analista_idx,hdk_solicitacao_grupo_ind_responsavel_idx,cod_solicitacao_idx,cod_grupo_idx,cod_analista_idx,ind_responsavel_idx","unico_grupo_responsavel_idx","8","helpdesk.A.COD_SOLICITACAO",1,"Using where Depois disso, limpe seu código, coloque apenas as partes relevantes para o problema, com certeza seu HTML não é o problema, não tem motivo para ele estar ali no código, apenas dificulta a leitura de quem quer te ajudar. Obrigado pela dica. Isso é um relatorio com 50k linhas? se não for acho q você poderia fazer uma paginação para otimizar processo, se for um relatorio no qual precisa ser gerado as 50k linhas, isso pode ser um erro de otimização do banco de dados, pode ser por que ta dando erro no PHP mesmo (para isso tente colocar um LIMIT 100 por exemplo na consulta e veja se vai dar o mesmo erro), pode ser o set_time_limit do PHP (aumente ele para confirmar), pode ser o tamanho da memoria que pode ser pequena de mais para tantos dados. Enfim pode ser uma infinidade de coisas. Opa, Na verdade não preciso exibir os 50k numa página só. Vou testar seu conselho e criar uma paginação para ver se resolve...Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Marcelo Lipienski 9 Denunciar post Postado Junho 11, 2015 Aparentemente não existe motivo para sua query levar todo esse tempo para executar, o plano de execução acusa o primeiro passo como problemático porque ele precisa utilizar duas técnicas ruins. id,"select_type","table","type","possible_keys","key","key_len","ref","rows","Extra" 1,"SIMPLE","B","ALL","PRIMARY,COD_MOTIVO","","","",25,"Using temporary type: ALL, significa que o MySQL vai percorrer todas as linhas da tabela para encontrar extra: Using temporary, indica que foi preciso criar uma tabela temporária para resolver seu GROUP BY e ORDER BY. Sem dúvida você precisa resolver isso, só que com a base atual, esse passo retorna apenas 25 linhas, o que não impactaria na performance percorrer cada uma delas. Qual a especificação do servidor onde está o MySQL? Tem RAM suficiente disponível? Existem outras aplicações pesadas rodando em cima dele? Já tentou dar um return; logo depois de echo " a consulta levou US $time_res segundos "; para verificar o tempo de execução da query? existe a possibilidade de o gargalo estar sendo em outro lugar. Compartilhar este post Link para o post Compartilhar em outros sites