Oracle之利用函数索引减少递归调用
2017-10-25 16:38
363 查看
drop table t1 purge;
drop table t2 purge;
create table t1 (first_name varchar2(200),last_name varchar2(200),id number);
create table t2 as select * from dba_objects where rownum<=1000;
insert into t1 (first_name,last_name,id) select object_name,object_type,rownum from dba_objects where rownum<=1000;
commit;
create or replace function get_obj_name(p_id t2.object_id%type) return t2.object_name%type DETERMINISTIC is
v_name t2.object_name%type;
begin
select object_name
into v_name
from t2
where object_id=p_id;
return v_name;
end;
/
set linesize 1000
set autotrace traceonly
select *
from t1 where get_obj_name(id)='TEST' ;
执行计划
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 2170 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T1 | 10 | 2170 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
1057 recursive calls
0 db block gets
16007 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
404 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
create index idx_func_id on t1(get_obj_name(id));
执行计划
----------------------------------------------------------
Plan hash value: 4083325411
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 22190 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 10 | 22190 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_FUNC_ID | 4 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
404 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
解析:建函数索引以后,通过执行计划发现,1057 recursive calls递归调用没有了,
由于函数索引特性会预计算所以递归调用没有了。
drop table t2 purge;
create table t1 (first_name varchar2(200),last_name varchar2(200),id number);
create table t2 as select * from dba_objects where rownum<=1000;
insert into t1 (first_name,last_name,id) select object_name,object_type,rownum from dba_objects where rownum<=1000;
commit;
create or replace function get_obj_name(p_id t2.object_id%type) return t2.object_name%type DETERMINISTIC is
v_name t2.object_name%type;
begin
select object_name
into v_name
from t2
where object_id=p_id;
return v_name;
end;
/
set linesize 1000
set autotrace traceonly
select *
from t1 where get_obj_name(id)='TEST' ;
执行计划
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 2170 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T1 | 10 | 2170 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
1057 recursive calls
0 db block gets
16007 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
404 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
create index idx_func_id on t1(get_obj_name(id));
执行计划
----------------------------------------------------------
Plan hash value: 4083325411
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 22190 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 10 | 22190 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_FUNC_ID | 4 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
404 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
解析:建函数索引以后,通过执行计划发现,1057 recursive calls递归调用没有了,
由于函数索引特性会预计算所以递归调用没有了。
相关文章推荐
- 利用函数递归调用实现汉诺塔
- 学习到栈的时候,利用函数递归调用解决汉诺塔
- oracle 使用rownum减少自定义函数的调用
- 【Oracle 11g】利用基于函数的索引只对部分行建立索引
- Oracle index】SQL语句利用函数索引注意点
- C语言的函数,还有递归调用
- 函数的递归调用:age(n)=10(n=1); age(n)=age(n-1)+2(n>1)
- Oracle 利用管道函数(pipelined)实现高性能大数据处理
- oracle---给表创建函数索引
- 爬楼梯——递归与函数自调用算法
- 利用Oracle内置分析函数进行高效统计汇总
- 利用with关键字实现数据查询的递归调用
- 利用backtrace和backtrace_symbols打印函数的调用关系
- 汇编语言函数调用小结及缓冲区溢出的利用
- 在PB中利用ORACLE的替换函数REPLACE
- oracle调用存储过程和函数返回结果集
- 函数的递归调用实例
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 笔记-<函数的递归调用>
- 函数的递归调用