设为首页 加入收藏

TOP

11g新特性_索引的可见与不可见
2015-07-24 11:45:18 来源: 作者: 【 】 浏览:2
Tags:11g 特性 索引 可见

当你想评估一个索引对你SQL查询语句的影响时,恰巧你的数据库是11g时候,可以快速将索引设置成VISIBLE或INVISIBLE。值得称赞的时,当索引被设置成INVISIBLE时候,DML语句发生时候照常会维护索引,也就是说处于INVISIBLE状态下的索引并不失效,只是优化器不选择索引路径而已。

下面通过实验来验证一下:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE	11.2.0.4.0	Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> select * from t;

	ID
----------
	 2
	11
	22
	 1
	33
SQL> select count(id) from t;

 COUNT(ID)
----------
	 5


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |	1 |	3 |	2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |	  |	1 |	3 |	       |	  |
|   2 |   TABLE ACCESS FULL| T	  |	5 |    15 |	2   (0)| 00:00:01 |--可以看到此时是全表扫描

在T表ID列创建唯一索引?

SQL> create unique index idx_t_id on t(id) invisible;

Index created.

SQL> select count(id) from t; COUNT(ID) ---------- 5 Execution Plan ---------------------------------------------------------- Plan hash value: 4168287108 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 3 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 3 | | | | 2 | INDEX FULL SCAN| IDX_T_ID | 5 | 15 | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------- --发生索引全扫描

将索引设置成INVISIBLE

SQL> alter index idx_t_id invisible;
 
Index altered

SQL> select index_name,status,visibility from dba_indexes where table_name='T'; ? INDEX_NAME???????????????????? STATUS?? VISIBILITY ------------------------------ -------- ---------- IDX_T_ID?????????????????????? VALID??? INVISIBLE

SQL> select count(id) from t;

?COUNT(ID) ---------- ? 5

Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522

--------------------------------------------------------------------------- | Id? | Operation??? | Name | Rows? | Bytes | Cost (%CPU)| Time?? | --------------------------------------------------------------------------- |?? 0 | SELECT STATEMENT?? |?? |?1 |?3 |?2?? (0)| 00:00:01 | |?? 1 |? SORT AGGREGATE??? |?? |?1 |?3 |??????? |?? | |?? 2 |?? TABLE ACCESS FULL| T?? |?5 |??? 15 |?2?? (0)| 00:00:01 | --此时执行计划里又是走全表扫描路径 ---------------------------------------------------------------------------

SQL> alter index idx_t_id visible; ? Index altered

索引的不可见可以避免了索引重建,尤其是大表的索引,这个新特性更有利于数据库的优化?

-------------------------------------------------------------------------------------------------

本文来自于我的技术博客 http://blog.csdn.net/robo23

转载请标注源文链接,否则追究法律责任!

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle用户的创建和删除 下一篇oracle11gOEM无法连接到数据库实..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)