《Oracle数据库管理与维护实战》——2.7 数据分区

简介:

本节书摘来自异步社区出版社《Oracle数据库管理与维护实战》一书中的第2章,第2.7节,作者: 何伟娜 , 常建功,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.7 数据分区

Oracle数据库管理与维护实战
巨型表或索引由于太大,在数据库系统会引起类似以下几条的很多问题。

因为表变得非常大,以至于要花费大量的时间对这张表进行管理。

对巨型表进行全表扫描,会花费系统大量的时间和资源。

一个事务要查询这张巨型表,如果由于磁盘错误,读写一个数据块发生错误,整个表就变得不能用。管理员恢复这张表要耗费很长时间。

为减少这类问题的发生,Oracle使用分区表和分区索引。

2.7.1 分区表

Oracle允许将表的存储分离为一些空间较小的存储单元,这些小的存储单元就称为分区。每个表的分区含有相同的数据类型和完整性约束,但每个分区之间可以含有不同的物理属性。例如,Oracle能够在不同的表空间中存储一个表的各个分区,并且每一个分区都可以设置pctfree、pctused等存储参数,分区表与普通表的物理存储如图2-26所示。

image

表分区有以下优点。

用户能对表分区单独创建、重建索引,能单独装载、备份恢复表分区数据。因为只对指定的表分区进行操作,所以比对整张表进行操作快得多。

表分区能提高查询性能。一般要查询的数据都在一个表分区中,所以不必对全表扫描,而只需对分区扫描。

表分区可以提高对表的并发操作。不同事务可以对同一表的不同分区同时进行操作。

分区表对用户来说是透明的,用户可以像操作一张普通的表一样操作分区表。

2.7.2 分区表的类型

Oracle表有几种分区方法:范围分区(Range Partitioning)、列表分区(List Partitioning)、散列分区(Hash Partitioning)、复合分区(Composite Partitioning)。

1.范围分区
Oracle支持范围分区表,根据表分区键值决定数据存储的分区。表分区键值是一个表字段值或多个字段值的组合(最多16个字段组合),但这些字段不能是LEVEL、ROWID或MLSLABEL等伪列。为防止表分区之间记录迁移,表分区键值不宜修改。为了理解范围分区表,下面我们举一个创建范围分区表的例子。以下是一张销售清单表,以销售日期为分区键值分区。

CREATE TABLE sales 
     (invoice_no NUMBER,
       sale_year  INT NOT NULL,
       sale_month INT NOT NULL,
       sale_day   INT NOT NULL)
   STORAGE (INITIAL 100K NEXT 50K) LOGGING 
   PARTITION BY RANGE (sale_year, sale_month, sale_day)
     (PARTITION sales_q1 VALUES LESS THAN (1999, 04, 01)
        TABLESPACE tsa STORAGE (INITIAL 20K, NEXT 10K),
       PARTITION sales_q2 VALUES LESS THAN (1999, 07, 01)
        TABLESPACE tsb,
       PARTITION sales_q3 VALUES LESS THAN (1999, 10, 01)
        TABLESPACE tsc,
       PARTITION sales q4 VALUES LESS THAN (2000, 01, 01)
        TABLESPACE tsd)
   ENABLE ROW MOVEMENT;

2.列表分区
列表分区和范围分区不同,范围分区以分区键值的范围为标准划分分区,而列表分区按照预先给定的一系列离散值进行分区。新数据插入表中时,根据分区键值找到对应分区。以下是建立列表分区的例子。

CREATE TABLE sales_list
(salesman_id  NUMBER(5), 
salesman_name VARCHAR2(30),
sales_state   VARCHAR2(20),
sales_amount  NUMBER(10), 
sales_date    DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'),
PARTITION sales_other VALUES(DEFAULT)
);

如以下一行数据,因为在分区sales_west中有 'Hawaii' ,所以这一行插入sales_west分区中。

(10, 'Jones', 'Hawaii', 100, '05-JAN-2000')

因为列表分区只根据离散值指定分区,所以有很多记录并不对应任何值,列表分区就将这些记录存储在一个默认的分区中。需要注意的是,列表分区只能用一列分区键值,而不能像范围分区一样能定多个分区键值。

3.散列分区
散列分区的分区方法完全不同于范围分区和列表分区。散列分区先通过散列函数对分区键值计算,根据计算结果确定记录存储到哪个分区。散列分区的定义比较简单,使用也比较方便。散列分区适用于以下几种情况:

事先不知道指定的范围内将会有多少数据,此时可以用散列分区。

如果用范围分区,各区之间数据量差异将会很大,并且很难人工干预达到各分区间数据量平衡,此时可以用散列分区。

以下是一个定义散列分区的例子。

CREATE TABLE sales_hash
(salesman_id  NUMBER(5), 
salesman_name VARCHAR2(30), 
sales_amount  NUMBER(10), 
week_no       NUMBER(2)) 
PARTITION BY HASH(salesman_id) 
PARTITIONS 4 
STORE IN (ts1, ts2, ts3, ts4);

4.复合分区
复合分区是将范围分区和列表分区或散列分区混合使用的一种分区方法。复合分区在分区上用的是范围分区,而在每个分区上又可以用列表分区法或散列分区分成多个子分区,所以复合分区又分为范围散列分区和范围列表分区两种类型。图2-27是范围列表分区的存储示意图。

image

图2-27中纵向是根据月份来划分的范围分区,每个范围分区又以列表方式划分为3个子分区。使用复合分区的优点是能吸取多个分区类型的优点。

2.7.3 分区索引

与表一样,索引可以分区,叫作分区索引,每个索引必须有相同的索引列,但可以有不同的存储特性。一个索引的分区键值决定在哪个分区存储索引项。一个索引的分区必须包含一个或多个被索引的列。索引分区的定义和表分区定义类似。不论是分区表还是非分区表,用户都可以给它建立分区索引。

2.7.4 索引的类型

只有当索引本身很大时,分区索引才有必要创建。分区索引的主列选择和普通索引的主列选择一样。分区索引有两种类型:本地索引和全局分区索引。

1.本地索引
如果两个或两个以上的数据库对象有相同的逻辑分区属性,例如两张分区表有相同的分区键值和相同的分区范围,那么它们就是相同的分区。如果一张分区表和分区索引具有相同的逻辑分区属性,那么这两个索引就是具有相同分区的本地索引,如图2-28所示。

image

创建本地索引比较容易,范围说明和最大索引值可以不指定。分区索引会自动从分区表中获得这些属性。

2.全局索引
用户可以创建一个和分区表不同分区属性的索引,这就是全局分区索引。全局分区索引覆盖了整个表的范围,和表分区没有任何联系,不分区的表也可以创建全局索引。全局索引在OLTP环境下能够提供比本地索引更好的性能。图2-29是全局索引的使用示例。

image

2.7.5 表分区和分区管理

用户可以对表的每个分区进行单独命名,也可以像操作一张普通表一样对这个命名的表分区进行存取。使用命名表分区能够方便开发人员,并且能减少查询的冗余。虽然开发人员可以像操作表一样操作命名分区,但是表分区毕竟涉及到表的物理存储方式,还是尽量不要轻易使用。Oracle提供了很多操作分区表的方法,这些方法对表调优很有用。

分区表和非分区表可以互相转化。

用户可以在一个已有的表分区后添加新分区。

用户可以分割合并表分区。

用户可以删除表中不含任何记录的分区。

用户可以删除指定的表分区而不删除整个表。

相关文章
|
9天前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
34 2
|
8天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
10天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
5天前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
14天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云数据库重磅升级!元数据服务OneMeta + OneOps统一管理多模态数据
|
24天前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
46 6
|
8天前
|
SQL Oracle 关系型数据库
Oracle数据库管理:从入门到精通
表(Table):表是Oracle数据库中存储数据的基本结构单元,由行(Row)和列(Column)组成。每行代表一个记录,每列代表一个字段。 SQL(Structured Query Language):SQL是Oracle数据库的核心语言,用于与数据库交互,执行查询、插入、更新和删除等操作。 数据库实例与数据库:在Oracle中,数据库实例是一组后台进程和内存结构,用于管理数据库并提供服务。而数据库则是数据的物理存储,包括数据文件、控制文件、联机日志和参数文件等。
29 0
|
20天前
|
SQL 存储 数据库
MSSQL遍历数据库根据列值查询数据
【9月更文挑战第12天】在 SQL Server 中,可以通过游标或临时表遍历数据库并根据列值查询数据。示例展示了如何创建临时表存储数据库名,并通过循环遍历这些名称来执行特定查询。需替换 `YourTableName`、`YourColumnName` 和 `YourValue` 为实际值。此方法要求有足够权限访问各数据库。若无跨库权限,需分别执行查询。
|
26天前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
30 0

推荐镜像

更多
下一篇
无影云桌面