Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Otimização de Queries


btpedro

Pergunta

Boa tarde pessoal,

meu primeiro post e estou quebrando a cabeça a um boooom tempo para tentar otimizar as seguintes queries. As 3 queries estão na mesma página. O tempo de execução é extremamente demorado (para gerar um relatório de 15 dias, levei aproximadamente meia hora para montar as tabelas (HTML))

O que preciso é que esse relatório seja gerado para excel. Testei a classe Excelwrite.inc (PHP) e consegui criar a planilha. Porém, me retorna somente a primeira query.

Segue as Queries

if($_GET["cliente"]){
    $sqlCli = " and l.cliente = '".$_GET["cliente"]."'";
}

if($_GET["filtro"]){
    $sqlFiltro = " and l.filtro = '".$_GET["filtro"]."'";
}

if($_GET["data1"]){
    $data1Arr = explode("/",$_GET["data1"]);
    $data1SQL = $data1Arr[2].'-'.$data1Arr[1].'-'.$data1Arr[0];
    $data2Arr = explode("/",$_GET["data2"]);
    $data2SQL = $data2Arr[2].'-'.$data2Arr[1].'-'.$data2Arr[0];
    $sqlData = " and date_format(l.datacad,'%Y-%m-%d') >= '".$data1SQL."' and date_format(l.datacad,'%Y-%m-%d') <= '".$data2SQL."'";
}

$txtSQL = "select l.*, c.nome from licitacoes as l
                            INNER JOIN licitacoes_clientes as c on l.cliente = c.cli
                            where 1=1 $sqlCli $sqlFiltro $sqlData
                            order by achouPalavra, cidade, uf, enviada";
-------------------------------------- SEGUNDA QUERY
$edital = '';
    $sqlEd = mysql_db_query($banco,"select * from licitacoes_links where idLicitacao = '$res[id]' group by linkCompleto");
----------------------------------------- TERCEIRA QUERY
$sqlEn = mysql_db_query($banco,"select p.* from licitacoes_proc_intrasys as p
                                  INNER JOIN licitacoes_email as e on p.id = e.idProcIntrasys
                                  where e.idLicitacao = '$res[id]' group by data");

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Oi 'btpedro',

select l.*, c.nome 
from licitacoes as l
INNER JOIN licitacoes_clientes as c on l.cliente = c.cli
where 1=1 $sqlCli $sqlFiltro $sqlData
order by achouPalavra, cidade, uf, enviada";
1): Evite usar asterisco. Informe os campos que você precisa. 2): Inverta a ordem desta igualdade l.cliente = c.cli 3): Crie indice para c.cli 4): Redefina esta pesquisa. where 1=1 $sqlCli $sqlFiltro $sqlData Não está comparando nada. Este é o ponto fraco. Aqui está gerando TABLE SCAN -------------------------------------- SEGUNDA QUERY
select * 
from licitacoes_links 
where idLicitacao = '$res[id]' 
group by linkCompleto;
1)Evite usar asterisco. Informe os campos que você precisa. 2)Verifique se há indice para idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto. 3)Verifique se há indice para linkCompleto. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo ----------------------------------------- TERCEIRA QUERY
select p.* 
from licitacoes_proc_intrasys as p
INNER JOIN licitacoes_email as e on p.id = e.idProcIntrasys
where e.idLicitacao = '$res[id]' 
group by data");

1)Evite usar asterisco. Informe os campos que você precisa.

2)Inverta a ordem desta igualdade p.id = e.idProcIntrasys

3)Verifique se há indice para e.idProcIntrasys. Se não existir crie. A ausencia de índice aqui gera TABLE SCAN.

4)Verifique se há indice para e.idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto.

5)Verifique se há indice para data. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo

Link para o comentário
Compartilhar em outros sites

  • 0
Oi 'btpedro',
select l.*, c.nome 
from licitacoes as l
INNER JOIN licitacoes_clientes as c on l.cliente = c.cli
where 1=1 $sqlCli $sqlFiltro $sqlData
order by achouPalavra, cidade, uf, enviada";
1): Evite usar asterisco. Informe os campos que você precisa. 2): Inverta a ordem desta igualdade l.cliente = c.cli 3): Crie indice para c.cli 4): Redefina esta pesquisa. where 1=1 $sqlCli $sqlFiltro $sqlData Não está comparando nada. Este é o ponto fraco. Aqui está gerando TABLE SCAN -------------------------------------- SEGUNDA QUERY
select * 
from licitacoes_links 
where idLicitacao = '$res[id]' 
group by linkCompleto;
1)Evite usar asterisco. Informe os campos que você precisa. 2)Verifique se há indice para idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto. 3)Verifique se há indice para linkCompleto. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo ----------------------------------------- TERCEIRA QUERY
select p.* 
from licitacoes_proc_intrasys as p
INNER JOIN licitacoes_email as e on p.id = e.idProcIntrasys
where e.idLicitacao = '$res[id]' 
group by data");

1)Evite usar asterisco. Informe os campos que você precisa.

2)Inverta a ordem desta igualdade p.id = e.idProcIntrasys

3)Verifique se há indice para e.idProcIntrasys. Se não existir crie. A ausencia de índice aqui gera TABLE SCAN.

4)Verifique se há indice para e.idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto.

5)Verifique se há indice para data. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo

Denis, obrigado pela ajuda. Vou testar agora mesmo as alterações e posto o resultado.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, conforme havia dito...

Fiz os testes hoje e... o desempenho melhorou muuuuuuuito cara...

Gerei um relatório anual para testes (o resultado foram aproximadamente 16 mil linhas) e ele não levou nem 5 minutos...

Muito obrigado. É bom saber que temos profissionais do seu calibre dispostos a ajudar. :lol:

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...