dbTalk Databases Forums  

Different results for the same query in 10g and 11g

comp.databases.oracle.server comp.databases.oracle.server


Discuss Different results for the same query in 10g and 11g in the comp.databases.oracle.server forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Santana
 
Posts: n/a

Default Different results for the same query in 10g and 11g - 06-27-2011 , 03:09 PM






Hi all.
I need your help for the following query that return one row in 10g
and dont return any row in 11g: I know which ther is others ways to
implement
this query but i wan understand what is wrong!


This is mysterious query :

select *
from tests a
where id=nvl(( select max(b.id)
from tests b where b.id>2
and a.id=b.id
),
1)



What i must do in 11g in order this query return data ?





There is all script and the execution plan for 10g and 11g:

create table tests (id number)

insert into tests values(1)
insert into tests values(2)

select *
from tests a
where id=nvl(( select max(b.id)
from tests b where b.id>2
and a.id=b.id
),
1)


in 10g return one row and this is the exection plan:
PLAN_TABLE_OUTPUT
SQL_ID 66rp53rd4493w, child number 0
-------------------------------------
select * from tests a where id=nvl(( select
max(b.id)
from tests b where b.id>2 and
a.id=b.id
), 1)

Plan hash value: 2928053570

-----------------------------------------------
Quote:
Id | Operation | Name | E-Rows |
-----------------------------------------------
* 1 | FILTER | | |
2 | TABLE ACCESS FULL | TESTS | 2 |
3 | SORT AGGREGATE | | 1 |
* 4 | FILTER | | |
* 5 | TABLE ACCESS FULL| TESTS | 1 |
-----------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("ID"=NVL(,1))
4 - filter(2<:B1)
5 - filter(("B"."ID"=:B1 AND "B"."ID">2))



in 11g dont return any row and this is the execution plan:


PLAN_TABLE_OUTPUT
SQL_ID 66rp53rd4493w, child number 0
-------------------------------------
select * from tests a where id=nvl(( select
max(b.id)
from tests b where b.id>2 and
a.id=b.id
), 1)

Plan hash value: 848999739

----------------------------------------------------------------------------
Quote:
Id | Operation | Name | E-Rows | OMem | 1Mem | Used-
Mem |
----------------------------------------------------------------------------
Quote:
0 | SELECT STATEMENT | | | |
|
* 1 | HASH JOIN | | 1 | 899K| 899K|
207K (0)|
2 | VIEW | VW_SQ_1 | 1 | |
|
3 | HASH GROUP BY | | 1 | 1001K|
1001K| |
* 4 | TABLE ACCESS FULL| TESTS | 1 | |
|
5 | TABLE ACCESS FULL | TESTS | 2 | |
|
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("ID"=NVL("MAX(B.ID)",1) AND "A"."ID"="ITEM_0")
4 - filter("B"."ID">2)


Regards,
Paulito Santana

Reply With Quote
  #2  
Old   
Jonathan Lewis
 
Posts: n/a

Default Re: Different results for the same query in 10g and 11g - 06-28-2011 , 03:34 AM






Two different results for the same query - they can't both be right.

It's clearly a bug in the code; you have a simple reproducible
demonstration.

Raise an SR with Oracle.

--
Regards

Jonathan Lewis
http://jonathanlewis.wordpress.com


"Santana" <paulito.santana (AT) gmail (DOT) com> wrote

Quote:
Hi all.
I need your help for the following query that return one row in 10g
and dont return any row in 11g: I know which ther is others ways to
implement
this query but i wan understand what is wrong!


This is mysterious query :

select *
from tests a
where id=nvl(( select max(b.id)
from tests b where b.id>2
and a.id=b.id
),
1)



What i must do in 11g in order this query return data ?





There is all script and the execution plan for 10g and 11g:

create table tests (id number)

insert into tests values(1)
insert into tests values(2)

select *
from tests a
where id=nvl(( select max(b.id)
from tests b where b.id>2
and a.id=b.id
),
1)


in 10g return one row and this is the exection plan:
PLAN_TABLE_OUTPUT
SQL_ID 66rp53rd4493w, child number 0
-------------------------------------
select * from tests a where id=nvl(( select
max(b.id)
from tests b where b.id>2 and
a.id=b.id
), 1)

Plan hash value: 2928053570

-----------------------------------------------
| Id | Operation | Name | E-Rows |
-----------------------------------------------
|* 1 | FILTER | | |
| 2 | TABLE ACCESS FULL | TESTS | 2 |
| 3 | SORT AGGREGATE | | 1 |
|* 4 | FILTER | | |
|* 5 | TABLE ACCESS FULL| TESTS | 1 |
-----------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("ID"=NVL(,1))
4 - filter(2<:B1)
5 - filter(("B"."ID"=:B1 AND "B"."ID">2))



in 11g dont return any row and this is the execution plan:


PLAN_TABLE_OUTPUT
SQL_ID 66rp53rd4493w, child number 0
-------------------------------------
select * from tests a where id=nvl(( select
max(b.id)
from tests b where b.id>2 and
a.id=b.id
), 1)

Plan hash value: 848999739

----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | OMem | 1Mem | Used-
Mem |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
| |
|* 1 | HASH JOIN | | 1 | 899K| 899K|
207K (0)|
| 2 | VIEW | VW_SQ_1 | 1 | |
| |
| 3 | HASH GROUP BY | | 1 | 1001K|
1001K| |
|* 4 | TABLE ACCESS FULL| TESTS | 1 | |
| |
| 5 | TABLE ACCESS FULL | TESTS | 2 | |
| |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("ID"=NVL("MAX(B.ID)",1) AND "A"."ID"="ITEM_0")
4 - filter("B"."ID">2)


Regards,
Paulito Santana

Reply With Quote
  #3  
Old   
Grzegorz
 
Posts: n/a

Default Re: Different results for the same query in 10g and 11g - 06-28-2011 , 10:27 AM



On 2011-06-27 22:09, Santana wrote:
Quote:
Hi all.
I need your help for the following query that return one row in 10g
and dont return any row in 11g: I know which ther is others ways to
implement
this query but i wan understand what is wrong!


This is mysterious query :

select *
from tests a
where id=nvl(( select max(b.id)
from tests b where b.id>2
and a.id=b.id
),
Answered at oracle-l by Timur Akhmadeev



It’s a “feature” 7215982 “unnest subquery embedded inside an expression”.
Turning it off with the _fix_control will fix it.


Regards
GG

Reply With Quote
  #4  
Old   
onedbguru
 
Posts: n/a

Default Re: Different results for the same query in 10g and 11g - 07-01-2011 , 09:07 AM



On Jun 28, 11:27*am, Grzegorz <grzegor... (AT) interia (DOT) pl> wrote:
Quote:
On 2011-06-27 22:09, Santana wrote:

Hi all.
I need your help for the following query that return one row in 10g
and dont return any row in 11g: I know which ther is others ways to
implement
this query but i wan understand what is wrong!

This is mysterious query :

select *
from tests a
where id=nvl(( select max(b.id)
* * * * * * * * *from tests b where b.id>2
* * * * * * * * *and a.id=b.id
* * * * * * *),

Answered at oracle-l by Timur Akhmadeev

It s a feature 7215982 unnest subquery embedded inside an expression .
*Turning it off with the _fix_control will fix it.

Regards
GG

Make sure you gather statistics as well.. I have seen interesting
results when there are no statistics on the table.

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.