[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