基于函数的索引
来源:互联网 发布:短信群发源码 编辑:程序博客网 时间:2024/05/17 09:09
使用基于函数的索引(BFI, Based Function Index):
从Oracle 8i开始,可以使用基于函数的索引来提高查询性能,
使用基于函数的索引,需要几个条件:
1,
2,
3,
和 query_rewrite_integrity=enforced
4,
5,创建了BFI后,需要对表进行分析
请看下面的例子:
首先,在没有建立函数索引的情况下,我们看到查询没有如我们想想一样使用单列(dname)索引:
SQL> set autotrace traceonly
SQL> select * from dept where substr(dname,1,5)='aaa';
未选定行
已用时间:
Execution Plan
----------------------------------------------------------
Statistics
----------------------------------------------------------
下面直接建立基于函数的索引,看看是否查询是否可以使用我们建立的索引
SQL> create index dept_id5 on dept(substr(dname,1,5));
create index dept_id5 on dept(substr(dname,1,5))
ERROR 位于第 1 行:
ORA-01031: 权限不足
已用时间:
SQL> set autotrace off
SQL> col username format a10
SQL> col privilege format a20
SQL> select username,privilege from user_sys_privs;
USERNAME
---------- --------------------
DEMO
PUBLIC
已用时间:
SQL> select username, granted_role from user_role_privs;
USERNAME
---------- ------------------------------
DEMO
DEMO
PUBLIC
已用时间:
我们看到,虽然用户有connect和resource角色,但是仍然没有建立函数索引的权限。
我们使用sysdba身份登陆,给demo用户授create any index 和 global query rewrite权限:
SQL> conn lunar/lunar@test1 as sysdba
已连接。
SQL> grant create any index to demo;
授权成功。
已用时间:
SQL> grant global query rewrite to demo;
授权成功。
已用时间:
SQL> conn demo/demo@test1
已连接。
SQL> select username,privilege from user_sys_privs;
USERNAME
---------- --------------------
DEMO
DEMO
DEMO
PUBLIC
已用时间:
SQL> select username, granted_role from user_role_privs;
USERNAME
---------- ------------------------------
DEMO
DEMO
PUBLIC
已用时间:
再修改系统参数,将query_rewrite_enabled设置为true,这个参数是动态参数,设置后可以有立杆见影的效果:
SQL> conn /@test1 as sysdba
已连接。
SQL> show parameter query
NAME
------------------------------------ ----------- ------------------------------
query_rewrite_enabled
query_rewrite_integrity
SQL> alter system set query_rewrite_enabled=true;
系统已更改。
已用时间:
SQL> show parameter query
NAME
------------------------------------ ----------- ------------------------------
query_rewrite_enabled
query_rewrite_integrity
好了,再使用demo用户登陆,创建函数索引
SQL> conn demo/demo@test1
已连接。
SQL>
索引已创建。
已用时间:
SQL> select index_type,index_name from user_indexes where table_name='DEPT';
INDEX_TYPE
--------------------------- ------------------------------
FUNCTION-BASED NORMAL
已用时间:
可见已经创建成功了。
下面,我们看看查询是否会使用我们创建的函数索引:
SQL> set autotrace traceonly
SQL> select * from dept where substr(dname,1,5)='aaa';
未选定行
已用时间:
Execution Plan
----------------------------------------------------------
Statistics
----------------------------------------------------------
在我们分析表之后,我们看到,查询如我们所希望的那样,使用了索引。
SQL> analyze table dept compute statistics
表已分析。
已用时间:
SQL> select * from dept where substr(dname,1,5)='aaa';
未选定行
已用时间:
Execution Plan
----------------------------------------------------------
Statistics
----------------------------------------------------------
SQL>
通过所有的statistics,我们可以清楚的看到,适当的使用索引会是性能提高几倍甚至更多。
- 基于函数的索引
- 基于函数的索引
- 基于函数的索引+创建基于函数的索引
- 【索引分类】基于函数的索引
- oracle 基于函数的索引
- 基于函数的索引浅析
- Oracle基于函数的索引
- oracle索引:B*树索引、位图索引(bitmap)、基于函数的索引、应用域索引
- oracle基于函数的索引分析
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 基于自定义函数的Function-Based索引创建
- 《Oracle编程艺术》学习笔记(33)-基于函数的索引
- 基于自定义函数的Function-Based索引创建
- oracle 性能优化操作十四: 使用基于函数的索引
- oracle 性能优化操作十四: 使用基于函数的索引
- struct stat 作用
- poj 1789 Truck History(prim)
- 学习笔记之类(三)
- 判断android图片是否硬解码(方法)
- Bellman-Ford剖析
- 基于函数的索引
- HDU 4389 X mod f(x) 数位DP
- iOS 各种控件默认高度
- seo新手怎样制作网站要具备哪些方面的知识
- C++面试宝典
- 按键数码管数值前移
- xx is not in the sudoers file 问题解决
- 站长分享网站优化都有哪些要素,要谨记三点
- 黑马程序员--Java基础加强--05.【泛型通配符】【个人总结】