首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与删除和重新创建索引相比,禁用和重新启用索引有什么区别?

与删除和重新创建索引相比,禁用和重新启用索引有什么区别?
EN

Stack Overflow用户
提问于 2013-11-23 09:56:11
回答 2查看 6.4K关注 0票数 4

正如问题所述,这两种方案在性能上有什么不同,哪一种方案更适合于哪种情况?

或者这两者的效果是一样的?如果适用的话,每一种方法的利弊是什么?

据我所知,重新创建索引也会导致其重建,类似于收集统计数据(11g)。

那么禁用和重新启用索引呢?它也会自动收集统计数据吗?

请注意,我是以需要大量批量插入/更新的心态来问这个问题的。

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-23 11:00:06

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

代码语言:javascript
复制
SQL> alter index i42 disable;
alter index i42 disable
*
ERROR at line 1:
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option

SQL>

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

代码语言:javascript
复制
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> 

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

代码语言:javascript
复制
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> 

我认为这排除了禁用索引的可能性。如果您想在没有索引的表上工作,则需要删除它们。这是否合理取决于你案子的具体情况,正如我在“my answer to your previous question”中说的.

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

代码语言:javascript
复制
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> 
票数 6
EN

Stack Overflow用户

发布于 2013-11-23 10:01:23

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20160916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档