[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