[firebase-br] Ajuda em SQL

W O sistemas2000profesional em gmail.com
Sex Set 12 01:51:07 -03 2014


Mirando el PLAN se puede descubrir donde están los errores:

1. Un SORT significa que no hay un índice y que el Firebird creará un
índice temporario porque la necesita ordenada. Crear el índice temporario
puede consumir muchísimo tiempo en tablas que tienen muchas filas.

2. Un NATURAL significa que no hay un índice y que el Firebird no creará un
índice temporario. Si no importa el orden en el cual se mostrarán las
filas, que la tabla principal sea NATURAL es lo correcto.

3. Donde dice SORT (JOIN (LO NATURAL, VEN NATURAL)) significa que ni la
tabla LO ni la tabla VEN tienen un índice pero como hay un JOIN entre ellas
entonces se creará un índice temporario. Si las tablas son grandes, eso
puede demorar mucho tiempo.

4. La tabla COM tampoco tiene un índice

5. La tabla LO tampoco tiene un índice sobre la columna que se usa en el
ORDER BY, por eso se debe realizar un SORT para mostrar a las filas
ordenadas.

Mirando las operaciones se puede ver que hay 3.999 lecturas pero 11.033.899
extracciones de datos, eso es una diferencia impresionantemente grande y se
debe a que las tablas no tienen los índices que deberían tener.

¿La solución?

Crear los índices para que desaparezcan los NATURAL y los SORT.

Saludos.

Walter.




On Thu, Sep 11, 2014 at 8:51 AM, <bzottis em ig.com.br> wrote:

>
>
> Bom Dia, verifique se o Campo "lo.LEI_CODIGO" tem índice, se não tiver,
> pode estar aí o problema
>
> Em 11/09/2014 09:23, Gladiston Santana escreveu:
>
> > Eu suspeito que o problema seja com os left joins :)
> >
> > 2014-09-10 19:39 GMT-03:00 Samir Oliveira Costa <sysleilao em gmail.com>:
> >
> >> Amigos, uso DELPHI7 e FIREBIRD 2.5 (ultima versão) Estou tendo muita
> lentidão em uma sql, copiei ela abaixo. As ligações, são feitas em com os
> indices corretos. O Resultado é muito pequeno menos de 300 registros. A
> função lista não atrapalha, testei sem ela. Detalhe preciso de todos os
> campos que estao na sql. O que posso estar fazendo errado? SELECT
> lo.FIL_CODIGO, lo.LEI_CODIGO, lo.LOT_LOTE, lo.LOT_QTD, lo.LOT_PESOMEDIO,
> lo.LOT_TIPO, lo.LOT_ORDEM, lo.LOT_MEDIA, lo.LOT_TOTAL, lo.LOT_LANCE,
> lo.LOT_DEFESA, lo.LOT_DESCPROGRESSIVO, lo.LOT_CANAL, lo.LOT_ESPECIE,
> lo.LOT_DATAATUALIZACAO, lo.LOT_PULAPAGINA, lo.LOT_CAPTACAO,
> lo.LOT_VENFICTICIO, lo.LOT_COMFICTICIO, lo.CON_CODIGO, lo.LOT_OBS,
> lo.LOT_COMVENDA, lo.LOT_EOUVENDA, lo.LOT_TAXAVENDA, lo.LOT_COMCOMPRA,
> lo.LOT_EOUCOMPRA, lo.LOT_TAXACOMPRA, lo.LOT_COMDEFESA, lo.LOT_EOUDEFESA,
> lo.LOT_DIFERENCIADO, lo.LOT_TAXADEFESA, lo.LOT_BOLETA, lo.USU_CODIGO,
> lo.CODIGO, lo.LOT_PRAZO, lo.LOT_SAIPESO, lo.LOT_EMBARQUE, LIST(DISTINCT
> tc1.CLI_NOME, '/') VENDEDOR, list(DISTINCT tc2.CLI_NOME, '/') COMPRADOR
> FROM TABLOTES lo LEFT JOIN VENDEDORES ven ON (ven.LEI_CODIGO =
> lo.LEI_CODIGO AND ven.LOT_LOTE = lo.LOT_LOTE) LEFT JOIN TABCLIENTES tc1 ON
> (tc1.CLI_CODIGO = ven.CLI_CODIGO) LEFT JOIN COMPRADORES com ON
> (com.LEI_CODIGO = lo.LEI_CODIGO AND com.LOT_LOTE = lo.LOT_LOTE) LEFT JOIN
> TABCLIENTES tc2 ON (tc2.CLI_CODIGO = com.CLI_CODIGO) WHERE lo.LEI_CODIGO =
> '300814100904820' GROUP BY lo.FIL_CODIGO, lo.LEI_CODIGO, lo.LOT_LOTE,
> lo.LOT_QTD, lo.LOT_PESOMEDIO, lo.LOT_TIPO, lo.LOT_ORDEM, lo.LOT_MEDIA,
> lo.LOT_TOTAL, lo.LOT_LANCE, lo.LOT_DEFESA, lo.LOT_DESCPROGRESSIVO,
> lo.LOT_CANAL, lo.LOT_ESPECIE, lo.LOT_DATAATUALIZACAO, lo.LOT_PULAPAGINA,
> lo.LOT_CAPTACAO, lo.LOT_VENFICTICIO, lo.LOT_COMFICTICIO, lo.CON_CODIGO,
> lo.LOT_OBS, lo.LOT_COMVENDA, lo.LOT_EOUVENDA, lo.LOT_TAXAVENDA,
> lo.LOT_COMCOMPRA, lo.LOT_EOUCOMPRA, lo.LOT_TAXACOMPRA, lo.LOT_COMDEFESA,
> lo.LOT_EOUDEFESA, lo.LOT_DIFERENCIADO, lo.LOT_TAXADEFESA, lo.LOT_BOLETA,
> lo.USU_CODIGO, lo.CODIGO, lo.LOT_PRAZO, lo.LOT_SAIPESO, lo.LOT_EMBARQUE
> ORDER BY lo.LOT_LOTE
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br [1]) - Hospedado em www.locador.com.br
> [2]
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107 [3]
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa [4]
>
>
> Links:
> ------
> [1] http://www.firebase.com.br
> [2] http://www.locador.com.br
> [3] http://www.firebase.com.br/fb/artigo.php?id=1107
> [4] http://firebase.com.br/pesquisa
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista