有人说,同一SQL运行多次,如果每次走的执行计划不一样,则child_number不同。但我试验了,好像不是这么回事。
##建立测试表
create table test (id integer, cc varchar2(10));
SQL> insert into test select level,'abc'||to_char(mod(level,4)) from dual connect by level <100001;
100000 rows created.
SQL> commit;
##收集统计信息
SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname => null,tabname => 'TEST',cascade => true);
PL/SQL procedure successfully completed.
##运行SQL,走全表扫描
select id from test where id between 20 and 200;
...
##查SQL_ID
select sql_id,sql_text from v$sql where sql_text like '%test where id between 20 and 200%'
and sql_text not like '%v$sql%' and parsing_user_id=(select user_id from dba_users where username=user) order by 1;
SQL_ID SQL_TEXT
-------------------- ----------------------------------------------------------------------------
c8yqbpvr56cjc select id from test where id between 20 and 200
##查对应的child_number, 是0
SQL> select distinct hash_value,child_number from v$sql_plan where sql_id='c8yqbpvr56cjc';
HASH_VALUE CHILD_NUMBER
---------- ------------
3998429740 0
##建立索引
SQL> create index idx_id on test(id);
Index created.
##收集统计信息
SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname => null,tabname => 'test',cascade => true);
PL/SQL procedure successfully completed.
##再次运行SQL,必然走索引扫描
select id from test where id between 20 and 200;
...
##再查child_numger, 仍然是0,两次运行执行计划不同,为何child_number没变化:
SQL> select distinct hash_value,child_number from v$sql_plan where sql_id='c8yqbpvr56cjc';
HASH_VALUE CHILD_NUMBER
---------- ------------------
3998429740 0
