[firebase-br] Subselects ou Left Joins

eduardo eduardo em icontroller.com.br
Qua Maio 18 17:24:11 -03 2005


Olá

> SELECT E.CODCLI
>   , E.RAZAO
>   , D.NOME
> FROM CLIENTES E
> left join PROPRIETARIOS D ON (D.CODPROP=E.CODPROP)
> ORDER BY E.RAZAO

Raramente o otimizador utilizará índices para satisfazer à cláusula 
ORDER BY. Exemplos onde ele usa são consultas do tipo
SELECT * FROM TABLE ORDER BY FIELD_X
e FIELD_X faz parte de um índice.

Se RAZAO estiver em um índice composto e ele não for o primeiro da 
chave, então praticamente não será usado.

A preferência ou prioridade para o PLAN são as JOINS e os WHERE.

Existem outras comnsiderações que o otimizador faz como, por exemplo, 
quantidade de linhas previstas no Result Set. Se for pequena ele pode 
optar pela busca natural, pois será mais rápido que alocar um índice.

A regra, pelo que tenho lido, é não forçar o PLAN (claro que há exceções).

> 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
Veja que na primeira Query vc tem duas tabelas com JOIN e nesta segunda 
um campo é SUBSELECT e só tem uma tabela na estrutura principal. É quase 
um SELECT * FROM TABLE ORDER BY FIELD.


> 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?
A menos que isto esteja reduzindo drmaticamente a performance, deixe assim.

> 2ª pergunta: Quando realmente deverá sair a versão final do 2.0?
Quando... não se sabe, mas que tem bastante melhoria no otimizador, isto 
é certo.

[]s Eduardo





Mais detalhes sobre a lista de discussão lista