当前位置: 首页 > news >正文

详解Oracle表的类型(二)

1.引言:

Oracle数据库提供了多种表类型,以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。

2. 分区表

分区表是Oracle数据库中一种重要的表类型,它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活性和数据可用性。

2.1 定义:

分区表是根据指定的分区键将表数据分割成多个逻辑部分,每个部分称为一个分区。从逻辑上看,分区表仍然是一个完整的表,但在物理上,它的数据被分散存储在不同的分区中。

2.2 特点:

  1. 提高查询性能:通过分区裁剪(Partition Pruning)技术,Oracle可以仅扫描与查询条件相关的分区,从而显著减少I/O负载,提高查询速度。
  2. 增强管理灵活性:每个分区可以独立进行管理,包括备份、恢复、加载、卸载和索引等操作。这大大降低了维护成本,并提高了管理效率。
  3. 提高数据可用性:当一个分区出现故障时,不会影响其他分区的正常使用。此外,分区表还支持并行处理,可以进一步提高系统性能。

2.3 分区类型

Oracle提供了多种分区类型,以满足不同的业务需求:

  1. 范围分区(Range Partitioning):根据分区键的数值范围来划分分区。例如,可以按照时间范围(如年份、月份)或数值范围(如订单金额)来划分分区。
  2. 列表分区(List Partitioning):根据分区键的离散值来划分分区。例如,可以按照地区、部门或产品类型来划分分区。
  3. 哈希分区(Hash Partitioning):根据分区键的哈希值来划分分区。哈希分区可以确保数据在分区间的均匀分布,但无法控制数据的具体分布。
  4. 组合分区(Composite Partitioning):结合使用范围分区和列表分区或哈希分区。例如,可以先按照时间范围进行范围分区,然后在每个范围内再按照地区进行列表分区。

2.4 分区键设计

分区键是决定表数据如何分配到不同分区的关键。在选择分区键时,应考虑以下几点:

  1. 唯一性:分区键应具有足够的选择性,以确保数据能够均匀地分布到各个分区中。
  2. 查询性能:分区键应与查询条件紧密相关,以便利用分区裁剪技术提高查询性能。
  3. 更新频率:分区键的更新频率应尽可能低,以减少分区移动和合并的开销。

2.5 分区表的优势

  1. 提高查询性能:通过分区裁剪和并行处理,可以显著提高查询速度。
  2. 增强管理灵活性:每个分区可以独立进行管理,降低了维护成本,并提高了管理效率。
  3. 提高数据可用性:当一个分区出现故障时,不会影响其他分区的正常使用,从而提高了系统的整体可用性。
  4. 优化存储空间:可以将不同的分区存储在不同的表空间中,以优化存储空间的使用。

2.6 分区表的使用场景

Oracle分区表主要应用于需要处理大量数据的场合,以提高数据库的性能、可管理性和可用性。

2.6.1 应用场合
  1. 大型数据库:当单表数据量非常大时(例如超过2GB),使用分区表可以显著提高查询性能和数据管理效率。
  2. 历史数据管理:对于包含大量历史数据的表,使用分区表可以方便地将新数据添加到新的分区中,同时保留历史数据以便查询和分析。
  3. 高并发访问:在高并发访问的系统中,通过分区表可以分散I/O负载,提高系统的并发处理能力。
  4. 数据备份和恢复:分区表允许用户独立地备份和恢复每个分区的数据,从而简化了数据备份和恢复的过程。
2.6.2 范例演示
  1. 范围分区(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只会扫描相关的分区,而不是整个表。

  1. 列表分区(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表被划分为六个分区,每个分区对应一个洲。

  1. 哈希分区(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。

  1. 组合分区(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 分区表综合案例

  1. 实际开发中会遇到这样的场景:创建一个分区表,将每天0-24点的数据存到对应分区,再按照每天存到每月,再按照每月存到年分区。
  2. 建议:此场景可以使用复合分区(Composite Partitioning)。具体来说,这里可以使用子分区(Subpartitioning),结合范围分区(Range Partitioning)和列表分区(List Partitioning)或者范围-范围分区(Range-Range Partitioning)。
  3. 演示:假设我们有一个表 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. 可以使用脚本生成复杂的分区结构,特别是按天分区部分,以避免手动错误。
  1. 特别说明:创建如此多的分区(特别是按天分区)会使分区管理变得复杂,在创建前务必弄清楚需求。

2.8 分区表注意事项

  1. 分区键选择:应谨慎选择分区键,以确保数据能够均匀地分布到各个分区中。
  2. 分区数量:分区数量不宜过多或过少。过多的分区会增加管理开销和查询复杂性;过少的分区则无法充分利用分区表的优势。
  3. 性能监控:大量的分区会影响查询性能及DML操作性能,需要权衡分区数量和性能之间的关系。应定期监控分区表的性能,包括查询速度、I/O负载和分区使用情况等,以便及时调整分区策略和优化性能。
  4. 维护:定期添加新的分区(例如新的年度或月度分区)需要自动化脚本支持,以减少人工干预。
  5. 分区模板: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 的…...

跳绳视觉计数方案

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

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++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块&#xff0…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...