Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: bind variable peeking and regular statistics gathering
yes it will
consider:
SQL> create table t as
2 select case when level < 10000 then 0 else 1 end n, level m
3 from dual
4 connect by level <= 10000;
Table created.
SQL> create index i_t on t (n) nologging;
Index created.
SQL> begin
2 dbms_stats.gather_table_stats(
3 ownname => user,
4 tabname => 't',
5 method_opt => 'for all columns size 2',
6 cascade => true,
7 no_invalidate => false
8 );
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> variable x number;
SQL> exec :x:=1;
PL/SQL procedure successfully completed.
SQL> select * from t where n=:x;
N M
---------- ----------
1 10000
SQL> select sql_id
2 from v$sql
3 where sql_text='select * from t where n=:x';
SQL_ID
QL> select *
2 from table (dbms_xplan.display_cursor('fd249hypt6ktq'));
LAN_TABLE_OUTPUT
lan hash value: 2928007915
Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |(0)| 00:00:01 |
-----------------------------------------------------------------------------------
0 | SELECT STATEMENT | | | | 2 (100)| | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 5 | 2 (0)| 00:00:01 | * 2 | INDEX RANGE SCAN | I_T | 1 | | 1
redicate Information (identified by operation id):
2 - access("N"=:X)
9 rows selected.
now change the variable value
SQL> exec :x:=0;
PL/SQL procedure successfully completed.
SQL> select * from t where n=:x;
9999 rows selected.
SQL> select sql_id
2 from v$sql
3 where sql_text='select * from t where n=:x';
SQL_ID
SQL> select *
2 from table (dbms_xplan.display_cursor('fd249hypt6ktq'));
PLAN_TABLE_OUTPUT
Plan hash value: 2928007915
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |(0)| 00:00:01 |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 5 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_T | 1 | | 1
Predicate Information (identified by operation id):
2 - access("N"=:X)
19 rows selected.
the plan is the same and there is no child cursors
SQL> begin
2 dbms_stats.gather_table_stats(
3 ownname => user,
4 tabname => 't',
5 method_opt => 'for all columns size 2',
6 cascade => true,
7 no_invalidate => false
8 );
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> select * from t where n=:x;
9999 rows selected.
SQL> select *
2 from table (dbms_xplan.display_cursor('fd249hypt6ktq'));
PLAN_TABLE_OUTPUT
Plan hash value: 1601196873
| 0 | SELECT STATEMENT | | | | 5 (100)| | |* 1 | TABLE ACCESS FULL| T | 9999 | 49995 | 5 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
1 - filter("N"=:X)
18 rows selected.
plan changed considering the new variable value
On 5/31/07, Ujang Jaenudin <ujang.jaenudin_at_gmail.com> wrote:
> all, > > i'm not sure about the relation between bind variable peeking and > invalidation in the regard of regularly gathering statistics. > > will the bind variable peeking will re-peek when invalidation occurs > after gathering statistics? > > -- > regards > ujang > -- > http://www.freelists.org/webpage/oracle-l > > >
-- Alexander Fatkulin -- http://www.freelists.org/webpage/oracle-lReceived on Thu May 31 2007 - 12:21:46 CDT
![]() |
![]() |