自定义函数索引deterministic减少函数调用次数-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1156192
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3760
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

about me:oracle ace pro,optimistic,passionate and harmonious. focus on oracle,mysql and other database programming,peformance tuning,db design, j2ee,linux/aix,architecture tech,etc

文章分类

全部博文(166)

文章存档

2024年(21)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2023-05-09 23:07:29

1)deterministic不建立索引,缓存无效,执行的时候还是调用函数,
--自定义函数,要建立索引,必须有deterministic关键字,否则不确定不可以
dingjun123@oradb> create or replace function func_tt(x in varchar2)
  2      return varchar2 deterministic
  3    as
  4     begin
  5       dbms_application_info.set_client_info(userenv('client_info') 1 );
  6     return 'a'||x;
  7    end;
  8   /


函数已创建。


已用时间:  00: 00: 00.26
dingjun123@oradb> drop table t;


表已删除。


已用时间:  00: 00: 01.62
dingjun123@oradb>  create table t(m varchar2(100) not null);


表已创建。


已用时间:  00: 00: 00.37
dingjun123@oradb>  insert into t select level from dual connect by level<1000;


已创建999行。


已用时间:  00: 00: 00.04
dingjun123@oradb> commit;


提交完成。


已用时间:  00: 00: 00.04
dingjun123@oradb> exec dbms_application_info.set_client_info(0);


pl/sql 过程已成功完成。


已用时间:  00: 00: 00.00
dingjun123@oradb> select userenv('client_info') from dual;


userenv('client_info')
----------------------------------------------------------------
0


已选择 1 行。


已用时间:  00: 00: 00.01
dingjun123@oradb> select * from t where func_tt(m)='a2';


m
----------------------------------------------------------------------------------------------------
2


已选择 1 行。


已用时间:  00: 00: 00.04
dingjun123@oradb> select userenv('client_info') from dual;


userenv('client_info')
----------------------------------------------------------------
999


已选择 1 行。


已用时间:  00: 00: 00.01
dingjun123@oradb> select * from t where func_tt(m)='a2';


m
----------------------------------------------------------------------------------------------------
2


已选择 1 行。


已用时间:  00: 00: 00.03
dingjun123@oradb> select userenv('client_info') from dual;


userenv('client_info')
----------------------------------------------------------------
1998


已选择 1 行。


已用时间:  00: 00: 00.00




2.deterministic 索引才能缓存,执行的时候不再调用函数
dingjun123>create or replace function func_tt(x in varchar2)
  2      return varchar2 deterministic
  3      as
  4      begin
  5      dbms_application_info.set_client_info(userenv('client_info') 1 );
  6       return 'a'||x;
  7      end;
  8  /


函数已创建。


dingjun123> drop table t;


表已删除。


dingjun123> create table t(m varchar2(100) not null);


表已创建。


dingjun123> insert into t select level from dual connect by level<1000;


已创建999行。


dingjun123> commit;


提交完成。


dingjun123>exec dbms_application_info.set_client_info(0);


pl/sql 过程已成功完成。


dingjun123>create index idx_t on t (func_tt(m));


索引已创建。


dingjun123> exec    dbms_stats.gather_table_stats(user,'t',cascade => true);


pl/sql 过程已成功完成。


--这里创建索引,函数就被调用很多次了




dingjun123> select userenv('client_info') from dual;


userenv('client_info')
---------------------------------------------------------------------------------------------------------
5994


已选择 1 行。




dingjun123> select * from t where func_tt(m)='a2';


m
---------------------------------------------------------------------------------------------------------
2


已选择 1 行。


--不需要再调用函数


dingjun123> select userenv('client_info') from dual;


userenv('client_info')
---------------------------------------------------------------------------------------------------------
5994


已选择 1 行。

阅读(440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图