oracle visible,索引列的usable和visible(一)

索引是Oracle数据库中一个重要的组成部分。Oracle优化和处理很多方面都是围绕索引进行的。在Oracle11g中,索引添加了一个visible属性,来加强对索引的控制能力。今天我们来一起聊聊这个新加入的visible属性和原有的usable属性。

usable属性是Oracle一直以来控制索引效应的重要因素。索引是一种依赖数据表字段取值的对象,有效的索引需要实时维护数据与索引之间的关系。在进行数据表DML操作的时候,Oracle会自动进行数据表对应索引的更新。

如果我们将数据表特定索引属性设置为unusable,也就是取消索引的使用。那么效果会有三个:

ü在数据表进行DML操作的时候,连带的时不会对unusable属性索引进行更新的。也就是说,索引一旦被unusable,就存在和数据表索引列不对应的可能;

ü当Oracle进行执行路径生成的时候,是不会选择unusable的属性引导路径;

ü如果在SQL语句中,强制Oracle使用特定unusable的索引(比如使用hint),那么Oracle会报错说索引已经被unusable;

引起索引状态unusable的原因很多。比如直接修改alter index,将索引属性变化为unusable。还有就是进行数据表move操作,引发数据行rowid变化,此时index自动变化为unusable。还有就是如使用分区表的时候,如果创建的是全局索引,如果其中一个分区被删除,全局索引也会被unusable。

将索引恢复为正确状态,只能通过rebuild重建索引。重新收集数据表索引列的信息,重新构建索引树。

invisible从某种程度上看,和unusable有相似之处,都是一定程度上的对索引禁用。作为一个11g引入的新特性,我们一起来实验研究。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE11.2.0.1.0Production

TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0–Production

SQL> select count(*) from stktestonhand;

COUNT(*)

----------

200100

SQL> desc stktestonhand;

NameTypeNullable Default Comments

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

(无相关字段省略……)

FORMCODEVARCHAR2(255 CHAR) Y

SERIESNUMBER_FROM VARCHAR2(10 CHAR)Y

SERIESNUMBER_TOVARCHAR2(10 CHAR)Y

TICKET_QUANTITYNUMBER(19,2)Y

CREATE_USERVARCHAR2(20)Y

SEQ_NUMBERNUMBER(13)

数据表stktestonhand就是我们的实验表。数据列seriesnumber_from和seriesnumber_to是组合唯一的(业务限定),所以,构建索引对象如下:

-- Create/Recreate primary, unique and foreign key constraints

alter table STKTESTONHAND

add constraint pk_stktestonhand_seq_number primary key (SEQ_NUMBER);

-- Create/Recreate indexes

create unique index ind_stktestonhand_comp0 on STKTESTONHAND (seriesnumber_from, seriesnumber_to);

我们进行搜索查询实验。

SQL> explain plan for select * from stktestonhand where SERIESNUMBER_FROM<=lpad('10000',10,'0') and SERIESNUMBER_TO>=lpad('10000',10,'0');

Executed in 0.016 seconds

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

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

Plan hash value: 3449092418

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

| Id| Operation| Name| Rows| Bytes |

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

|0 | SELECT STATEMENT||183 | 11346 |

|1 |TABLE ACCESS BY INDEX ROWID| STKTESTONHAND|183 | 11346 |

|*2 |INDEX RANGE SCAN| IND_STKTESTONHAND_COMP0 |183 ||

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

Predicate Information (identified by operation id):

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

2 - access("SERIESNUMBER_TO">='0000010000' AND "SERIESNUMBER_FROM"<='00000100

filter("SERIESNUMBER_TO">='0000010000')

Executed in 0.156 seconds

此时,该查询根据索引路径进行搜索。下面,我们观察索引的状态。

SQL> col index_name format a20;

SQL> col table_name format a15;

SQL> select index_name, table_name,UNIQUENESS,status, num_rows, VISIBILITY from user_indexes where index_name='IND_STKTESTONHAND_COMP0';

INDEX_NAMETABLE_NAMEUNIQUENESS STATUSNUM_ROWS VISIBILITY

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

IND_STKTESTONHAND_CO STKTESTONHANDUNIQUEVALID200100 VISIBLE

MP0

Executed in 0.062 seconds

SQL> col segment_name format a15;

SQL> select segment_name, segment_type,bytes,blocks from user_segments where segment_name='IND_STKTESTONHAND_COMP0';

SEGMENT_NAMESEGMENT_TYPEBYTESBLOCKS

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

IND_STKTESTONHA INDEX83886081024

ND_COMP0

Executed in 0.125 seconds

注意:当前索引状态为VALID,可见性为visible。索引体积为8.3MB。我们首先观察unusable的现象。

SQL> alter index IND_STKTESTONHAND_COMP0 unusable;

Executed in 0.032 seconds

SQL> select index_name, table_name,UNIQUENESS,status, num_rows, VISIBILITY from user_indexes where index_name='IND_STKTESTONHAND_COMP0';

INDEX_NAMETABLE_NAMEUNIQUENESS STATUSNUM_ROWS VISIBILITY

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

IND_STKTESTONHAND_CO STKTESTONHANDUNIQUEUNUSABLE200100 VISIBLE

MP0

Executed in 0.046 seconds

SQL> explain plan for select * from stktestonhand where SERIESNUMBER_FROM<=lpad('10000',10,'0') and SERIESNUMBER_TO>=lpad('10000',10,'0');

Executed in 0 seconds

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

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

Plan hash value: 2311662756

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

| Id| Operation| Name| Rows| Bytes | Cost (%CPU)| Time

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

|0 | SELECT STATEMENT||183 | 11346 |588(2)| 00:00:0

|*1 |TABLE ACCESS FULL| STKTESTONHAND |183 | 11346 |588(2)| 00:00:0

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

Predicate Information (identified by operation id):

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

1 - filter("SERIESNUMBER_FROM"<='0000010000' AND

"SERIESNUMBER_TO">='0000010000')

Executed in 0.094 seconds

从上面的信息中,可以知道。一旦索引被unusable,SQL执行计划中不会考虑索引路径,相当于失效。

下面我们进行连带DML操作检查。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值