4. 分区、视图与其他对象
4.1. 分区概述
分区允许您将非常大的表和索引分解成更小、更易于管理的部分,称为分区。每个分区是一个独立的对象,有自己的名称,并且可以选择拥有自己的存储特性。
为了说明分区的概念,假设一个人力资源经理有一个大盒子,里面装着员工文件夹。每个文件夹都列出了员工的雇用日期。经常有查询是针对特定月份雇用的员工。满足这类请求的一种方法是在员工雇用日期上创建一个索引,指明分散在整个盒子中的文件夹的位置。相比之下,分区策略使用许多较小的盒子,每个盒子包含特定月份雇用的员工文件夹。
使用较小的盒子有几个优点。当被要求检索6月份雇用的员工文件夹时,人力资源经理可以检索6月份的盒子。此外,如果任何小盒子暂时受损,其他小盒子仍然可用。搬家也变得更容易,因为经理不需要移动一个沉重的大盒子,而是可以移动几个小盒子。从应用程序的角度来看,只存在一个模式对象。DML语句不需要修改就可以访问分区表。分区对于许多不同类型的数据库应用程序都很有用,特别是那些管理大量数据的应用程序。好处包括:
-
提高可用性
一个分区的不可用并不会导致整个对象的不可用。查询优化器会自动从查询计划中移除未被引用的分区,因此当分区不可用时,查询不会受到影响。 -
更简便的模式对象管理
分区对象有可以集体或单独管理的部分。DDL语句可以操作分区,而不是整个表或索引。因此,您可以将重建索引或表等资源密集型任务分解。例如,您可以一次移动一个表分区。如果出现问题,那么只需要重新执行分区移动,而不需要重新移动整个表。此外,删除分区避免了执行大量的DELETE语句。 -
在OLTP系统中减少对共享资源的争用
在某些OLTP系统中,分区可以减少对共享资源的争用。例如,DML操作分布在多个片段上,而不是一个片段。 -
在数据仓库中增强查询性能
在数据仓库中,分区可以加速处理临时查询。例如,包含一百万行的销售表可以按季度分区。
4.1.1. 分区的特点
表或索引的每个分区必须具有相同的逻辑属性,例如列名、数据类型和约束。例如,表中的所有分区共享相同的列和约束定义,索引中的所有分区共享相同的索引列。然而,每个分区可以具有独立的物理属性,例如它所属的表空间。
4.1.1.1. 分区键
分区键是一组一个或多个列,它决定了分区表中每一行应该进入哪个分区。每一行都明确无误地被分配到一个单一的分区。在sale
表中,您可以指定time_id
列为范围分区的键。数据库根据此列中的日期是否落在指定范围内来分配行到分区。Oracle数据库通过使用分区键自动将插入、更新和删除操作定向到适当的分区。