oracle重建索引(三)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
导读:
  重建索引有多种方式,如drop and re-create、rebuild、rebuild online等。下面简单比较这几种方式异同以及优缺点:
  相关文章:
  oracle重建索引(一)
  oracle重建索引(二)
  三、rebuild和rebuild online的数据源
  网上一直有这样一个说法:重建索引是以原索引作为数据源的。那么,这种说法是否准确呢?我们做实验来验证一下:
  suk@ORACLE9I> COL SEGMENT_NAME FORMAT A30
  --首先看看表和索引的大小
  suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C1');
  SEGMENT_NAME BYTES
  ------------------------------ ----------
  TEST 201326592
  IDX_TEST_C1 293601280
  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
  已解释。
  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
  PLAN_TABLE_OUTPUT
  ----------------------------------------------------------------------------------------------------
  -----------------------------------------------------------------------
  | Id | Operation | Name | Rows | Bytes | Cost |
  -----------------------------------------------------------------------
  | 0 | ALTER INDEX STATEMENT | | | | |
  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
  | 2 | SORT CREATE INDEX | | | | |
  | 3 | TABLE ACCESS FULL | TEST | | | |
  -----------------------------------------------------------------------
  Note: rule based optimization
  已选择11行。
  --从执行计划可以看出,当索引比表大时,rebuild索引用的数据源是基表。
  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
  已解释。
  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
  PLAN_TABLE_OUTPUT
  ----------------------------------------------------------------------------------------------------
  -----------------------------------------------------------------------
  | Id | Operation | Name | Rows | Bytes | Cost |
  -----------------------------------------------------------------------
  | 0 | ALTER INDEX STATEMENT | | | | |
  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
  | 2 | SORT CREATE INDEX | | | | |
  | 3 | TABLE ACCESS FULL | TEST | | | |
  -----------------------------------------------------------------------
  Note: rule based optimization
  已选择11行。
  --从执行计划可以看出,当索引比表大时,rebuild online索引用的数据源是基表。
  --我们为TEST添加一列,使得表比索引大
  suk@ORACLE9I> ALTER TABLE TEST ADD(C2 CHAR(30) DEFAULT '1');
  表已更改。
  suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C
  1');
  SEGMENT_NAME BYTES
  ------------------------------ ----------
  TEST 1476395008
  IDX_TEST_C1 293601280
  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
  已解释。
  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
  PLAN_TABLE_OUTPUT
  ----------------------------------------------------------------------------------------------------
  -----------------------------------------------------------------------
  | Id | Operation | Name | Rows | Bytes | Cost |
  -----------------------------------------------------------------------
  | 0 | ALTER INDEX STATEMENT | | | | |
  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
  | 2 | SORT CREATE INDEX | | | | |
  | 3 | INDEX FAST FULL SCAN| IDX_TEST_C1 | | | |
  -----------------------------------------------------------------------
  Note: rule based optimization
  已选择11行。
  --从执行计划可以看出,当表比索引大时,执行计划已经改变,rebuild索引是以索引作为数据源的。
  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
  已解释。
  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
  PLAN_TABLE_OUTPUT
  ----------------------------------------------------------------------------------------------------
  -----------------------------------------------------------------------
  | Id | Operation | Name | Rows | Bytes | Cost |
  -----------------------------------------------------------------------
  | 0 | ALTER INDEX STATEMENT | | | | |
  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
  | 2 | SORT CREATE INDEX | | | | |
  | 3 | TABLE ACCESS FULL | TEST | | | |
  -----------------------------------------------------------------------
  Note: rule based optimization
  已选择11行。
  --从执行计划可以看出,当表比索引大时,rebuild online仍然以基表作为数据源。
  rebuild模式下,因为表数据不会产生变化,oracle主要考虑性能问题,把更快扫描完成的段作为数据源。在上面的例子中,我们并没有对表进行分析,故oracle应该根据数据段的大小来决定那个作为数据源的。一般索引字段比较多,或者对索引字段的DML操作较多,可能会导致索引比表大,这时oracle就会使用基表作为新索引的数据源进行rebuild了。
  而在rebuild online模式下,因为允许DML操作,而表数据变化的同时索引也会跟着变化,为了索引与基表数据的一致性,比如采用基表数据作为数据源,而不能用原索引数据作为数据源。
  我们用反证法证明不能用原索引作为新索引的数据源。
  例如:
  T1发出rebuild online命令
  T2删除某条数据,删数据的同时,oracle会自动维护了旧索引
  T3扫描经过T2数据所在索引节点
  T4插入一条记录,新记录对应的索引节点刚好重用了T2删除的数据对应的索引节点空间
  如果是这样的话,新建的索引将不包含T4插入的记录的信息。所以,rebuild online情况下新索引的数据源不能是原索引。
  rebuild online情况下,如果非用原索引作为新索引的数据源的话,用中间表记录索引变化的方法应该是可以实现的,但由于数据变化会同时引起索引变化的特定决定了这种方法将异常复杂及效率底下,所以oracle不考虑旧索引作为新索引的数据源是有道理的。
  结论:
  1、rebuild会阻塞对基表的DML操作,但不会影响rebuild期间查询对原有索引的使用。
  2、rebuild的数据源可能是基表,也可能是原索引。取决于基表和原索引的大小,那个小,rebuild时就会用那个作为数据源。这也说明了网上盛传的rebuild以原索引作为数据库的说法是不完全正确的。
  3、rebuild online运行用户在索引重建期间执行DML操作。
  4、rebuild online的数据源是基表。

本文转自
http://space6212.itpub.net/post/12157/292117
【模拟】Oracle重建索引 摘要:简述重建索引的情况及重建索引 阅读详情

相关推荐

Oracle(86)什么是索引重建(Index Rebuild)?

索引重建是数据库维护的重要部分,通过减少碎片化、优化索引结构,可以显著提高查询性能和存储利用率。了解如何检查索引的碎片化程度并进行索引重建,对于数据库管理员来说至关重要。通过定期重建索引,可以保持数据库的高性能和高可用性。

qq_43012298的博客 3584

oracle坏块修复步骤(索引坏块rebuild和表表坏块用rman,dbms_repair恢复)

b)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。,oracle会对基表加share锁,由于share锁和row-X是不兼容的,也就是说,在建立索引期间,无法对基表进行DML操作。实际上,oraclerebuild时,在创建新索引过程中,并不会删除旧索引,直到新索引rebuild成功。c)如果是文件系统且没做raid,没有备份,那么就要按下面的步骤3里的操作恢复好坏块后,再更换磁盘。

一个只求实际的程序猿 3802

Oracle重建索引详解

更新:2023-05-17 18:08。

男神的专栏 9430

Oracle重建表的全局的索引、分区索引、及同时建全局和分区索引----脚本

Oracle重建表的全局的索引、分区索引、及同时建全局和分区索引----脚本

一个只求实际的程序猿 4380

如何保持Oracle数据库的优良性能

Oracle数据库以其高可靠性、安全性、可兼容性,得到越来越多的企业的青睐。如何使Oracle数据库保持优良性能,这是许多数据库管理员关心的问题,根据笔者经验建议不妨针对以下几个方面加以考虑。一、分区根据实际经验,在一个大数据库中,数据空间的绝大多数是被少量的表所占有。为了简化大型数据库的管理,改善应用的查询性能,一般可以使用分区这种手段。所谓分区就是动态表中的记录分离到若干不同的表空间上...

weixin_30384031的博客 88

ORACLE重建索引详解

  一、重建索引的前提 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。   二、重建索引的标准 1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间, 那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间, 对索引进行结构分析(如下): SQL>Analyze inde...

一个标题 1万+

45-Oracle 索引的新建与重建

小伙们日常里有没有被业务和BOSS要求新建索引或是重建索引?他们都想着既快又稳,那么索引在在Oracle上如何实现、新建、重建。原则是什么:1、新建索引,查询是否高频且慢,索引列是否高选择性,新增索引对写负载的影响是否可接受。2、重建索引,验证碎片率/B树高度是否超标,测试重建后查询提升是否有15%以上呢。​​​。

远方的专栏 2495

Oracle ~ 重建索引(包括分区)

Oracle ~ 重建索引(包括分区)尽量不要重建索引真正需要重建索引的情形如何重建索引1、drop 原来的索引,然后再创建索引2 、直接重建2.1 alter index rebuild 和alter index rebuil online的区别注意点:重建分区表上的分区索引 尽量不要重建索引 a. 大多数脚本都依赖 index_stats 动态表。此表使用以下命令填充: analyze index … validate structure; 尽管这是一种有效的索引检查方法,但是它在分析索引时会获取独占表

cai_and_luo的博客 5899

oracle 索引修复 Oracle索引重建

当数据库出现坏块而坏块所涉及对象为索引时,我们一般进行修复索引的方法是重建索引。 相对其它坏块,索引坏块修复起来最容易的。不过在修复前,我们需要确认这个坏块确实来自于某索引。 因此,这里我们会介绍一些块定位方法: 1. 如何在ORA-1578/RMAN/DBVERIFY的日志记录中确认讹误受损对象 首先需要确认绝对文件号(Absolute File Number: AFN)和块号(Blo...

ORACLE数据库数据恢复、性能优化、故障诊断来问问MACLEAN 9105

在线重建索引 oracle,ORACLE重建索引详解

一、重建索引的前提1、表上频繁发生update,delete操作;2、表上发生了alter table ..move操作(move操作导致了rowid变化)。二、重建索引的标准1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间, 那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间, 对索引进行结构分析(如下):SQL>Analyze index index_name val...

weixin_39789327的博客 2199

Oracle重建分区表上的索引

oracle中,重建普通表上的索引很简单。要重建特定索引,只需执行如下sql命令: ALTER INDEX INDEX_NAME Rebuild; 这里,INDEX_NAME代表索引的名字,下同。 如果重建某个表上的全部索引,执行如下PL/SQL 代码: begin for c1 in (select t.index_name, t.partitioned from user_indexes t where table_name = 'TABLE_NAME') loop ...

international24的博客 3726

ORACLE索引重建方法与索引种状态

一、重建索引的前提 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。 二、重建索引的标准 1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间, 那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间, 对索引进行结构分析(如下): SQL>Analyze index index_name validate structure; 2、在执行步骤1的session中查询index_s.

诚的博客 4980

oracle重建索引语句,教您如何实现Oracle重建索引

Oracle重建索引操作大家经常会用到,下面就为您详细介绍Oracle重建索引方面的知识,供您参考,如果您对此方面感兴趣的话,不妨一看。如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小. 在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放. Oracle重建索引可以释放已删...

weixin_34856060的博客 1675

oracle 对表重建索引,oracle 重建索引方法 分析

首先建立测试表及数据:SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;Table createdSQL> ALTER TABLE TEST MODIFY C1 NOT NULL;Table alteredSQL> SELECT COUNT(1) FROM TEST;COUNT(1)----------1...

weixin_26766909的博客 3582

oracle 重建索引

-- Create table create table PHONEDICT ( ID INTEGER not null, DICTVALUE VARCHAR2(200) not null, TIME DATE default sysdate, DICTTYPE INTEGER, USERID VARCHAR2(60), STATUS ...

雨陆聪辰的博客 3135

oracle重建主键索引要多久,Oracle 重建索引脚本

索引是提高数据库查询性能的有力武器。没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难。然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应变化,因此可以对这些变化较大的索引进行重构以提高性能。N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引。但Oracle现在强烈建议不要...

weixin_42500720的博客 1156

ORACLE 为什么无需重建索引 索引碎片

Oracle数据库中的索引什么时候需要重建呢?或者什么情况下需要重建索引呢?Oracle需要定期重建索引吗?如果不需要重建索引,那么这样做的理由是什么?如果需要重建索引,那么这样做的理由又是什么?另外,如果需要重建索引,那么满足哪些条件的索引才需要重建呢?关于这个问题,网上也有很多争论,也一直让我有点困惑,因为总有点不得庐山真面目的感觉,直到看到了文档 ID 186826.1等这些资料。

jnrjian的博客 1144
上一篇: oracle重建索引(二)
下一篇: oracle重建索引(一)
goiden
博客等级 码龄18年 4粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值