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]