如何为特定的子分区单独分配表空间_复合分区中各个Subpartition的存储定制

夏辰姑娘_4610

夏辰姑娘_4610

2026-03-23

886人浏览

原创

Oracle复合分区下可为单个SUBPARTITION指定表空间:CREATE TABLE时在SUBPARTITION子句中显式写TABLESPACE;ALTER TABLE时用MODIFY SUBPARTITION ... STORE IN或MOVE SUBPARTITION ... TABLESPACE,后者需重建并重建索引。

Oracle 复合分区下怎么给单个 SUBPARTITION 指定表空间

能。oracle 允许在 create table 或 alter table ... modify subpartition 时,为每个 subpartition 单独指定 tablespace,但必须满足:父分区(partition)本身不能带默认表空间约束,且子分区不能继承自未显式声明的默认值。

常见错误现象:ORA-14020 —— 表示该语法不被当前分区类型支持(比如在未启用复合分区的普通范围分区里写 SUBPARTITION);或 ORA-14295 —— SUBPARTITION 的列列表与父分区不一致,导致无法单独设置存储属性。

  • 只对 RANGE-LIST、RANGE-HASH、LIST-LIST 等复合分区类型有效;普通范围/列表分区没有 SUBPARTITION 概念,强行写会报错
  • CREATE TABLE 时,必须在 SUBPARTITION 子句中显式写 TABLESPACE ts_name,不能依赖父 PARTITION 的 TABLESPACE 设置
  • 已有表想改单个子分区表空间,只能用 ALTER TABLE ... MODIFY SUBPARTITION sub1 STORE IN (ts_new)(注意:不是 MOVE,MOVE 会重建并 require exclusive lock)
  • 如果子分区含 LOB 列,还需额外为 LOB 指定 STORE AS (TABLESPACE ...),否则仍走默认表空间

MODIFY SUBPARTITION 能不能在线重定向表空间

不能直接“重定向”,但可以在线移动(MOVE)—— 这是唯一能让已存在数据的 SUBPARTITION 换表空间的办法,代价是锁和 I/O 开销。

使用场景:归档冷数据到低速表空间,或把高频访问子分区挪到 SSD 表空间;但别在业务高峰期执行。

  • ALTER TABLE t MOVE SUBPARTITION sp1 TABLESPACE ts_fast; 是可行的,但会短暂持有 SS 锁,阻塞 DML
  • 移动后索引会失效,需手动 ALTER INDEX ... REBUILD SUBPARTITION,否则查询可能走全表扫描
  • 若表启用了行移动(ENABLE ROW MOVEMENT),不影响,但没启用也不影响 MOVE SUBPARTITION 本身
  • 不支持 ONLINE 关键字:Oracle 目前(截至 23c)所有版本都不允许 MOVE SUBPARTITION ... ONLINE

为什么 STORE IN 和 TABLESPACE 容易混淆

因为它们作用层级不同:STORE IN 是给多个子分区“轮询分配”的桶列表,而 TABLESPACE 是给单个子分区精确指定位置。

参数差异明显:一个面向批量,一个面向个体;混用会导致意外分布。

  • STORE IN (ts1, ts2) 只能在 CREATE 或 ADD PARTITION 时用于 SUBPARTITIONS 数量大于 1 的场景,Oracle 自动轮询分配新子分区
  • TABLESPACE ts1 必须写在每个 SUBPARTITION 名称后面,如 SUBPARTITION sp_jan_1 TABLESPACE ts_cold
  • 如果既写了 STORE IN 又对个别子分区写了 TABLESPACE,后者优先级更高,前者只覆盖未显式指定的子分区
  • 导出导入(expdp)时,STORE IN 不会被保留,而显式的 TABLESPACE 会;这是迁移后表空间错乱的常见原因

复合分区下子分区表空间变更对性能的影响

物理位置变化本身不改变执行计划,但 IO 路径、缓存局部性、ASM diskgroup 倾斜度会变——尤其当新旧表空间位于不同存储层时。

容易踩的坑是忽略底层 ASM 配置:比如把多个热子分区都移到同一个 failure group,反而放大单点故障风险。

  • 跨存储类型迁移(SATA → NVMe)后,首次查询可能因 buffer cache 未预热而慢,不是 SQL 问题
  • 如果新表空间 INITIAL extent 大小和原表空间不同,高并发插入可能触发更多 extent 分配争用
  • 审计或闪回数据归档(FLASHBACK ARCHIVE)启用时,子分区表空间变更不会自动同步到归档表空间,需单独检查
  • 最隐蔽的一点:DBA_TAB_SUBPARTITIONS 视图里 TABLESPACE_NAME 是最终生效值,但 DBA_SEGMENTS 里对应 segment 的 TABLESPACE_NAME 可能滞后(延迟块清理未完成),查之前先 ANALYZE TABLE ... VALIDATE STRUCTURE CASCADE

子分区级表空间控制很细,但也意味着每改一处都要确认三层:segment 层、extent 分配策略、以及 ASM 或文件系统层面的实际磁盘分布。漏掉任何一层,都可能让“精准分配”变成“精准踩坑”。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

961

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2753

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2770

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1569

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2193

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

2929

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4449

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

237

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

766

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习