oracle数据库中分区技术指导手册内容摘要:

区索引 ,这个索引在上面的数据字典 user_part_indexes 查询中得知是 Global 型的 Prefixed 索引。 下面我们再来创建一个分区表上的 Global Prefixed Oracle 数据库中分区技术指导手册 第 16 页 型分区索引,见下面的例子: 检索 分区 检索分区实际上 跟 检索表 或索引 没有 任何 分别 , 因为分区对于应用端 sql语句 来讲是完全透明的, 应用程序并不会因为表或索引是分区的而采取不一样的 sql 语法,相反对于分区表Oracle 还提供给我们一个额外的选项来检索分区。 下面通过例子来加以说明: Oracle 数据库中分区技术指导手册 第 17 页 上述例子我们检索 Hash 分区表 partition_hash,第一个查询语句非常普通 ,第二第三个查询语句用到了分区表的一个额外选项那就是可以限制查询在特 定的分区上进行 ,第四个查询语句 没有查询到记录是由于 这条记录存放在表分区 p_2 上,但限定的查询分区是 p_1 上。 第五个语句更新分区 p_4 上所有记录。 分区特性 在第 2 章探讨分区在性能方面的优势时提到过 Partition Pruning 和 PartitionWise Join这两个特性, 真是由于这两个特性使得分区 在处理海量数据的大表时有很高的性能优势。 这里将详细分析 其中的原理和机制。 分区 Pruning Pruning 在中文的意思为 “剪除” ,首先通过字面意思去理解的话是分区剪除。 当 对表 或索引 进行 读写 时, Oracle 能识别到要 读写 那些分区和子分区 , 而不会去不相关的分区和子分区中 进行读写。 对应用发出的每个 sql 语句, Oracle 首先根据用户的查询条件 静态或动态地避免访问不相关地分区和子分区。 前面的例子中我们检索 Range分区表 partition_range 中 2020032 号的数据时就是通过 Partition Pruning 来 避免访问 其他日期的数据。 可通过 该查询语句的执行计划来看看具体 Oracle 是如何执行该语句的: Oracle 数据库中分区技术指导手册 第 18 页 从上述查询结果得知 执行计划中使用了 “ PARTITION RANGE SINGLE”来检索单 个 分区的数据行,并且检索分区的位置起始 Pstart 和结束 Pstop 都是 6,而位置为 6 的分区巧巧是2020032 号对应的分区表数据。 这种情况下 Oracle 在 编译 解析该查询语句时 可 通过 where条件中的 createdate 能 定位到具体要 Pruning 哪些分区, 此时的 Pruning 是静态的。 有时 where 条件中 应用 并不能静态固定具体的值供去 Pruning,比如说 可能考虑到绑定变量 的使用,这种情况下 Oracle 在编译解析语句时是不能确定具体那些分区需 Pruning,需在运行期间才能确定,此时的 Pruning 是 动态的。 下面是一个使用绑定变量动态传入 where 条件中列值的例子 : v_day是变量 ,在执行计划中 Pstart和 Pstop的值显示为 KEY, 表明走的是动态的 Partition Pruning,需在执行期间才能确定要访问那些表分区。 当然也有一些例外将导致不能使用上 Partition Pruning, 好比表上有 良好 的索引但 where Oracle 数据库中分区技术指导手册 第 19 页 条件就是不能使用上该索引一样。 同索引的使用注意事项,对于 PartitionPruning要特别留意数据类型的转化和函数的套用,比如 : where createdate=’2020032’ 、 where trunc(createdate)=sysdate 等等。 分区 Wise Join Oracle通过 PartitionWise Join技术将两 分区 表的连接拆分成 许多 小的连接, 关联操作被分解成多个子操作 后 Hash join,此时若再并行来执行将数据处理均匀分布给多个子进程,减少并行关联过程中各个子进程间的数据交换量,从而提高性能。 当关联的两表均为基于关联字段的分区时,此时最有利 连接执行 , Oracle将通过 Full方式的 Partition Wise Join去执行。 若只要一张表时 基于关联字段的分区,此时通过 Partial方式的Partition Wise Join去执行。 如下的例子是 在开启了并行处理 paralle机制后 Full方式 的执行计划和并行处理机制图。 执行计划如下: Oracle 数据库中分区技术指导手册 第 20 页 并行处理机制图如下: 4 分区管理与维护 当表或索引分区后 相对普通表或索引来讲 结构 显得有些复杂 ,尤其当表或索引有多个分区和子分区后 所带来的管理与维护工作也相应 突出起来。 由于分区表和分区索引往往存在海量数据量的大表上,并且这些大表往往支撑着应用的核心 功能,所以 管理与维护 分区是系统维护人员(比如 DBA)的 日常工作之一,必须很慎重操作才行。 Oracle 数据库中分区技术指导手册 第 21 页 DDL 操作 Add 分区 对于一些日期型的 Range 分区,随着时间的推移,往往需要在月末、季度末、年末等添加新日期区间的分区 才能读写相应的业务数据 ,这时 就会发生添加 分区的操作。 下面的例子是 添加新的分区 p_20200308 到 Range 分区表 partition_range 中 : 需要注意的是 对于 Range 型的分区表 新加的分区只能位于已有分区的最大分区后,所以上述例子中 先 drop掉 Range分区中 的默认最大分区 maxvalue后 才可以添加具体日期的分区。 其他类型的分区( List 分区 、 Hash 分区和组合分区)同样可以 添加新的分区 , 这里就不一一阐述和举例了。 Drop 分区 当 drop 一个分区时 ,该分区的数据和对应的数据字典定义都将 从数据库中清除掉 ,如果有本地的分区索引的话, 对应的分区索引也将清除掉。 如下的例子是 drop 掉 Range 型分区partition_range 中最小的分区 P_20200226 的语句: Rename 分区 分区名跟表名一样也是可以重新命名的。 如下语句将 List 分区表的分区 P_NOACTIVE 改名为P_INACTIVE: Oracle 数据库中分区技术指导手册 第 22 页 Truncate 分区 truncate 分区跟 truncate 普通表一样 只把对应的分区数据清理掉,回收分区数据空间和对应的本地分区索引数据空间并且保留数据字典定义。 如下例子是 truncate 分区表partition_range 中分区 P_20200227 的执行语句: Move 分区 move 分区跟 move 普通表一样只把对应的分区表从一个表空间迁移到另外一个新的表空间上 ,这在重组分区数据时会经常用到。 如下例子是 move 分区表的分区 P_ACTIVE 从表空间 shiyihai 到新的表空间 users 的执行语句: Merge 分区 有时需要将 两个分区合并成一个分区 来进行管理,这时就要用到 merge 用法。 如下例子是 将 Range 分区表 partition_range中最小的两个分区 p_20200227和 p_20200228 合并成一个新的分区 p_min 的执行语句: Oracle 数据库中分区技术指导手册 第 23 页 Split 分区 跟 merge 分区 逆向 操作的动作是 split 分区,将一个 已有 分区分离成两个新的分区 ,这对于拆分大数据量的分区为小分区来易于管理和备份等是很有好处的。 如下的例子是将 Range分区表 partition_range 中的最大分区 p_max 分解成两个分区 p_20200310 和 p_max 的执行语句: Oracle 数据库中分区技术指导手册 第 24 页 Exchange 分区 分区表中的分区有别于非分区的普通表, 虽然在数据库字典定义中都是表。 我们可以将分区表中的分区转换为普通表,同时也可将普通的非分区表加入分区表大家族成为其中的一个分区 ,其中需要用到的操作是 exchange。 如下的例子 均体现在 Range 分区表 partition_range上, 例子中首先将分区 P_20200229 转换为普通表 T_P_20200229,然后再将该表 加入到分区表中成为一个分区,见如下的执行语句: 通过查询结果可以看到, exchange表分区后分区依然存 在 表的数据字典定义中 ,但下面的查询结果表明 对应的表分区是空的,数据已经转换到表 T_P_20200229 中。 Oracle 数据库中分区技术指导手册 第 25 页 在将普通表 T_P_20200229 给 exchange 回 分区表中时抛了异常 ORA14130,这是由于exchange 回分区表时需保证普通表跟分区表的结构和约束均一致才行。 同样的普通表的数据将“滑入”分区表中的分区 P_20200229 上。 分区 属性 跟分区相关的数据字典有很多, 下面列出来常见的一些 ,这些分区的拥有者均可以访问 ,通过查询这些数据字典可以获取分区的所有属性。 数据字典名 描述 user_tab_partitions 用户下所有的分区表信息 user_tab_subpartitions 用户下所有的子分区表信息 user_ind_partitions 用户下所有的索引分区信息 user_ind_subpartitions 用户下所有的索引子分区信息 user_part_indexes 用户下所有的分区索引信息 user_tables/user_indexes 用户下所有的表 /索引信息 当我们在创建分区表或分区索引的时候, 表分区或索引分区的属性 会 自动 继承对应表或索引的属性,这 些属性包括物理 存储 参数、 统计分析、 日志监控、状态等等。 当然除非表分 Oracle 数据库中分区技术指导手册 第 26 页 区或索引分区有自己的属性设置,并且这些属性也是可以手工修改的。 如下的例子将 修改分区表 partition_list 的分区属性,见下面的执行语句: 当然我们也可在创建分区表或分区索引的时候指定每个表分区或索引分区的各种索引,否则的话将默认为相应分区表或分区索引的属性。 行迁移 分区表在作 update更新操作时,若对应分区键值也发生了更新,将有可能导致更新的数据行 不再匹配已有的分区规则, 这时若分区表不支持行迁移的话将发生异常 ORA14402, 导致更新不成功。 如果 分区表 支持行迁移 则将使得更新的数据行依据分区规则转入另外的分区中。 见如下的例子: Oracle 数据库中分区技术指导手册 第 27 页 Id 为 7。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。