Oracle 12c创建带分区和索引的空表耗时过长如何优化
Oracle 12cR2 分区空表(含索引)创建过慢优化方案
以下方案均适配你使用的Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production版本,可直接落地:
- 启用DDL并行处理
会话级开启并行DDL权限,建表、建索引时指定并行度(并行度建议设置为服务器CPU核心数的1/2到全核心,避免资源过载),创建完成后可根据业务需求关闭表和索引的并行属性,避免后续业务SQL意外触发并行执行。
相关命令:-- 开启会话级并行DDL ALTER SESSION ENABLE PARALLEL DDL; -- 建表时指定并行度 CREATE TABLE 你的表名 (字段定义) PARTITION BY 分区规则 PARALLEL 4; -- 建局部索引时指定并行度 CREATE INDEX 索引名 ON 你的表名(索引字段) LOCAL PARALLEL 4; -- 建完后恢复非并行属性(可选) ALTER TABLE 你的表名 NOPARALLEL; ALTER INDEX 索引名 NOPARALLEL; - 开启延迟段创建特性
12c版本自带的DEFERRED_SEGMENT_CREATION参数开启后,空表、空分区、空索引不会立刻分配物理存储段,能大幅降低空表创建的IO开销,速度提升非常明显。如果你的场景不需要空表立刻分配存储空间,建议开启:ALTER SESSION SET DEFERRED_SEGMENT_CREATION = TRUE; - 临时关闭建表时自动统计信息收集
12.2版本默认会在表创建时自动收集统计信息,空表无数据不需要这一步操作,可临时会话级关闭该特性减少不必要的开销:ALTER SESSION SET "_optimizer_gather_stats_on_load" = FALSE; -- 建表完成后可恢复为默认值TRUE - 提前调整表空间配置
如果表空间开启了自动扩展且每次扩展的尺寸较小,创建表时触发多次数据文件扩展会大幅拉长耗时,可提前将对应表空间的数据文件扩展到足够大小,建表完成后再恢复原有自动扩展配置即可。 - 避免一次性嵌套所有DDL逻辑
如果是复制现有表结构(含分区、索引),不要直接用CREATE TABLE ... LIKE ... INCLUDING ALL的语法一次性完成,拆分步骤为「先建分区空表」→「并行建索引」,执行效率更高。
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

