[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