[firebase-br] Subselects ou Left Joins

eduardo eduardo em icontroller.com.br
Qui Maio 19 21:12:29 -03 2005


Oi RAMJ

Desculpe a demora na resposta.

Estou  fazendo testes com uma tabela com 2 milhões de registros.

Bem, naturalmente vc não está querendo carregar todos ao mesmo tempo né!?
Eu tenho resultados excelentes com subselects - utilizo bastante.
Cada caso é um caso. Acho que vc deveria utilizar o IBPlanAlyzer ou 
outra ferramenta semelhante para avaliar o tempo de resposta e também a 
quantidade de leituras que cada opção te dá.
2 milhões de registros parec assustador, mas não é. Depende de quantos 
destes 2 milhões você vai trazer no teu Result Set.
Tenho aqui tabelas com 3,5 milhões de registros e, com o índice 
adequado, ele localiza um Set de 10 com a mesma (ou humanamente 
perceptível) a mesma performance.

Se o volume de linhas do ResultSet for grande, acho que os SubSelects te 
darão melhor performance, pois ele usará o índice para montar o Result e 
não terá quew ordená-lo na memória. Se for pequeno, bem, coisa pequena 
tanto faz.

Sabe aquela tabela de 3,5 milhões que eu tenho aqui? Montei um query com 
dois campos no SubSelect e o Resultado veio em 15 milisegundos num 
K8/512 com DBExpress. Claro, o DataSet é unidirecional com PackedRecords 
de 50. Verificando a quantidade de leituras em disco, logicamente, para 
cada leitura na tabela principal, ele faz duas na que tem os subselects.

O mesmo Result com LEFT JOIN está congelado enquanto te escrevo, pois 
ele vai ter que ordenar o resultado na memória e 3,5 Milhões de linhas 
na memória é bravo.

Assim, acho melhor os subselects. Só não esqueça de utilizar índices 
adeqüados na tabela secundária.

Espero ter ajudado

[]s Eduardo

> Join, o Firebird não utiliza o Plan pelo indice razao, porém usando 
> subselects, ele consegue utilizar o Plan pelo campo.
> 
> Reuber
> 
> Eduardo Jedliczka escreveu:
> 
>> Marcel,
>>
>> Nem sempre um Inner/Left/Right Join é mais rápido do que um Sub-Select...
>>
>> Há vários casos (já fizemos muitos testes por aqui) que um sub-select 
>> gera
>> um Plan muito melhor... Este abaixo aparenta ser um destes, mas como 
>> não sei
>> qual é a composição do índice "Razao" então não posso opnar muito, E 
>> também
>> não sei qual a "grandeza" das tabelas, não dá para dizer se o plan 
>> escolhido
>> pelo FB é tão pior que o desejado...
>>
>> Subselects, são mais perigosos (entenda - muito lentos) quando estão no
>> Where... Quando estão na lista de campos, o FB é bem espertinho...
>>
>> [s]
>>
>> ==========================
>> Eduardo Jedliczka
>> Gerasoft Informática
>> Apucarana - Pr
>> ==========================
>>
>> ----- Original Message ----- From: "Moked do Brasil - Marcel (Brazil)" 
>> <marcel em moked.com.br>
>> To: "FireBase" <lista em firebase.com.br>
>> Sent: Wednesday, May 18, 2005 4:26 PM
>> Subject: Re: [firebase-br] Subselects ou Left Joins
>>
>>
>>  
>>
>>> No primeiro select por ele não estar trazendo os dados corretamento pode
>>>   
>>
>> ser
>>  
>>
>>> por causa do Left Join pois isto implica que ele traga todos os dados do
>>> campo a esquerda independente do campo a direito tenta o inner join!!!
>>> E muito melhor um inner join, left join, right join do que uma SubQuery
>>>   
>>
>> pois
>>  
>>
>>> a performance obtida na SubQuery é concerteza inferior a da performance
>>>   
>>
>> com
>>  
>>
>>> Join.
>>>
>>> ----- Original Message ----- From: "RAMJ SISTEMAS & CONSULTORIA" 
>>> <jubrovolski em yahoo.com.br>
>>> To: "FireBase" <lista em firebase.com.br>
>>> Sent: Wednesday, May 18, 2005 4:10 PM
>>> Subject: [firebase-br] Subselects ou Left Joins
>>>
>>>
>>>   
>>>
>>>> Olá Pessoal
>>>>
>>>> Sei que este assunto já foi tratado aqui, mas estou num impasse.
>>>> Desenvolvi 3 sistemas grandes usando Left Joins para para o
>>>>     
>>
>> relacionamento
>>  
>>
>>>> entre as tabelas. Porém aprofundando mais meus conhecimentos, notei que
>>>>     
>>
>> o
>>  
>>
>>>> firebird não está usando o PLAN corretamente para selecionar o indice
>>>> correto para o retorno de dados.
>>>> Ex:
>>>> SELECT E.CODCLI
>>>>  , E.RAZAO
>>>>  , D.NOME
>>>> FROM CLIENTES E
>>>> left join PROPRIETARIOS D ON (D.CODPROP=E.CODPROP)
>>>> ORDER BY E.RAZAO
>>>>
>>>> mesmo existindo um indice por RAZAO o firebird não usa este indice no
>>>> PLAN.
>>>> Porém quando uso:
>>>> SELECT E.CODCLI
>>>>  , E.RAZAO
>>>>  , E.CODPROP
>>>>  , (SELECT D.NOME FROM PROPRIETARIOS WHERE D.CODPROP=E.CODPROP) AS
>>>> NOMEPROP
>>>> FROM CLIENTES E
>>>> ORDER BY E.RAZAO
>>>> o firebird utiliza o PLAN usando o indice pelo campo RAZAO
>>>>
>>>> 1ª pergunta: Posso deixar como esta o BD que este problema será
>>>> solicionado no Firebird 2.0 ou seria melhor "arrumar" tudo o que está
>>>> pronto?
>>>> 2ª pergunta: Quando realmente deverá sair a versão final do 2.0?
>>>>
>>>> Reuber
>>>>
>>>>
>>>>
>>>>
>>>> ______________________________________________
>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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
>>>>
>>>>
>>>>     
>>>
>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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
>>>
>>>
>>>   
>>
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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
>>
>> __________ Informação do NOD32 1.1100 (20050518) __________
>>
>> Esta mensagem foi verificada pelo NOD32 Sistema Antivírus
>> http://www.nod32.com.br
>>
>>
>>
>>  
>>
> 
> 
> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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
> 





Mais detalhes sobre a lista de discussão lista