[firebase-br] Ajuda para entender um Plan
Kleber Caneva
kdcc em terra.com.br
Sex Out 5 09:18:01 -03 2007
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+++++++++++++++++++++
--
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/cgi-bin/imail.cgi?+_u=kdcc&_l=1,1191547739.341310.22073.aldabra.terra.com.br,6523,Des15,Des15
Mais detalhes sobre a lista de discussão lista