Akira
Realmente parece ser um bug.
Reproduzi seus testes. Mesmo coletando estatísticas da tabela PEDIDO, o
otimizador continuou gerando um plano equivocado.
Na consulta com o hint "rule", o plano gerado apresenta um critério de
filtro:
filter( (SELECT SUM(100) FROM "SYS"."DUAL" "DUAL" WHERE :B1=204144)=0)
Porém na consulta original, não consta esse filtro no plano.
Fui simplificando a instrução para tentar achar uma causa.
Ao que parece, a subquery na lista de colunas provocou isso (ou melhor, fez
manifestar esse bug da versão).
Substituindo o SUM(100) por 100, o problema continuou... mas ao fazer a
seguinte consulta, sem essa subquery, aí executou corretamente:
SQL> SELECT V.*
2 FROM (SELECT I.SEQUENCIAL_PEDIDO, SUM(I.VALOR) QUANTIDADE_PEDIDO, 100
QUANTIDADE_PESO
3 FROM PEDIDO I
4 WHERE I.SEQUENCIAL_PEDIDO IN (SELECT 204144 FROM DUAL)
5 GROUP BY I.SEQUENCIAL_PEDIDO
6 ) V
7 WHERE V.QUANTIDADE_PESO = 0
8 /
não há linhas selecionadas
Teria que procurar no Metalink se há registro desse bug e o respectivo patch
de correção.
Senão teria de abrir um chamado de suporte.
Talvez haja alguma informação em fóruns se procurar por "bug subquery 10g",
ou algo assim.
Mais tarde, se achar alguma informação, postarei aqui.
Boa sorte!
[ ]
André
2009/12/10 Akira <[email protected]>
>
>
> A versão pode ser para Linux OEL 32 ou 64 bits ou Windows também, testei em
> 10.2.0.4.0 e em 10.2.0.3.0, ambas deram problema.
>
> Na versão 9.2.0.4 não acontece, eu fiz o mesmo teste.
>
> Eu não entendo onde está o problema, se é com o IN ou com view inline
> relacionada com a tabela mais externa ou subselect idem. Só chego a
> conclusão que deve ser um bug, mas eu não sei nem como procurar por uma
> solução em patch para isso.
>
> Alguém já deve ter passado por isso, se puderem me ajudar, o exemplo está
> abaixo. Não se importem muito com a lógica, esse select é só uma reprodução
> do meu problema, onde usei uma tabela e o resto substituí por dual colocando
> valores fixos. O problema é a condição QUANTIDADE_PESO = 0 que deveria ser
> false, pois a coluna está com valor 100, parece que é ignorada.
>
> Comandos para reproduzir o problema:
>
> CREATE TABLE PEDIDO (sequencial_pedido NUMBER, valor NUMBER);
> INSERT INTO PEDIDO VALUES (204144, 1);
> COMMIT;
> SELECT V.*
> FROM (SELECT I.SEQUENCIAL_PEDIDO,
> SUM(I.VALOR) QUANTIDADE_PEDIDO,
> (SELECT SUM(100)
> FROM DUAL
> WHERE I.SEQUENCIAL_PEDIDO = 204144) QUANTIDADE_PESO
> FROM PEDIDO I
> WHERE I.SEQUENCIAL_PEDIDO IN (SELECT 204144 FROM DUAL)
> GROUP BY I.SEQUENCIAL_PEDIDO
> ) V
> WHERE V.QUANTIDADE_PESO = 0 -- essa condição não funciona
> ;
> SELECT /*+ RULE*/ V.*
> FROM (SELECT I.SEQUENCIAL_PEDIDO,
> SUM(I.VALOR) QUANTIDADE_PEDIDO,
> (SELECT SUM(100)
> FROM DUAL
> WHERE I.SEQUENCIAL_PEDIDO = 204144) QUANTIDADE_PESO
> FROM PEDIDO I
> WHERE I.SEQUENCIAL_PEDIDO IN (SELECT 204144 FROM DUAL)
> GROUP BY I.SEQUENCIAL_PEDIDO
> ) V
> WHERE V.QUANTIDADE_PESO = 0 --com hint rule funciona
> ;
>
> Executando os comandos acima:
>
> Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
>
> Connected as AKIRA
>
> SQL>
>
> SQL> CREATE TABLE PEDIDO (sequencial_pedido NUMBER, valor NUMBER);
>
> Table created
>
> SQL> INSERT INTO PEDIDO VALUES (204144, 1);
>
> 1 row inserted
>
> SQL> COMMIT;
>
> Commit complete
>
> SQL> SELECT V.*
>
> 2 FROM (SELECT I.SEQUENCIAL_PEDIDO,
>
> 3 SUM(I.VALOR) QUANTIDADE_PEDIDO,
>
> 4 (SELECT SUM(100)
>
> 5 FROM DUAL
>
> 6 WHERE I.SEQUENCIAL_PEDIDO = 204144) QUANTIDADE_PESO
>
> 7 FROM PEDIDO I
>
> 8 WHERE I.SEQUENCIAL_PEDIDO IN (SELECT 204144 FROM DUAL)
>
> 9 GROUP BY I.SEQUENCIAL_PEDIDO
>
> 10 ) V
>
> 11 WHERE V.QUANTIDADE_PESO = 0 -- essa condição não funciona,
> quantidade_peso é 100
>
> 12 ;
>
> SEQUENCIAL_PEDIDO QUANTIDADE_PEDIDO QUANTIDADE_PESO
>
> ----------------- ----------------- ---------------
>
> 204144 1 100
>
> SQL> SELECT /*+ RULE*/ V.*
>
> 2 FROM (SELECT I.SEQUENCIAL_PEDIDO,
>
> 3 SUM(I.VALOR) QUANTIDADE_PEDIDO,
>
> 4 (SELECT SUM(100)
>
> 5 FROM DUAL
>
> 6 WHERE I.SEQUENCIAL_PEDIDO = 204144) QUANTIDADE_PESO
>
> 7 FROM PEDIDO I
>
> 8 WHERE I.SEQUENCIAL_PEDIDO IN (SELECT 204144 FROM DUAL)
>
> 9 GROUP BY I.SEQUENCIAL_PEDIDO
>
> 10 ) V
>
> 11 WHERE V.QUANTIDADE_PESO = 0 --com hint rule funciona
>
> 12 ;
>
> SEQUENCIAL_PEDIDO QUANTIDADE_PEDIDO QUANTIDADE_PESO
>
> ----------------- ----------------- ---------------
>
> SQL>
>
> Desde já agradeço, obrigado.
>
> AKIRA
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/[email protected]/
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure »
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE:
>http://www.oraclebr.com.br/
------------------------------------------------------------------------------------------------------------------------
Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/
<*> Para sair deste grupo, envie um e-mail para:
[email protected]
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html