详解Oracle表的类型(二)
1.引言:
Oracle数据库提供了多种表类型,以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。
2. 分区表
分区表是Oracle数据库中一种重要的表类型,它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活性和数据可用性。
2.1 定义:
分区表是根据指定的分区键将表数据分割成多个逻辑部分,每个部分称为一个分区。从逻辑上看,分区表仍然是一个完整的表,但在物理上,它的数据被分散存储在不同的分区中。
2.2 特点:
- 提高查询性能:通过分区裁剪(Partition Pruning)技术,Oracle可以仅扫描与查询条件相关的分区,从而显著减少I/O负载,提高查询速度。
- 增强管理灵活性:每个分区可以独立进行管理,包括备份、恢复、加载、卸载和索引等操作。这大大降低了维护成本,并提高了管理效率。
- 提高数据可用性:当一个分区出现故障时,不会影响其他分区的正常使用。此外,分区表还支持并行处理,可以进一步提高系统性能。
2.3 分区类型
Oracle提供了多种分区类型,以满足不同的业务需求:
- 范围分区(Range Partitioning):根据分区键的数值范围来划分分区。例如,可以按照时间范围(如年份、月份)或数值范围(如订单金额)来划分分区。
- 列表分区(List Partitioning):根据分区键的离散值来划分分区。例如,可以按照地区、部门或产品类型来划分分区。
- 哈希分区(Hash Partitioning):根据分区键的哈希值来划分分区。哈希分区可以确保数据在分区间的均匀分布,但无法控制数据的具体分布。
- 组合分区(Composite Partitioning):结合使用范围分区和列表分区或哈希分区。例如,可以先按照时间范围进行范围分区,然后在每个范围内再按照地区进行列表分区。
2.4 分区键设计
分区键是决定表数据如何分配到不同分区的关键。在选择分区键时,应考虑以下几点:
- 唯一性:分区键应具有足够的选择性,以确保数据能够均匀地分布到各个分区中。
- 查询性能:分区键应与查询条件紧密相关,以便利用分区裁剪技术提高查询性能。
- 更新频率:分区键的更新频率应尽可能低,以减少分区移动和合并的开销。
2.5 分区表的优势
- 提高查询性能:通过分区裁剪和并行处理,可以显著提高查询速度。
- 增强管理灵活性:每个分区可以独立进行管理,降低了维护成本,并提高了管理效率。
- 提高数据可用性:当一个分区出现故障时,不会影响其他分区的正常使用,从而提高了系统的整体可用性。
- 优化存储空间:可以将不同的分区存储在不同的表空间中,以优化存储空间的使用。
2.6 分区表的使用场景
Oracle分区表主要应用于需要处理大量数据的场合,以提高数据库的性能、可管理性和可用性。
2.6.1 应用场合
- 大型数据库:当单表数据量非常大时(例如超过2GB),使用分区表可以显著提高查询性能和数据管理效率。
- 历史数据管理:对于包含大量历史数据的表,使用分区表可以方便地将新数据添加到新的分区中,同时保留历史数据以便查询和分析。
- 高并发访问:在高并发访问的系统中,通过分区表可以分散I/O负载,提高系统的并发处理能力。
- 数据备份和恢复:分区表允许用户独立地备份和恢复每个分区的数据,从而简化了数据备份和恢复的过程。
2.6.2 范例演示
- 范围分区(Range Partitioning)
应用场合:适用于基于时间顺序的数据,如日志表、销售记录表等。
假设有一个包含销售订单的orders表,该表非常大,并且经常按日期查询数据。可以按月份对order_date字段进行范围分区:
CREATE TABLE orders (order_id NUMBER,customer_id NUMBER,order_date DATE,total_amount NUMBER
) PARTITION BY RANGE (order_date) (PARTITION p_2023q1 VALUES LESS THAN (TO_DATE('01-APR-2023', 'DD-MON-YYYY')),PARTITION p_2023q2 VALUES LESS THAN (TO_DATE('01-JUL-2023', 'DD-MON-YYYY')),PARTITION p_2023q3 VALUES LESS THAN (TO_DATE('01-OCT-2023', 'DD-MON-YYYY')),PARTITION p_2023q4 VALUES LESS THAN (TO_DATE('01-JAN-2024', 'DD-MON-YYYY'))
);
在这个例子中,orders表被划分为四个季度的分区。如果查询是针对特定季度的数据,那么Oracle只会扫描相关的分区,而不是整个表。
- 列表分区(List Partitioning)
应用场合:适用于基于离散值列表的数据,如地区表、状态表等。
假设有一个regions表,其中包含不同国家的信息,并且想根据洲来划分数据:
CREATE TABLE regions (region_id NUMBER,country_name VARCHAR2(50),continent VARCHAR2(20)
) PARTITION BY LIST (continent) (PARTITION p_north_america VALUES ('North America'),PARTITION p_south_america VALUES ('South America'),PARTITION p_europe VALUES ('Europe'),PARTITION p_asia VALUES ('Asia'),PARTITION p_africa VALUES ('Africa'),PARTITION p_oceania VALUES ('Oceania')
);
在这个例子中,regions表被划分为六个分区,每个分区对应一个洲。
- 哈希分区(Hash Partitioning)
应用场合:适用于无法有效划分范围或列表的数据,如用户表、会话表等。
假设有一个users表,需要均匀分布用户数据以平衡I/O负载:
CREATE TABLE users (user_id NUMBER,username VARCHAR2(50),email VARCHAR2(100)
) PARTITION BY HASH (user_id) PARTITIONS 4;
在这个例子中,users表被均匀分成四个分区,分区键是user_id。
- 组合分区(Composite Partitioning)
应用场合:适用于需要更细粒度分区的数据,如销售记录表、订单详情表等。
假设有一个sales表,首先按年份进行范围分区,然后在每个年份内按product_id进行哈希子分区:
CREATE TABLE sales (sale_id NUMBER,product_id NUMBER,sale_date DATE,amount NUMBER
) PARTITION BY RANGE (sale_date) SUBPARTITION BY HASH (product_id) SUBPARTITIONS 4 (PARTITION p_2023 VALUES LESS THAN (TO_DATE('01-JAN-2024', 'DD-MON-YYYY')),PARTITION p_2024 VALUES LESS THAN (TO_DATE('01-JAN-2025', 'DD-MON-YYYY'))
);
在这个例子中,sales表首先按年份范围分区,然后在每个年份内按product_id进行哈希子分区。
2.7 分区表综合案例
- 实际开发中会遇到这样的场景:创建一个分区表,将每天0-24点的数据存到对应分区,再按照每天存到每月,再按照每月存到年分区。
- 建议:此场景可以使用复合分区(Composite Partitioning)。具体来说,这里可以使用子分区(Subpartitioning),结合范围分区(Range Partitioning)和列表分区(List Partitioning)或者范围-范围分区(Range-Range Partitioning)。
- 演示:假设我们有一个表 sales_data,它包含销售数据,并希望按照你描述的方式进行分区:
CREATE TABLE sales_data (sale_id NUMBER PRIMARY KEY,sale_date DATE,amount NUMBER,customer_id NUMBER,product_id NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY RANGE (TO_CHAR(sale_date, 'DD'))
SUBPARTITION TEMPLATE (SUBPARTITION sp_day_01 VALUES LESS THAN ('02'),SUBPARTITION sp_day_02 VALUES LESS THAN ('03'),... -- 继续为每天创建一个子分区SUBPARTITION sp_day_30 VALUES LESS THAN ('31'),SUBPARTITION sp_day_31 VALUES LESS THAN (MAXVALUE) -- 处理月份中可能有30或31天的情况
)
(PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))-- 可以按需添加更多年度分区
);
-- 注意:上述示例中子分区模板为每天创建了子分区,
-- 但是这种方式写起来会比较冗长。可以用类似方式扩展每月的分区。
-- 为了简化,以下示例展示如何按月创建子分区,并进一步简化。-- 创建一个按年-月-日分区的表
CREATE TABLE sales_data (sale_id NUMBER PRIMARY KEY,sale_date DATE,amount NUMBER,customer_id NUMBER,product_id NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY RANGE (TO_CHAR(sale_date, 'MM'))
SUBPARTITION TEMPLATE (SUBPARTITION sp_jan VALUES LESS THAN ('02'),SUBPARTITION sp_feb VALUES LESS THAN ('03'),SUBPARTITION sp_mar VALUES LESS THAN ('04'),SUBPARTITION sp_apr VALUES LESS THAN ('05'),SUBPARTITION sp_may VALUES LESS THAN ('06'),SUBPARTITION sp_jun VALUES LESS THAN ('07'),SUBPARTITION sp_jul VALUES LESS THAN ('08'),SUBPARTITION sp_aug VALUES LESS THAN ('09'),SUBPARTITION sp_sep VALUES LESS THAN ('10'),SUBPARTITION sp_oct VALUES LESS THAN ('11'),SUBPARTITION sp_nov VALUES LESS THAN ('12'),SUBPARTITION sp_dec VALUES LESS THAN ('13')(SUBPARTITION sp_day_01 VALUES LESS THAN (TO_DATE('2022-01-02', 'YYYY-MM-DD')),SUBPARTITION sp_day_02 VALUES LESS THAN (TO_DATE('2022-01-03', 'YYYY-MM-DD')),-- 按需添加更多天的分区,可以使用脚本生成这些分区SUBPARTITION sp_day_31 VALUES LESS THAN (TO_DATE('2022-02-01', 'YYYY-MM-DD')) -- 简化示例,假设每月31天)
)
(PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))-- 按需添加更多年度分区
);
-- 说明:
-- 1. 上面的示例展示了如何创建年度分区,并在年度分区下创建月度子分区。
-- 2. 每月的子分区模板中再进一步按天分区。为了简化示例,假设每月31天,实际应用时需要细化。
-- 3. 可以使用脚本生成复杂的分区结构,特别是按天分区部分,以避免手动错误。
- 特别说明:创建如此多的分区(特别是按天分区)会使分区管理变得复杂,在创建前务必弄清楚需求。
2.8 分区表注意事项
- 分区键选择:应谨慎选择分区键,以确保数据能够均匀地分布到各个分区中。
- 分区数量:分区数量不宜过多或过少。过多的分区会增加管理开销和查询复杂性;过少的分区则无法充分利用分区表的优势。
- 性能监控:大量的分区会影响查询性能及DML操作性能,需要权衡分区数量和性能之间的关系。应定期监控分区表的性能,包括查询速度、I/O负载和分区使用情况等,以便及时调整分区策略和优化性能。
- 维护:定期添加新的分区(例如新的年度或月度分区)需要自动化脚本支持,以减少人工干预。
- 分区模板:SUBPARTITION TEMPLATE 是一个强大的特性,可以简化分区表的定义,但要注意模板中的范围定义。
2.9 总结
Oracle分区表通过将大表划分为多个小的、可管理的分区,显著提高了数据库的性能、可管理性和可用性。在实际应用中,可以根据数据的特性和查询需求选择合适的分区策略,以实现最佳的性能和可维护性。
本篇完结。
关注作者,您将获得更多OCP考试及Oracle DB方面的实战经验。后续不定期分享DB核心知识和排障案例及经验、性能调优等
相关文章:

详解Oracle表的类型(二)
1.引言: Oracle数据库提供了多种表类型,以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。 2. 分区表 分区表是Oracle数据库中一种重要的表类型,它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活…...

Docker--通过Docker容器创建一个Web服务器
Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…...

Next.js-样式处理
#题引:我认为跟着官方文档学习不会走歪路 Next.js 支持多种为应用程序添加样式的方法,包括: CSS Modules:创建局部作用域的 CSS 类,避免命名冲突并提高可维护性。全局 CSS:使用简单,对于有传统…...

整合Springboot shiro jpa mysql 实现权限管理系统(附源码地址)
一、在开发企业级应用时,权限管理是一个至关重要的功能。本文将围绕 Spring Boot、JPA、MySQL 和 Apache Shiro,构建一个基础的权限管理系统,涵盖用户认证与授权等核心功能。 一、技术选型及框架介绍 Spring Boot:简化 Spring 应用的配置和开发。JPA:实现数据持久化,提供…...

极智嘉嵌入式面试题及参考答案
对于交叉编译器的理解 交叉编译器是一种在一个计算机平台上为另一个不同架构的计算机平台生成可执行代码的编译器。它在嵌入式系统开发中起着关键作用。 从其必要性来看,嵌入式系统通常使用的处理器架构与我们日常使用的 PC 等通用计算机不同,如 ARM、MI…...

【MySQL】数据库核心技术与应用指南
数据库的各种概念 1. 指一门学科《数据库原理与应用》。(研究如何设计实现一个数据库) 2. 指一类用来管理数据的软件。 3. 指某一个具体的数据库软件。 4. 指部署了某个数据库软件的电脑。 数据库软件 关系型数据库 1. 使用 “表” 的结构来组织数据。…...

23省赛区块链应用与维护(房屋租凭)
23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…...

深度学习4
一、手动构建模型 epoch 一次完整数据的训练过程(可细分多次训练),称为 一代训练 Batch 小部分样本对权重的更新,称为 一批数据 iteration 使用一个 Batch 的过程,称为 一次训练 步骤: 1、生成 x,y 的…...

跳绳视觉计数方案
产品概述 提供基于摄像头视觉技术的跳绳计数解决方案,可精准完成跳绳动作的实时计数,效果完全满足考试水平的要求。方案采用先进的计算机视觉算法,结合高效的模型架构,确保计数的准确性和稳定性。适用场景 学校体育考试ÿ…...

TEA加密逆向
IDA伪代码 do{if ( v15 )v17 v38; // x120x0->0x79168ba790, 输入字符串经过check1处理后字符串elsev17 v40;v18 (unsigned int *)&v17[v16]; // 0x78cbbd47fc add x12, x12, x8 ; x120x79168ba790->…...

LeetCode 404.左叶子之和
题目:给定二叉树的根节点 root ,返回所有左叶子之和。 思路:一个节点为「左叶子」节点,当且仅当它是某个节点的左子节点,并且它是一个叶子结点。因此我们可以考虑对整 node 时,如果它的左子节点是一个叶子…...

01-go入门
文章目录 Go语言学习1. 简介安装windows安装linux安装编译工具安装-goland 2. 入门2.1 Helloworld注释 2.2 变量初始化打印内存地址变量交换匿名变量作用域局部变量全局变量 2.3 常量iota 2.4 数据类型布尔整数浮点类型复数字符串定义字符串字符串拼接符定义多行字符串 map数据…...

【经典】抽奖系统(HTML,CSS、JS)
目录 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍: 使用方法: 完整代码: 一个简单但功能强大的抽奖系统的示例,用于在网页上实现抽奖。 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍: 参与者添加&…...

GoF设计模式——结构型设计模式分析与应用
文章目录 UML图的结构主要表现为:继承(抽象)、关联 、组合或聚合 的三种关系。1. 继承(抽象,泛化关系)2. 关联3. 组合/聚合各种可能的配合:1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…...

Java后端如何进行文件上传和下载 —— 本地版
简介: 本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。 大体思路 1、文件上传 …...

json格式数据集转换成yolo的txt格式数据集
这个代码是参考了两个博客 我是感觉第一篇博客可能有问题,然后自己做了改进,如果我是错误的或者正确的,请各位评论区说一下,感谢 Json格式的数据集标签转化为有效的txt格式(data_coco)_train.json-CSDN博客 COCO(.j…...

什么是Three.js,有什么特点
什么是 Three.js? Three.js 是一个基于 WebGL 技术的 JavaScript 3D 库。它允许开发者在网页上创建和展示 3D 图形内容,而无需用户安装任何额外的插件或软件。Three.js 简化了 WebGL 的复杂性,使得即便是对图形编程不太熟悉的人也能快速上手…...

Linux笔记--基于OCRmyPDF将扫描件PDF转换为可搜索的PDF
1--官方仓库 https://github.com/ocrmypdf/OCRmyPDF 2--基本步骤 # 安装ocrmypdf库 sudo apt install ocrmypdf# 安装简体中文库 sudo apt-get install tesseract-ocr-chi-sim# 转换 # -l 表示使用的语言 # --force-ocr 防止出现以下错误:ERROR - PriorOcrFoundE…...

Unity 导出 Xcode 工程 修改 Podfile 文件
Unity 导出 Xcode 工程 修改 Podfile 文件 在 Editor 文件夹下新建 xxx.cs 脚本 实现静态方法 [PostProcessBuild]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject){// Unity 导出 Xcode 工程自动调用这个方法 }using System.IO; using…...

UE5 slate BlankProgram独立程序系列
源码版Engine\Source\Programs\中copy BlankProgram文件夹,重命名为ASlateLearning,修改所有文件命名及内部名称。 ASlateLearning.Target.cs // Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool; using System.Collections.Ge…...

内存不足引发C++程序闪退崩溃问题的分析与总结
目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败,返回NULL 2.2、new申请内存失败,抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…...

C++ —— 以真我之名 如飞花般绚丽 - 智能指针
目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…...

Linux中安装InfluxDB
什么是InfluxDB InfluxDB是一个开源的时间序列数据库,专为处理时间序列数据而设计。时间序列数据是指带有时间戳的数据点,例如传感器数据、应用程序日志、服务器指标等。InfluxDB 由 InfluxData 公司开发,广泛应用于物联网(IoT&am…...

nginx服务器实现上传文件功能_使用nginx-upload-module模块
目录 conf文件内容如下html文件内容如下上传文件功能展示 conf文件内容如下 #user nobody; worker_processes 1;error_log /usr/logs/error.log; #error_log /usr/logs/error.log notice; #error_log /usr/logs/error.log info;#pid /usr/logs/nginx.pid;events …...

ORB-SLAM2源码学习:Initializer.cc:Initializer::ComputeF21地图初始化——计算基础矩阵
前言 在平面场景我们通过求解单应矩阵H来求解位姿,但是我们在实际中常见的都是非平面场景, 此时需要用基础矩阵F求解位姿。 1.函数声明 cv::Mat Initializer::ComputeF21(const vector<cv::Point2f> &vP1, const vector<cv::Point2f>…...

C# 读取多条数据记录导出到 Word标签模板之图片输出改造
目录 应用需求 设计 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 调用示例 小结 应用需求 在我的文章《C# 读取多条数据记录导出到 Word 标签模板》里,讲述读取多条数据记录结合 WORD 标签模板输出文件的功能,原有输出图片的…...

NSSCTF web刷题
1 虽然找到了flag,但是我要怎么去改他的代码,让他直接输出flag呢? (好像是要得到他的json代码,这题不让看) 2 wllm应该就是他的密码,进入许可了 意思是服务器可以执行通过POST的请求方式传入参数为wllm的命令,那这就是典型的命令执行,当然,…...

对象排序得到方式
java实现 list 排序的方式,有三种 ① 对象实现Comparable 接口,然后代码里直接调用Collections.sort(list) ②使用内部类Comparator ③使用stream.sort 代码如下 实现Comparable接口的实体类 Data public class Student implements Comparable<Stud…...

Day2 洛谷1035+1047+1085+1089+1150+1151
零基础洛谷刷题记录 Day1 2024.11.18 Day2 2024.11.25 文章目录 零基础洛谷刷题记录1035:题目描述1035:解答代码1035:学习成果1047:题目描述(成功写出)1047:解答代码1047:学习成果1085…...

Linux:进程间通信之进程池和日志
一、进程池的设计 因为每一次我们要进行进程间通信都需要fork,和操作系统做交互是存在很大成本的,所以我们是不是可以提前fork出几个进程,然后当我们想要使用的时候直接去给他们安排任务,这样就减少了系统调用的次数从而提高了内存…...