[firebase-br] unico registro

Augusto junior gutopj02 em gmail.com
Qui Mar 19 12:02:13 -03 2009


nao aguentei a curiosidade.. rs

testei essa

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.codigo
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

aumentou o tempo de processamento em + de 1 minuto



2009/3/19 Augusto junior <gutopj02 em gmail.com>

> Elton....
>
> vou fazer uma cirurgia amanha ... e hoje tenho mil coisas para resolver..
> assim que eu voltar a trabalhar ... faço os testes e passo para seu e-mail
>
> valeu a força
> Augusto
>
> 2009/3/19 Elton da Motta Barbosa <embarbosa em gmail.com>
>
> 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+
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>



Mais detalhes sobre a lista de discussão lista