Oracle中怎么实现虚拟索引
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Oracle中怎么实现虚拟索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.创建一个测试表testSQL> create table
千家信息网最后更新 2026年11月02日Oracle中怎么实现虚拟索引
Oracle中怎么实现虚拟索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1.创建一个测试表test
SQL> create table test as select * from dba_objects; Table created.
2.从表test查询object_name等于standard的记录
SQL> select * from test where object_name='STANDARD'; OWNER ------------------------------ OBJECT_NAME -------------------------------------------------------------------- SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE ------------------------------ ---------- -------------- ----------- CREATED LAST_DDL_TIM TIMESTAMP STATUS T G S ------------ ------------ ------------------- ------- - - - SYS STANDARD 888 PACKAGE 19-APR-10 19-APR-10 2003-04-18:00:00:00 VALID N N N OWNER ------------------------------ OBJECT_NAME -------------------------------------------------------------------- SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE ------------------------------ ---------- -------------- ------------------- CREATED LAST_DDL_TIM TIMESTAMP STATUS T G S ------------ ------------ ------------------- ------- - - - SYS STANDARD 889 PACKAGE BODY 19-APR-10 19-APR-10 2010-04-19:10:22:58 VALID N N N
3.查询上面查询的执行计划
SQL> set autotrace traceonly explain SQL> select * from test where object_name='STANDARD'; Execution Plan ---------------------------------------------------------- Plan hash value: 1357081020 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 8 | 1416 | 155 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| TEST | 8 | 1416 | 155 (1)| 00:00:02 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_NAME"='STANDARD') Note ----- - dynamic sampling used for this statement4.在表test的object_name列上创建一个虚拟索引
SQL> create index test_index on test(object_name) nosegment;Index created.
为了创建虚拟索引必须在create index语句中指定nosegment子句,并且不会创建索引段。
5.来验证虚拟索引不会创建索引段
SQL> set autotrace off SQL> select index_name from dba_indexes where table_name = 'TEST' and index_name = 'TEST_INDEX'; no rows selected SQL> col OBJECT_NAME format a20; SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX'; OBJECT_NAME OBJECT_TYPE -------------------- ------------------- TEST_INDEX INDEX
从上面的结果可以看到索引对象已经创建,但没有创建索引段。
6.重新执行sql查看创建的虚拟索引是否被使用
SQL> set autotrace traceonly explainSQL> select * from test where object_name='STANDARD'; Execution Plan ---------------------------------------------------------- Plan hash value: 1357081020 -------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 8 | 1416 | 155 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| TEST | 8 | 1416 | 155 (1)| 00:00:02 | -------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_NAME"='STANDARD') Note ----- - dynamic sampling used for this statement从上面的执行计划可以清楚地看到创建的虚拟索引并没有被使用。
7.为了能使用所创建的虚拟索引,需要将_USE_NOSEGMENT_INDEXES设置为true
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;Session altered.
8.重新执行sql查看创建的虚拟索引是否被使用
SQL> set long 900SQL> set linesize 900 SQL> select * from test where object_name='STANDARD'; Execution Plan ---------------------------------------------------------- Plan hash value: 2627321457 -------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 8 | 1416 | 5 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | TEST_INDEX | 238 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_NAME"='STANDARD') Note ----- - dynamic sampling used for this statement看完上述内容,你们掌握Oracle中怎么实现虚拟索引的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
索引
查询
内容
方法
更多
问题
面的
清楚
束手无策
为此
中指
原因
子句
对此
对象
技能
篇文章
经验
结果
行业
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网络科技
科技股互联网
互联网科技战争
互联网科技与金融科技
互联网金融公司科技
互联网科技排名
广西互联网科技公司
互联网高科技股票
互联网科技公司做什么
衡水科技产业互联网平台
千方科技属于互联网企业吗
内蒙古九一互联网科技
卓翼科技产业互联网合作
济南有互联网科技公司吗
领航科技大厦互联网公司
东营紫格互联网科技
广州燕处互联网科技有限公司
广州梦谷互联网科技有限公司领导
万物互联网智能科技
银川新华互联网科技学校是国营吗
广州为想互联网科技有限公司
互联网医疗科技
万易互联网科技有限公司
远信互联网科技
中国互联网金融科技基金
互联网科技与大数据专业
科技类公司包括互联网吗
恒生互联网科技业指数调整周期
互联网领先科技宣传片
优雇互联网科技有限公司