oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle数据大表创建索引

Oracle为数据大表创建索引的实现步骤

作者:yjb.gz

在日常业务中,避免不了为数据量大表补充创建索引的情况,如果快速、有效地创建索引成了一个至关重要的问题,但对于超大量的,建议在原表上直接操作,所以本文给大家介绍了Oracle为数据大表创建索引的实现步骤,需要的朋友可以参考下

在日常业务中,避免不了为数据量大表补充创建索引的情况,如果快速、有效地创建索引成了一个至关重要的问题(注意:虽然提供有ONLINE在线执行的方式,理想状态下不会阻塞DML操作,但ONLINE在开始、结束的两个时刻仍然会产生独占锁,只是中间执行过程中才以共享锁的模式扫描表,建议还是在业务低峰期操作,避免在执行窗口期高并发造成死锁)。但对于超大量的,如TB级别的表,建议重新新建一个表,创建对应索引,将数据迁移,最后变更表名处理,不建议在原表上直接操作。

ONLINE 索引创建的内部简化流程

准备阶段 (非常短暂)

扫描和构建阶段 (主要耗时阶段)

这是 ONLINE 的关键:Oracle 以共享模式 (S锁) 扫描表。共享锁与DML操作的排他锁(X锁)是兼容的。这意味着:

应用增量阶段 (合并变更)

最终切换阶段 (非常短暂)

第一步:准备工作

除了预防死锁,还应确保有足够的资源(I/O、CPU) 来让这个操作快速完成。

选择维护窗口

评估空间和估算大小

-- 查看表当前占用空间,表空间不够的话最好先增加表空间
SELECT SEGMENT_NAME, BYTES/1024/1024 AS SIZE_MB
FROM DBA_SEGMENTS A
WHERE A.SEGMENT_NAME = UPPER('<table>')
AND A.OWNER=UPPER('<owner>');

确定并行度 (PARALLEL)

决定是否使用NOLOGGING

第二步:执行脚本

将以下脚本中的占位符替换为您的实际信息:

执行脚本如下:

-- 1. 可选:开启会话级并行,确保命令生效
ALTER SESSION ENABLE PARALLEL DDL;
 
-- 2. 核心:创建索引( ONLINE 和 PARALLEL 是关键)
CREATE INDEX [OWNER.][INDEX_NAME] ON [OWNER.][TABLE_NAME] ([COLUMN_LIST])
TABLESPACE [TABLESPACE_NAME]  -- 可选,指定表空间
ONLINE                         -- 关键!允许并发DML,防止锁等待和死锁
PARALLEL [PARALLEL_DEGREE]     -- 关键!加速创建,例如 PARALLEL 8
NOLOGGING;                     -- 关键!大幅提升速度。评估风险后使用
 
-- 3. 创建完成后,立即将索引的并行度改回 1(或NONE),避免后续查询过度并行
ALTER INDEX [OWNER.][INDEX_NAME] NOPARALLEL;
 
-- 4. 可选但建议:如果使用了NOLOGGING,将其改回LOGGING模式,确保后续变更被安全记录
ALTER INDEX [OWNER.][INDEX_NAME] LOGGING;
 
-- 5. 收集新索引的统计信息(非常重要,否则优化器无法有效使用索引)
BEGIN
  DBMS_STATS.GATHER_INDEX_STATS(
    OWNNAME => '[OWNER]',           -- 所属用户
    INDNAME => '[INDEX_NAME]',
    ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE -- 让ORACLE自动决定采样比例
  );
END;
/

第三步:验证

检查索引状态

SELECT INDEX_NAME, STATUS, VISIBILITY
  FROM DBA_INDEXES A
 WHERE A.INDEX_NAME = UPPER('[INDEX_NAME]')
   AND A.OWNER = UPPER('[OWNER]');

检查索引段大小

SELECT SEGMENT_NAME, BYTES / 1024 / 1024 AS SIZE_MB
  FROM DBA_SEGMENTS A
 WHERE A.SEGMENT_NAME = UPPER('[INDEX_NAME]')
   AND A.OWNER = UPPER('[OWNER]');

这可以让你了解索引的实际大小。

到此这篇关于Oracle为数据大表创建索引的实现步骤的文章就介绍到这了,更多相关Oracle数据大表创建索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文