[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