[firebase-br] Ajuda para entender um Plan

Forrest® fernando.bg em gmail.com
Qui Out 4 21:24:58 -03 2007


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+++++++++++++++++++++
-- 






Mais detalhes sobre a lista de discussão lista