[firebase-br] unico registro

Elton da Motta Barbosa embarbosa em gmail.com
Qui Mar 19 10:51:54 -03 2009


olá augusto,

Pelo visto demorou menos q o anterior (sem o campodata+0) certo?
  Caso afirmativo isso é pq o índice nesse campo na verdade está
atrasando a pesquisa e/ou a ordenação dos dados...
Faz uma pesquisa sobre índices em campos do tipo date tem alguma coisa
em algum lugar q eu num lembro onde ;)

Como tinha dito antes, postei uma dúvida desse SQL no FB support group
visto q vou precisar de um SQL parecido num projeto novo (embora no
meu caso acho q vou ficar com a outra alternativa). O Tysvær me
respondeu algo como segue (apenas adaptei pro seu BD)


select C.nome, SS.*, (current_date - SS.vencimento) as atraso
from clientes C
inner join ctreceber SS on C.codigo = SS.cliente
where SS.VENCIMENTO < current_date
and SS.SITUACAO = 'D'
and not exists(select null
from ctreceber stemp
where stemp.cliente = C.ID
and stemp.SITUACAO = 'D'
and (stemp.VENCIMENTO < ss.VENCIMENTO
or (stemp.VENCIMENTO = ss.VENCIMENTO
and stemp.rdb$db_key < ss.rdb$db_key)))
order by C.nome

Algumas considerações que ele passou (mal-traduzido por mim , e
adaptado para o seu BD  :o)-:

"A parte do NOT EXISTS assegura que apenas um registro com o mais
antigo vencimento entre no resultado.
Se os clientes nunca compram duas vezes no mesmo dia, então vc não
precisa do OR."
... acho q não podemos garantir isso né?

"Normalmente usaria a Chave primaria no lugar de rdb$db_key, mas não
sei se tem uma chave primaria e usando rdb$db_key deve ser ao menos
tão rápido quanto."
... Faça um teste substituindo stemp.rdb$db_key pelo campo
stemp.registro. continuando...

"(...)
Acredito q seja mais rápido q seu SQL (você pode querer adicionar +0
para stemp.Vencimento para otimizar(...)"

... então mais uma sugestão (parecida com a que passei)...
alterar de
"and (stemp.VENCIMENTO < ss.VENCIMENTO
or (stemp.VENCIMENTO = ss.VENCIMENTO "
para
"and (stemp.VENCIMENTO+0 < ss.VENCIMENTO
or (stemp.VENCIMENTO+0 = ss.VENCIMENTO "

Se puder fazer essas alterações e testes (um por um e eles em
combinações) e mandar os resultados (e cada plan tb :).
Aqui eu executei e não deu muita diferença pq o meu BD atual não é
grande e nem tenho um indice no campo Vencimento...

espero q ajude

t+




Mais detalhes sobre a lista de discussão lista