[firebase-br] Ajuda para entender um Plan
Eduardo Pelizzari de Andrade
eduardoandrade em persoft.com.br
Sex Out 5 09:52:15 -03 2007
Como você não faz nenhum filtro no where para a tabela cr ele não pega
índice nenhum. Se você fizer Cr.tipo=:tipo ou ainda tipo=:tipo and
Cr.documento=:documento ele irá pegar a chave primária da CR.
Kleber Caneva escreveu:
> Isso ocorre porque na sua tabela de CONTAS_RECEBER seus indices são
> compostos, sendo o primeiro campo o TIPO e despois o DOCUMENTO.
>
> No Order By vc está definindo para ordenar por DOCUMENTO, então ele não tem
> indice por esse campo para usar.
>
> Para utilizar incide, vc deveria colcoar o TIPO no Order by antes do
> DOCUMENTO, ou ainda, criar um indice só do campo documento.
>
> Eu particularmente não gosto de trabalhar com indices compostos.
>
> []´s
>
> Kléber Caneva
>
> ----- Original Message -----
> From: "Forrest®" <fernando.bg em gmail.com>
> To: <lista em firebase.com.br>
> Sent: Thursday, October 04, 2007 9:24 PM
> Subject: [firebase-br] Ajuda para entender um Plan
>
>
> Pessoal primeiramente desculpe por ficar meio extenso o post, mas
> gostaria só de entender o plan gerado vou colocar a estrutura de chaves
> das tabelas e o sql que tenho para ver se alguem pode me ajudar.
>
> TABELAS
>
> CONTAS_RECEBER CONTAS_RECEBER_PARCELAS CONTAS_RECEBIDAS CLIENTES
> ----------------------------------------------------------------------
> TIPO TIPO TIPO COD_CLIENTE
> DOCUMENTO DOCUMENTO DOCUMENTO
> PARCELA PARCELA
> SEQUENCIA
>
> PK DE CONTAS_RECEBER (TIPO, DOCUMENTO)
> PK DE CONTAS_RECEBER_PARCELAS(TIPO, DOCUMENTO, PARCELA)
> PK DE CONTAS_RECEBIDAS(TIPO, DOCUMENTO, PARCELA, SEQUENCIA)
> FK DE CONTAS_RECEBER_PARCELAS PARA CONTAS_RECEBER(TIPO, DOCUMENTO)
> FK DE CONTAS_RECEBIDAS PARA CONTAS_RECEBER_PARCELAS(TIPO, DOCUMENTO,
> PARCELA)
> FK DE CONTAS_RECEBER PARA CLIENTES(COD_CLIENTE)
>
>
> A sentença SQL é a seguinte :
>
>
> SELECT CR.TIPO, CR.DOCUMENTO, CRP.PARCELA, CR.COD_CLIENTE,
> C.RAZAO_SOCIAL, CRP.DATA_EMISSAO, CRP.DATA_VENCIMENTO,
> CRP.VALOR_PARCELA,
> COALESCE((CRP.VALOR_PARCELA - SUM(CRB.VALOR_RECEBIDO)),
> CRP.VALOR_PARCELA) AS VALOR_RECEBER,
> CASE CR.TIPO
> WHEN 0 THEN 'LOCACAO'
> WHEN 1 THEN 'MANUAL'
> END AS DESCRTIPO
> FROM CONTAS_RECEBER CR LEFT OUTER JOIN CONTAS_RECEBER_PARCELAS CRP ON (
> (CR.TIPO = CRP.TIPO )
> AND
> (CR.DOCUMENTO = CRP.DOCUMENTO))
> LEFT OUTER JOIN CONTAS_RECEBIDAS CRB ON (
> (CRP.TIPO = CRB.TIPO )
> AND
> (CRP.DOCUMENTO = CRB.DOCUMENTO)
> AND
> (CRP.PARCELA = CRB.PARCELA ))
> LEFT OUTER JOIN CLIENTES C ON (CR.COD_CLIENTE =
> C.COD_CLIENTE)
> WHERE (CRP.DATA_EMISSAO BETWEEN '01/01/2006' AND '12/31/2008')
> GROUP BY CR.TIPO, CR.DOCUMENTO, CRP.PARCELA, CR.COD_CLIENTE,
> C.RAZAO_SOCIAL, CRP.DATA_EMISSAO,
> CRP.DATA_VENCIMENTO, CRP.VALOR_PARCELA
> HAVING (SUM(CRB.VALOR_RECEBIDO) < CRP.VALOR_PARCELA) OR
> (SUM(CRB.VALOR_RECEBIDO) IS NULL)
> ORDER BY CR.DOCUMENTO, CRP.PARCELA
>
>
> O Plan gerado pelo IBExpert é o seguinte:
>
>
> Plan
> PLAN SORT (SORT (JOIN (JOIN (JOIN (CR NATURAL, CRP INDEX
> (FK_CONTASRECEBER_DOCUMENTO)), CRB INDEX
> (FK_CONTASRECEBIDAS_DOCUMENTO)), C INDEX (PK_CLIENTES))))
>
> Adapted Plan
> PLAN SORT (SORT (JOIN (JOIN (JOIN (CR NATURAL, CRP INDEX
> (FK_CONTASRECEBER_DOCUMENTO)), CRB INDEX
> (FK_CONTASRECEBIDAS_DOCUMENTO)), C INDEX (PK_CLIENTES))))
>
> A minha duvida é o seguinte, na tabela de contas_receber alias CR não
> deviria usar a PK ? Porque será que pegou natural?
> O SQL está funcionando certinho seria só duvida mesmo, e se isso pode
> influenciar na performance. Desde já obrigado a quem puder esclarecer.
>
> T+++++++++++++++++++++
>
--
Eduardo Pelizzari de Andrade
Persoft Softwares Aplicativos
Fone: 55 11 62218061
Mais detalhes sobre a lista de discussão lista