[firebase-br] Subselects ou Left Joins

eduardo eduardo em icontroller.com.br
Qui Maio 19 21:26:50 -03 2005


Só para complementar:

Acabo de fazer os mesmos testes com FB 2.0 e o otimizador já utiliza 
índices para ordenar, mesmo com LEFT JOINS. A diferença é brutal com 
relação ao FB 1.5.2;

Desta forma, neste caso específico, no 2.0 será melhor utilizar o LEFT 
JOIN do que o SUBSELECT, já que a quantidade de leituras é 1:1 e ele não 
precisa carregar todo o RESULTSET na memória para depois ordenar.

As melhoras do otimizador no 2.0 não são apenas boatos. Acabo de 
comprovar sua veracidade.

Viva , Viva !!!

[]s Eduardo

eduardo wrote:
> 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
>>
> 
> 
> ______________________________________________
> 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