Execução de rotina super demorada

Bom dia!

Me desculpe se não estou no tópico correto.

Em uma biblioteca eu e um colega criamos o código abaixo, que roda em uma grid(consulta), são dois select e um INSERT como pode ver. Na tabela tb_oficina chega ter mais de 500 mil registros. Quando eu executo colocando um período desejado chega demora até 30 minutos e as vezes não chega a concluir.

O que analisamos é que se trata do segundo select toda essa demora.

Gostaria da ajude de vocês para melhorar o código abaixo. Ficarei muito grato.

------------------------------------------------- /// -----------------------------

<?php function gerar_selos($codigoempresa,$dt_inicial,$dt_final) { //Limpar tabela $del = "DELETE FROM tb_anexos_o WHERE codigoempresa = '".$codigoempresa."'"; sc_exec_sql ($del); $sql= "SELECT tb_pedidos.data_saida, tb_oficina.id_pedido, tb_oficina.resultado_b, tb_pedidos.nf, tb_pedidos.nr_controle, MIN(tb_oficina.n_selo) AS selo_inicial, MAX(tb_oficina.n_selo) AS selo_final FROM tb_oficina, tb_pedidos WHERE tb_oficina.id_pedido = tb_pedidos.id_pedido AND data_saida IS NOT NULL AND n_selo <> '' AND resultado_b = '1' AND tb_pedidos.ex_ped <> '*' AND (data_saida BETWEEN '".$dt_inicial."' AND '".$dt_final."') AND tb_pedidos.codigoempresa = '".$codigoempresa."' GROUP BY tb_oficina.id_pedido ORDER BY id_oficina DESC"; $res = mysql_query($sql) or die ("Erro linha 38

".mysql_error()."

".$sql);
    while ($l = mysql_fetch_array($res) )
    {
        $data_saida = $l['data_saida'];
        $id_pedido = $l['id_pedido'];
        $nf = $l['nf'];
        $nr_controle = $l['nr_controle'];
        
        $bc = 0;
        $abc = 0;
        $co2 = 0;
        $ap = 0;
        $em = 0;
        
        $sql_tipo = "SELECT
                            id_tipo_ext,
                            COUNT(id_tipo_ext) AS qt
                    FROM tb_oficina,
                            tb_pedidos
                    WHERE tb_oficina.id_pedido = tb_pedidos.id_pedido
                            AND n_selo <> ''
                            AND data_saida = '".$data_saida."'
                            AND tb_pedidos.codigoempresa = '".$codigoempresa."'
                            AND tb_pedidos.id_pedido = '".$id_pedido."'
                    GROUP BY id_tipo_ext
                    ORDER BY id_oficina DESC";
        $res_tipo = mysql_query($sql_tipo) or die (mysql_error());
        while ($lp = mysql_fetch_array($res_tipo))
        {
            $tipo = $lp['id_tipo_ext'];
            $qt = $lp['qt'];
   
            if ($tipo == '1')
               $bc = $qt;
            if ($tipo == '2')
                $co2 = $qt;
            if ($tipo == '3')
               $em = $qt;
            if ($tipo == '6')
               $ap = $qt;
            if ($tipo == '8')
               $abc = $qt;
            if ($tipo == '9')
               $bc = $qt;
        }// fim while lp        
        
        $total_selos = ($bc + $abc + $co2 + $ap + $em);
        
        //======================================================================
        //Ajustar ainda
        $selo_inicial = $l['selo_inicial'];
        $selo_final = $l['selo_final'];
        //======================================================================
        $incluir = "INSERT INTO tb_anexos_o
                                            (codigoempresa,
                                             data_saida,
                                             id_pedido,
                                             nf,
                                             nr_controle,
                                             bc,
                                             abc,
                                             co2,
                                             ap,
                                             em,
                                             total_selos,
                                             selo_inicial,
                                             selo_final)
                                VALUES ('".$codigoempresa."',
                                        '".$data_saida."',
                                        '".$id_pedido."',
                                        '".$nf."',
                                        '".$nr_controle."',
                                        '".$bc."',
                                        '".$abc."',
                                        '".$co2."',
                                        '".$ap."',
                                        '".$em."',
                                        '".$total_selos."',
                                        '".$selo_inicial."',
                                        '".$selo_final."')";
       mysql_query($incluir) or die (mysql_error());
        
    }// fim while l   
		
 }    
?>

obg

Gilmar Monteiro

v7

Onde executa essa rotina? OnRecord? OnScriptInit?

Primeiro deve analisar índices (campos do where devem fazer parte de índices)

Segundo, eu criaria uma Stored Procedure para executar esse procedimento.

Haroldo

Todos os campos estão com índices.

Estar executado no onValidate do filtro veja como estou chamando. tenho que informar a data inicio e final.

$codigoempresa = [var_codigoempresa];
$dt_inicial = {data_inicio};
$dt_final = {data_final};

[dt_inicial] = date("d/m/Y", strtotime({data_inicio}));
[dt_final] = date("d/m/Y", strtotime({data_final}));

gerar_selos($codigoempresa,$dt_inicial,$dt_final);

Tente uma Stored Procedure.

Haroldo,

Stored Procedure em consulta pode?

Não sei nada de Stored Procedure vou tentar dá uma estudada.

obg.