Ir para conteúdo

POWERED BY:

Arquivado

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

lu002047

tempo de retorno de resultados do Mysql

Recommended Posts

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

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

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

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

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

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

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

×

Informação importante

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