[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