
|
[oracle-l]
||
[Date Prev]
[09-2007 Date Index]
[Date Next]
||
[Thread Prev]
[09-2007 Thread Index]
[Thread Next]
bind peeking not happen in 9.2.0.8 and cause using default selectivity
- From: "LS Cheng" <exriscer@xxxxxxxxx>
- To: oracle-l <oracle-l@xxxxxxxxxxxxx>
- Date: Sun, 2 Sep 2007 10:31:32 +0200
Hi all
I have a query which involves three table joins a range predicate with dates
with bind variables. The predicate asks for a 30 minutes range data.
num_rows t1 463220
num_rows t2 15
num_rows t3 460880
var a varchar2(20)
var b number
var c varchar2(20)
var d number
exec :a := '20070801 235000'
exec :b := 31
exec :c := '20070801 235000'
exec :d := -1
alter session set nls_date_format = 'YYYYMMDD HH24MISS';
SELECT *
FROM t1, t2, t3
WHERE t1.c1 = t2.c1(+)
AND t1.c2 = t2.c2(+)
AND t1.c3 = t2.c3(+)
AND t1.date_pre >= (TO_DATE (:a) - (:b) / 1440)
AND t1.date_pre <= (TO_DATE (:c) - (:d) / 1440)
AND t1.c1 = t3.c1(+)
AND t1.c2 = t3.c2(+)
AND t1.c3 = t3.c3(+)
9.2.0.8 plan
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes
| Cost |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1158 |
313K| 849 |
|* 1 | FILTER | | |
| |
|* 2 | HASH JOIN OUTER | | 1158 |
313K| 849 |
|* 3 | HASH JOIN OUTER | | 1158 |
170K| 17 |
| 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1158 |
135K| 13 |
|* 5 | INDEX RANGE SCAN | IDX3T1 | 2084 |
| 8 |
| 6 | TABLE ACCESS FULL | T2 | 15 | 465
| 2 |
|* 7 | TABLE ACCESS FULL | T3 | 12942 |
1592K| 825 |
--------------------------------------------------------------------------------------
10.2.0.3 plan
--------------------------------------------------------------+-----------------------------------+
| Id | Operation | Name | Rows |
Bytes | Cost | Time |
--------------------------------------------------------------+-----------------------------------+
| 0 | SELECT STATEMENT | |
| | 87 | |
| 1 | FILTER | |
| | | |
| 2 | NESTED LOOPS OUTER | | 26 |
7202 | 87 | 00:00:02 |
| 3 | NESTED LOOPS OUTER | | 26 |
3926 | 26 | 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID | T1 | 26 |
3120 | 25 | 00:00:01 |
| 5 | INDEX RANGE SCAN | IDX3T1 | 26
| | 3 | 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | T2 | 1 |
31 | 1 | 00:00:01 |
| 7 | INDEX UNIQUE SCAN | PKT2 | 1
| | 0 | |
| 8 | TABLE ACCESS BY INDEX ROWID | T3 | 1 |
126 | 3 | 00:00:01 |
| 9 | INDEX RANGE SCAN | IDX4T3 | 1
| | 2 | 00:00:01 |
--------------------------------------------------------------+-----------------------------------+
As we can see the index cardinality (IDX3T1) in 9.2.0.8 is incorrect, the
selectivity used is the default because of bind variables, 0.05 * 0.05. So
it calculates a cardinality of 463220 * 0.05 * 0.05 which yields 1158 as
plan shows.
So my question is, why is the default selectivity is used? Shouldnt bind
peeking suppose to happen and get a proper selectivity? I tried restarted
the database, flushed the shared_pool, invalidated the cursor to ensure a
hard parse but no luck however in 10.2.0.3 it gets a proper
0.000055488selectivity and bind peeking happens seen from 10053 trace
file.
Thanks
--
LSC
|

|