参数SKIP_UNUSABLE_INDEXES的一点测试!

之前并不知道SKIP_UNUSABLE_INDEXES是一个参数,在imp/impdp中经常看到!通过以下试验发现即使SKIP_UNUSABLE_INDEXES=y,status=UNUSABLE的index还是伴随着tt表的导出导入一起导出导入,只是SKIP_UNUSABLE_INDEXES=y时,当imp导入表时insert的数据不会同时再去update index key了,但是unique index例外 ,因为它扮演着constraint的作用!


SQL> DESC TT
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------

ID NUMBER(38)

SQL> SELECT * FROM TT;

ID
----------
1
2

SQL> CREATE INDEX IDX_TT ON TT(ID);

索引已创建。

SQL> alter table tt move tablespace dmt;

表已更改。

SQL> select index_name ,table_name , status from user_INDEXES where index_name='
IDX_TT';

INDEX_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ --------
IDX_TT TT UNUSABLE

SQL> SHOW PARAMETER SKIP_UNUSABLE_INDEXES

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes boolean TRUE
SQL> alter session set skip_unusable_indexes=false;

会话已更改。

SQL> select * from tt;

ID
----------
1
2

SQL> delete from tt;
delete from tt
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> insert into tt values(3);
insert into tt values(3)
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> update tt set id=100;
update tt set id=100
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> select * from tt;

ID
----------
1
2

SQL> drop index idx_tt;

索引已删除。

SQL> create unique index idx_tt on tt(id);

索引已创建。

SQL> SHOW PARAMETER SKIP_UNUSABLE_INDEXES

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes boolean FALSE
SQL> alter table tt move tablespace dmt;

表已更改。

SQL> select index_name ,table_name , status from user_INDEXES where index_name='
IDX_TT';

INDEX_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ --------
IDX_TT TT UNUSABLE

SQL> select * from tt;

ID
----------
1
2

SQL> insert into tt values(3);
insert into tt values(3)
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> update tt set id=100;
update tt set id=100
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> delete from tt;
delete from tt
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.IDX_TT' 或这类索引的分区处于不可用状态


SQL> drop index idx_tt;

索引已删除。

SQL> alter table tt add constraint pk_tt primary key (id);

表已更改。

SQL> select index_name ,table_name , status from user_INDEXES where table_name='
TT';

INDEX_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ --------
PK_TT TT VALID

SQL> alter table tt move tablespace dmt;

表已更改。

SQL> select index_name ,table_name , status from user_INDEXES where table_name='
TT';

INDEX_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ --------
PK_TT TT UNUSABLE
--创建primary key时创建的index如果status=UNUSABLE此时把select都报错!
SQL> select * from tt;
select * from tt
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> insert into tt values(3);
insert into tt values(3)
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> update tt set id=100;
update tt set id=100
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> delete from tt;
delete from tt
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

PK_TT TT UNIQUE UNUSABLE


SQL> SHOW PARAMETER SKIP_UNUSABLE_INDEXES

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes boolean FALSE
我们清晰的看到下面skip_unusable_indexes=true时对unique index不起作用,
因为unqiue index此时扮演着constraint的角色
SQL> alter session set SKIP_UNUSABLE_INDEXES=true;

会话已更改。

SQL> delete from tt;
delete from tt
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> update tt set id=100;
update tt set id=100
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> insert into tt values(3);
insert into tt values(3)
*
第 1 行出现错误:
ORA-01502: 索引 'XYS.PK_TT' 或这类索引的分区处于不可用状态


SQL> select * from tt;

ID
----------
1
2

SQL> alter table tt drop constraint pk_tt;

表已更改。

SQL> create index idx_tt on tt(id);

索引已创建。

SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

IDX_TT TT NONUNIQUE VALID

SQL> alter table tt move tablespace dmt;

表已更改。

SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

IDX_TT TT NONUNIQUE UNUSABLE


SQL> show parameter SKIP_UNUSABLE_INDEX

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes boolean TRUE
SQL> select *from tt;

ID
----------
1
2

SQL> insert into tt values(3);

已创建 1 行。

SQL> commit;

提交完成。

SQL> update tt set id=100;

已更新3行。

SQL> rollback;

回退已完成。

SQL> delete from tt;

已删除3行。

SQL> rollback;

回退已完成。

SQL>
--=====================================================================================
SQL> host exp xys/manager@orcl file=e:expa.dmp tables=tt

Export: Release 10.2.0.1.0 - Production on 星期六 10月 13 21:43:57 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
. . 正在导出表 TT导出了 3 行
成功终止导出, 没有出现警告。

SQL> host imp xys/manager@dup file=e:expa.dmp SKIP_UNUSABLE_INDEXES=y full=y

Import: Release 10.2.0.1.0 - Production on 星期六 10月 13 21:45:19 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 XYS 的对象导入到 XYS
. 正在将 XYS 的对象导入到 XYS
. . 正在导入表 "TT"导入了 3 行
成功终止导入, 没有出现警告。

SQL> connect xys/manager@dup
已连接。
SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

IDX_TT TT NONUNIQUE UNUSABLE


--我们看到即使SKIP_UNUSABLE_INDEXES=y,status=UNUSABLE的index还是伴随着tt表的导出导入
一起导出导入,只是
SKIP_UNUSABLE_INDEXES=y时,当imp导入表时insert的数据不会同时再去update index key了!
SQL> connect xys/manager@orcl
已连接。
SQL> drop index idx_tt;

索引已删除。

SQL> alter table tt add constraint pk_tt primary key (id);

表已更改。

SQL> alter table tt move tablespace dmt;

表已更改。

SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

PK_TT TT UNIQUE UNUSABLE


SQL> host exp xys/manager@orcl file=e:expa.dmp tables=tt

Export: Release 10.2.0.1.0 - Production on 星期六 10月 13 22:27:09 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
. . 正在导出表 TT导出了 3 行
成功终止导出, 没有出现警告。

SQL> host imp xys/manager@dup file=e:expa.dmp SKIP_UNUSABLE_INDEXES=y full=y

Import: Release 10.2.0.1.0 - Production on 星期六 10月 13 22:27:37 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 XYS 的对象导入到 XYS
. 正在将 XYS 的对象导入到 XYS
. . 正在导入表 "TT"导入了 3 行
IMP-00017: 由于 ORACLE 错误 14063, 以下语句失败:
"ALTER TABLE "TT" ADD CONSTRAINT "PK_TT" PRIMARY KEY ("ID") USING INDEX PCT"
"FREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 40960 NEXT 40960 MINEXTENTS"
" 1 MAXEXTENTS 505 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL "
"DEFAULT) TABLESPACE "DMT" LOGGING"
IMP-00003: 遇到 ORACLE 错误 14063
ORA-14063: 唯一/主约束条件关键字中存在无用索引
IMP-00017: 由于 ORACLE 错误 14048, 以下语句失败:
"ALTER INDEX "PK_TT" UNUSABLE ENABLE "
IMP-00003: 遇到 ORACLE 错误 14048
ORA-14048: 分区维护操作不能与其它操作组合
成功终止导入, 但出现警告。

SQL> connect xys/manager@dup
已连接。
SQL> select index_name ,table_name , uniqueness,status from user_INDEXES where t
able_name='TT';

INDEX_NAME TABLE_NAME UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------

PK_TT TT UNIQUE UNUSABLE


SQL>
通过以上操作我们看到SKIP_UNUSABLE_INDEXES=y对unique index不起作用,因为此时的unique index扮演者
constraint的作用所以在insert数据时index必须被更新

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19602/viewspace-61743/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/19602/viewspace-61743/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值