“Rafael Afonso”:
Olá:
Suponham as seguintes queries dentro do Oracle:
Query 1:
SELECT * FROM pessoa, casa
WHERE pessoa.nome like 'A%' AND casa.codigo = pessoa.endereco AND casa.estado = 'SP'
Query 2:
SELECT * FROM pessoa, casa
WHERE casa.estado = 'SP' AND pessoa.endereco = casa.codigo AND pessoa.nome like 'A%'
:?: A ordem das clausulas where afetará a forma como a busca é feita (acho que sim)? Ou seja: na Query 1 buscar-se-á primeiro por nome de pessoa e depois por estado de casa e na Query 2 buscar-se-á primeiro por estado de casa e depois por nome de pessoa (também acho que sim)? Se tivermos 200.000 pessoas e 2.000 casas, então a query 1 será mais lenta que a query 2? Ou o Oracle fará alguma otimização?
Grato,
As duas queries são diferentes, apesar de produzirem resultados iguais.
Mas a maioria dos RDBMSs fazem otimizações, como, por exemplo, remover a condição casa.codigo = pessoa.endereco da sua cláusula WHERE, transformando-a em um Inner Join (… casa c inner join pessoa p on c.codigo = p.endereco …).
[editado]
Opa, o Oracle não possui “Inner Join” :roll: .
Bom, o que seu banco de dados faz ao executar a primeira query
SELECT * FROM pessoa, casa
WHERE pessoa.nome like 'A%' AND casa.codigo = pessoa.endereco AND casa.estado = 'SP'
é filtrar as pessoas cujo nome comece com a letra “A” e fazer um produto cartesiano com a tabela “CASA”, segundo a condição de junção.
Já a segunda query
SELECT * FROM pessoa, casa
WHERE casa.estado = 'SP' AND pessoa.endereco = casa.codigo AND pessoa.nome like 'A%'
filtra as casas que ficam no estado de São Paulo e faz um produto cartesiano com a tabela “PESSOA”.
A mais rápida será aquela que conseguir fazer o produtor cartesiano mais rápido, ou seja, aquela que retornar menos tuplas no primeiro filtro.
[/editado]