暂无图片
如何理解v$sql_plan里的child_number
我来答
分享
Thomas
2024-10-13
如何理解v$sql_plan里的child_number

有人说,同一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

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
广州_老虎刘

执行计划改变, 肯定是要生成新的游标, 你这个是因为原来的child从内存清除了, 新的又从0开始了. 执行计划不变也可能生成很多子游标,比如insert values语句的执行计划不会变, 但是可能有上千个子游标.  

sql有多个游标的根本原因是不能共享了, 不能共享的原因有很多种,执行计划改变只是其中的一种, 具体你可以看看v$sql_shared_cursor

暂无图片 评论
暂无图片 有用 2
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏