Oracle index rebuild online 与 rebuild 及 drop index 后重建

本文介绍Oracle数据库中在线重建索引(rebuild online index)的过程及原理。重点解释了使用online选项时,Oracle如何通过创建系统临时日志表SYS_JOURNAL_xxx来记录表更改,以保持索引与表数据的一致性,并最小化对业务的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们对索引进行 rebuild 时,如果不加online选项,oracle则直接读取原索引的数据;
当我们添加 online 选项时,oracle是直接扫描表中的数据,维护索引段数据的一致性就是从索引开始创建到索引创建完成这段时间的数据改变的同步。

从索引开始 rebuild online 的那一刻起,oracle会先创建一个SYS_JOURNAL_xxx的系统临时日志表,结构类似于物化视图日志表mlog$_表,
通过内部触发器,记录了开始 rebuild online 索引时表上所发生的改变的记录,当索引已经创建好之后,
新数据将直接写入索引,只需要把SYS_JOURNAL_xxx日志表中的改变维护到索引中即可,也就是最小化对当前业务的影响。

在 rebulid index online 的时候走的是 full table scan,这时候需要排序;
在 rebulid index 走的index ffs,而ffs搜索的顺序是根据leaf block的物理存储顺序相关,也需要排序。在rebuild index时候还是需要用到temp空间来排序的。

总之,优先用rebuild online,实在不行也要在空闲的时候用rebuil,非必要不用drop index/create index

alter index index_name rebuild tablespace tablespace_name

<think>我们正在讨论Oracle数据库索引创建。根据引用,创建索引的基本语法是: CREATE [UNIQUE] INDEX 索引名 ON 表名(列名1, 列名2, ...) [TABLESPACE 表空间名] [其他可选参数,如NOLOGGING, ONLINE, PARALLEL等]; 其中: - UNIQUE:表示创建唯一索引,确保索引列的值唯一。 - 索引名:自定义的索引名称,通常按照规范命名(例如:表名_列名_IDX)。 - 表名:要创建索引的表。 - 列名:可以是一个或多个列,多列时用逗号分隔(即复合索引)。 - TABLESPACE:指定索引存储的表空间,可选。 - 其他可选参数:如NOLOGGING(减少日志生成,加快创建速度但不可恢复)、ONLINE(在线创建,不阻塞DML操作)、PARALLEL(并行创建)等。 注意:创建索引需要权衡,因为索引虽然能提高查询速度,但会降低增删改的速度(需要维护索引)。因此,应选择在查询频繁但更新较少的列上创建索引。 根据引用[3]的例子: CREATE INDEX STUINFO_STUID ON STUINFO(STUID) TABLESPACE USERS; 另外,引用[1]展示了创建唯一索引的例子: create unique index index_name on table(col1,col2,…) tablespace tbs_name [nologging][online][parallel n]; 然后关闭并行:alter index index_name noparallel; 步骤: 1. 确定需要创建索引的表和列,以及索引类型(普通索引还是唯一索引)。 2. 为索引命名(遵循命名规范)。 3. 选择是否指定表空间和其他参数。 4. 执行创建索引的SQL语句。 示例:在表EMPLOYEES的LAST_NAME列上创建普通索引 CREATE INDEX EMP_LAST_NAME_IDX ON EMPLOYEES(LAST_NAME); 示例:在表EMPLOYEES的EMPLOYEE_ID列上创建唯一索引(因为EMPLOYEE_ID通常是唯一的) CREATE UNIQUE INDEX EMP_EMP_ID_PK ON EMPLOYEES(EMPLOYEE_ID); 注意:如果创建唯一索引,则索引列的值必须唯一,否则创建会失败。 另外,引用[4]提醒:创建索引之前需要权衡该字段是否经常发生增删改操作。 如果需要查看索引,可以使用引用[2]中的语句: SELECT * FROM ALL_INDEXES WHERE TABLE_NAME='XXXXX'; 请根据实际需求调整。</think>### Oracle数据库创建索引指南 在Oracle中创建索引是优化查询性能的关键操作,以下是详细步骤和注意事项: #### 1. **基本语法** ```sql CREATE [UNIQUE] INDEX 索引名 ON 表名(列名1, 列名2, ...) [TABLESPACE 表空间名] [其他可选参数]; ``` - **普通索引**:加速查询,允许重复值 ```sql CREATE INDEX emp_dept_idx ON employees(department_id); ``` - **唯一索引**:强制列值唯一性(类似主键约束) ```sql CREATE UNIQUE INDEX emp_email_uniq ON employees(email); ``` #### 2. **关键参数说明** | 参数 | 作用 | 示例 | |------|------|------| | `TABLESPACE` | 指定索引存储位置 | `TABLESPACE users` | | `ONLINE` | 在线创建(不阻塞DML操作) | `CREATE INDEX ... ONLINE` | | `PARALLEL` | 并行加速创建 | `PARALLEL 4`(创建后需关闭) | | `NOLOGGING` | 减少重做日志生成 | `NOLOGGING`(需权衡恢复风险) | #### 3. **复合索引创建** 对多列组合创建索引(列顺序影响查询效率): ```sql CREATE INDEX emp_name_dept_idx ON employees(last_name, department_id); ``` #### 4. **索引重建变更** - **重建索引**(碎片整理): ```sql ALTER INDEX emp_dept_idx REBUILD ONLINE; ``` - **修改参数**(如关闭并行): ```sql ALTER INDEX emp_dept_idx NOPARALLEL; ``` #### 5. **索引管理命令** - 查看索引: ```sql SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = 'EMPLOYEES'; -- Oracle[^2] ``` - 删除索引: ```sql DROP INDEX emp_dept_idx; ``` #### ⚠️ **重要注意事项** 1. **性能权衡**:索引会提升查询速度,但会降低增删改性能(需维护索引结构)[^4] 2. **选择字段原则**: - 在WHERE/JOIN/ORDER BY频繁使用的列创建 - 避免在低区分度(如性别)或频繁更新的列创建 3. **空间规划**:大型索引需预留足够表空间 4. **唯一索引**:需确保数据无重复,否则创建失败 > **示例场景**:为百万级订单表优化日期范围查询 > ```sql > CREATE INDEX orders_date_idx ON orders(order_date) > TABLESPACE idx_data > ONLINE > PARALLEL 8; > ALTER INDEX orders_date_idx NOPARALLEL; -- 创建后关闭并行 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值