3

正如问题所述,两者在性能方面有什么区别,哪种场景更好?

或者这两个有相同的效果?如果适用,各有什么优缺点?

据我了解,重新创建索引也会导致类似于收集统计信息(11g)的重建

禁用和重新启用索引怎么样?它还会自动收集统计信息吗?

请注意,我是带着需要进行大量批量插入/更新的心态来问这个的

非常感谢

4

2 回答 2

5

我们不能禁用索引,除非它是基于函数的索引。

SQL> alter index i42 disable;
alter index i42 disable
*
ERROR at line 1:
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option

SQL>

我们可以让它不可用,但这有一个相当不幸的副作用:

SQL> alter index i42 unusable;

Index altered.

SQL> insert into t42 values (sysdate, 6, 'FOX IN SOCKS');
insert into t42 values (sysdate, 6, 'FOX IN SOCKS')
*
ERROR at line 1:
ORA-01502: index 'APC.I42' or partition of such index is in unusable state


SQL> 

只是为了证明关于基于函数的索引的观点:

SQL> create index f42 on t42(initcap(name))
  2  /

Index created.

SQL> alter index f42 disable;

Index altered.

SQL> insert into t42 values (sysdate, 6, 'MR KNOX')
  2  /
insert into t42 values (sysdate, 6, 'MR KNOX')
*
ERROR at line 1:
ORA-30554: function-based index APC.F42 is disabled


SQL> 

我认为这排除了出于您的目的禁用索引。如果您想处理没有索引的表,则需要删除它们。这是否有意义取决于您的案件的具体情况,正如我在回答您之前的问题时所说的那样......


至于约束,我们不能删除用于强制执行唯一约束的索引。但是,我们可以删除约束但保留索引。在这种情况下,如果索引是唯一的,它仍然会强制执行完整性:

SQL> create unique index i42 on t42(id);

Index created.

SQL> alter table t42 add constraint t42_pk primary key (id);

Table altered.

SQL> insert into t42 values (sysdate, 5, 'MAISIE');

1 row created.

SQL> r
  1* insert into t42 values (sysdate, 5, 'MAISIE')
insert into t42 values (sysdate, 5)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T42_PK) violated


SQL> alter table t42 drop constraint t42_pk;

Table altered.

SQL> insert into t42 values (sysdate, 5, 'MAISIE');
insert into t42 values (sysdate, 5, 'MAISIE')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.I42) violated


SQL> 
于 2013-11-23T11:00:06.777 回答
0

当您禁用/启用索引时,您是在告诉 DBMS“不使用该索引”,但索引仍然存在(作为物理实体)。当您删除索引时,您是在告诉 DBMS 删除它,因此当您使用索引更改表时,必须从头开始重建整个索引树(这取决于实现)。无论如何,如果您禁用插入索引并启用它,DBMS 将不得不仅将插入的值添加到索引中。如果您删除并创建索引,DBMS 将从头开始(更昂贵)

于 2013-11-23T10:01:23.497 回答