免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fish617
打印 上一主题 下一主题

状态为unusable的索引影响DML速度吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-07-17 11:45 |只看该作者
原帖由 fish617 于 2008-7-16 18:27 发表
设置index为unusable时,要修改参数skip_unusable_indexes为TRUE,否则用到该索引时会报错.


如果index状态为UNUSABLE,insert数据的时候,会报错并拒绝,测试如下

show parameter skip

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes                boolean     TRUE


使index不可用

alter index pk_test unusable


查看index状态
select index_name,status,table_name from user_indexes;

INDEX_NAME                     STATUS   TABLE_NAME
------------------------------ -------- ------------------------------
PK_TEST                        UNUSABLE TEST


开始insert
insert into test values(12,'asdf');
insert into test values(12,'asdf')
*
ERROR at line 1:
ORA-01502: index 'PRODUCT.PK_TEST' or partition of such index is in unusable
state


可见如果index状态是unusable,insert可能是无法完成的,这种情况在分区表中比较常见,如果建index的时候,是global index,在维护分区的时候,可能就会使index 状态为unusable

[ 本帖最后由 秋风No.1 于 2008-7-17 11:47 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2008-07-17 13:28 |只看该作者
呵呵,老同事所见略同啊

论坛徽章:
0
13 [报告]
发表于 2008-07-17 13:55 |只看该作者
原来如此,谢谢!原来被烂书给骗了,唉,尽信书不如无书!

论坛徽章:
0
14 [报告]
发表于 2008-07-17 14:35 |只看该作者
靠,偶也叫书给骗了。

论坛徽章:
0
15 [报告]
发表于 2008-07-17 14:38 |只看该作者
原帖由 dhhb 于 2008-7-17 13:28 发表
呵呵,老同事所见略同啊

论坛徽章:
0
16 [报告]
发表于 2008-07-17 17:54 |只看该作者
10g中吧index 设置成为unusable可以插入的,9I没有试过

论坛徽章:
0
17 [报告]
发表于 2008-07-18 00:05 |只看该作者
原帖由 imtj 于 2008-7-17 17:54 发表
10g中吧index 设置成为unusable可以插入的,9I没有试过

我测试的环境就是10G,你是用什么方法insert的?给大家共享一下吧

论坛徽章:
0
18 [报告]
发表于 2008-07-18 10:57 |只看该作者
这个问题有必要仔细研究综合一下,说不定oracle自己都不明确呢。

论坛徽章:
0
19 [报告]
发表于 2008-07-19 14:04 |只看该作者
SQL> drop table test_part1;

Table dropped

SQL>
SQL> create table test_part1 (id number(4),hire_date date)
  2  partition by range (id)
  3  (
  4  partition testpart1_1 values less than (100) tablespace part1,
  5  partition testpart1_2 values less than (200) tablespace part2,
  6  partition testpart1_3 values less than (300) tablespace part3,
  7  partition testpart1_4 values less than (maxvalue)
  8  );

Table created

SQL>
SQL> declare
  2  i int;
  3  begin
  4  for i in 1..600 loop
  5  insert into test_part1 values (i,sysdate);
  6  end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed

SQL> create index test_part1_indx on test_part1(id)
  2  /

Index created

SQL> alter index test_part1_indx unusable;

Index altered

SQL>
SQL> declare
  2  i int;
  3  begin
  4  for i in 1..600 loop
  5  insert into test_part1 values (i,sysdate);
  6  end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

论坛徽章:
0
20 [报告]
发表于 2008-07-20 00:37 |只看该作者
这个问题看似矛盾,是因为这个索引字段是否未主键约束或唯一约束,当对某个字段建主键或者唯一约束时,会自动创建一个索引,这样将该index改为unusable时,约束还是enable状态,当有数据插入时,检查数据完整性时候,这个约束会去使用这个index,而这个index是unusable状态,就会报错。具体测试如下

创建主键约束索引,insert失败
SQL> create table test(id number,name varchar2(10));

Table created.

SQL> alter table test add constraint pk_test primary key(id);

Table altered.

SQL> select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        VALID

SQL> select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        VALID

SQL>  insert into test  values (1,'sdfs');

1 row created.

SQL> commit;

Commit complete.

SQL> alter index PK_TEST unusable;

Index altered.

SQL> select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        UNUSABLE

SQL>  insert into test  values (2,'asdf');
insert into test  values (2,'asdf')
*
ERROR at line 1:
ORA-01502: index 'PRODUCT.PK_TEST' or partition of such index is in unusable state



创建不带约束的索引,insert成功
SQL> drop table test purge;

Table dropped.

SQL> create table test(id number,name varchar2(10));

Table created.

SQL> create index pk_test on test(id);

Index created.

SQL>  select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        VALID

SQL>  insert into test  values (2,'asdf');

1 row created.

SQL> alter index PK_TEST unusable;

Index altered.

SQL>  select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        UNUSABLE

SQL>  insert into test  values (3,'dddffd');

1 row created



创建唯一约束索引,insert失败,这个时候,可以看一下约束的状态,是enable
SQL> create table test(id number,name varchar2(10));

Table created.

SQL> alter table test add constraint pk_test unique (id);

Table altered.

SQL> select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        VALID

SQL> insert into test  values (1,'sdfs');

1 row created.

SQL> commit;

Commit complete.

SQL> alter index PK_TEST unusable;

Index altered.

SQL> select index_name,status from user_indexes;

INDEX_NAME                     STATUS
------------------------------ --------
PK_TEST                        UNUSABLE

SQL> insert into test  values (2,'asdf');
insert into test  values (2,'asdf')
*
ERROR at line 1:
ORA-01502: index 'PRODUCT.PK_TEST' or partition of such index is in unusable
state


select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS from  user_constraints;

CONSTRAINT_NAME                C TABLE_NAME                     STATUS
------------------------------ - ------------------------------ --------
PK_TEST                        U TEST                           ENABLED


创建唯一约束索引,insert时,将约束关闭,insert成功

SQL> drop table test purge;

Table dropped.

SQL> create table test(id number,name varchar2(10));

Table created.

SQL> alter table test add constraint pk_test unique (id);

Table altered.

SQL> alter index PK_TEST unusable;

Index altered.

SQL> insert into test  values (2,'asdf');
insert into test  values (2,'asdf')
*
ERROR at line 1:
ORA-01502: index 'PRODUCT.PK_TEST' or partition of such index is in unusable
state


SQL> alter table test disable constraint pk_test;

Table altered.

SQL> insert into test  values (2,'asdf');

1 row created.

SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS from  user_constraints;

CONSTRAINT_NAME                C TABLE_NAME                     STATUS
------------------------------ - ------------------------------ --------
PK_TEST                        U TEST                           DISABLED
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP