Bom dia amigos!

Gostaria de tirar uma dúvida, e entender o porquê da minha experiência não ter 
o resultado esperado.

Eu estava estudando o básico de Tuning de SQL através deste livro:
http://www.americanas.com.br/produto/6834512/livros/informatica/sistemasoperacionais/livro-oracle-database-11g-sql

Pois bem... no capítulo “Ajuste de SQL” eu me deparei com o seguinte texto:

“Você deve escolher a ordem de junção em sua consulta de modo a juntar menos 
linhas nas tabelas posteriormente. Por exemplo, digamos que você estivesse 
juntando três tabelas relacionadas, chamada tab1, tab2 e tab3. Suponha que tab1 
contenha 1.000 linhas; tab2, 100 linhas; e tab3, 10 linhas. Você deve juntar 
primeiro tab1 com tab2, seguido de tab2 e tab3.”

Bom, eu já tinha noção disso há muito tempo atrás (pois um instrutor de Oracle 
já havia falado isso), porém eu nunca tinha testado para ver essa diferença na 
prática.
Ontem eu resolvi fazer uma simulação, e criei as seguintes tabelas:

Moto: 7 linhas
Pessoa: 205.000 linhas
Cidade: 1.300.000 linhas
Estado: 27 linhas

Obviamente eu populei a tabela CIDADE com muitos dados repetidos, pois não 
existem tantas cidades assim no Brasil, exatamente com a intenção de ter uma 
tabela “grande” suficiente para meu teste.
As tabelas acimas estão ordenadas conforme o relacionamento: a moto pertence a 
uma pessoa, que mora em uma cidade, que fica em um estado.

Executei as duas querys abaixo, que diferem apenas na ordem dos joins:

SELECT /*+ MONITOR*/ m.moto_nome, p.nome, c.cidade, e.estado
FROM moto m, pessoa p, cidade c, estado e
WHERE p.cidade = c.id
AND m.dono = p.pessoa_id
AND c.estado = e.est_id;

SELECT /*+ MONITOR*/ m.moto_nome, p.nome, c.cidade, e.estado
FROM moto m, pessoa p, cidade c, estado e
WHERE m.dono = p.pessoa_id
AND p.cidade = c.id
AND c.estado = e.est_id;

E então executei o SELECT DBMS_SQLTUNE.report_sql_monitor para ver o plano de 
execução das duas querys – no qual eu esperava planos diferentes.

Pois bem, tive o mesmo resultado:
SQL Plan Monitoring Details (Plan Hash Value=861704268)

O mesmo Plan Hash para as duas querys.

Fica minhas pergunta:  afinal, faz ou não faz diferença alterar a ordem dos 
JOINs dentro da cláusula WHERE?
O Oracle foi inteligente o suficiente para detectar que as duas querys trariam 
o mesmo resultado, e por isso reutilizou o plano de execução anterior?

--
Milton Bastos
www.miltonbastos.com


This message has been scanned for malware by Websense. www.websense.com


[As partes desta mensagem que não continham texto foram removidas]

Responder a