[firebase-br] Performace em SQL.

Edson Marco edmafer em gmail.com
Qua Nov 9 16:03:45 -03 2011


Primeira coisa... idente o negócio (mesmo se for só no email) é difícil até
para você entender sem identar.

Segundo, pode haver vendas sem itens de vendas? Se não, troque os left por
inner que vai melhorar seu desempenho.

Terceiro, se você fez muitas alterações nos dados do seu banco refaça
as estatística dos índices, mesmo se você criou um índice novo o firebird
não vai achá-lo atrativo enquanto você não refazer as estatísticas
dos índices (um gbak & restore resolve isto)

Quarto revise seus filtros e ligações de tabelas... realmente é preciso
todas estas ligações? É realmente necessário esta union?

Quanto ao quarto item se forem absurdas minhas perguntas simplesmente
ignore-as pois não li seu select a ponto de entender o que ele realmente
tenta fazer.

[]'s

2011/11/9 Pedro Braga <bragaped em gmail.com>

> Boa Tarde,
>  Tenho a SQL Abaixo para Listar os Itens Vendidos em um totalizador por
> pedido.
> select
>
> v.num_pedido,i.num_item,v.dat_inclusao,v.forma_pagamento,i.cod_produto,i.descricao,i.quantidade,i.vlr_unitario,i.vlr_total
> from vendas v left outer join item_venda i on v.num_pedido = i.num_pedido
> and v.cod_empresa=i.cod_empresa and v.num_terminal=i.num_terminal
> where  v.cod_cliente = :cod and v.cod_empresa_cliente = :cod_emp_cli and
> v.COD_SITUACAO=1 and v.cod_empresa=:cod_empresa
> union all
> select i.num_pedido,cast(9999 as integer) as
> num_item,v.dat_inclusao,cast('' as varchar(3)),cast(0 as integer) as
> cod_produto,cast('TOTAL --->' as varchar(60)) as descricao,cast(0 as
> numeric(15,2)) as quantidade,cast(0 as numeric(15,2)),SUM(i.vlr_total) as
> vlr_total
> from vendas v left outer join item_venda i on v.num_pedido = i.num_pedido
> and v.cod_empresa=i.cod_empresa and v.num_terminal=i.num_terminal
> where  i.cod_cliente = :cod and i.cod_empresa_cliente = :cod_emp_cli and
> i.COD_SITUACAO=1 and i.cod_empresa=:cod_empresa
> group by 1,3
> order by 3 desc,1,2
>
> o Plano de execução do mesmo
> Plan
> PLAN JOIN (V INDEX (FK_VENDAS_2, FK_VENDAS_1), I INDEX
> (FK_ITEM_VENDA_EMPRESA, PK_ITEM_VENDA))
> PLAN SORT (JOIN (V INDEX (FK_VENDAS_2, FK_VENDAS_1), I INDEX
> (FK_ITEM_VENDA_EMPRESA, PK_ITEM_VENDA)))
>
> Adapted Plan
> PLAN JOIN (V INDEX (FK_VENDAS_2, FK_VENDAS_1), I INDEX
> (FK_ITEM_VENDA_EMPRESA, PK_ITEM_VENDA)) PLAN SORT (JOIN (V INDEX
> (FK_VENDAS_2, FK_VENDAS_1), I INDEX (FK_ITEM_VENDA_EMPRESA,
> PK_ITEM_VENDA)))
>
> conduto a pesquisa está levando cerda de 20 minutos em sendo que a tabela
> vendas possui uma media de 40 mil registros e a de itens cerca de 90 mil
> como a massa de dados não é tão espresiva assim gostaria de orientações
> para para melhorar a performace do select
>
> Exemplo do resultado
> Pedido  Código      Descrição Produto    Qtde  Valor   ***
> 15           1                  testes                           1
> 5,00
> 15          2                  coca-cola                    5
>  50,00
>                                    total  --->
>    55,00
> 16           15                enrolado                     1          1,75
> 16          23                 suco uva                    2           2,50
>                                    total  --->
>     4,25
> ______________________________________________
> 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
>



-- 
/*
 * Edson Marco Ferrari Junior
 * edmafer em edmafer.com.br
 * http://www.edmafer.com.br
 */



Mais detalhes sobre a lista de discussão lista