详解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核心知识和排障案例及经验、性能调优等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初学 flutter 问题记录

windows搭建flutter运行环境 一、运行 flutter doctor遇到的问题 Xcmdline-tools component is missingRun path/to/sdkmanager --install "cmdline-tools;latest"See https://developer.android.com/studio/command-line for more details.1)cmdline-to…

神经网络(系统性学习二):单层神经网络(感知机)

此前篇章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 单层神经网络(又叫感知机) 单层网络是最简单的全连接神经网络,它仅有输入层和输出层,没有隐藏层。即&#x…

H.265流媒体播放器EasyPlayer.js播放器提示MSE不支持H.265解码可能的原因

随着人工智能和机器学习技术的应用,流媒体播放器将变得更加智能,能够根据用户行为和偏好提供个性化的内容推荐。总体而言,流媒体播放器的未来发展将更加注重技术创新和用户互动,以适应不断变化的市场需求和技术进步。 提示MSE不支…

MySQL原理简介—6.简单的生产优化案例

大纲 1.MySQL日志的顺序写和数据文件的随机读指标 2.Linux存储系统软件层原理及IO调度优化原理 3.数据库服务器使用的RAID存储架构介绍 4.数据库Too many connections故障定位 1.MySQL日志的顺序写和数据文件的随机读指标 (1)磁盘随机读操作 (2)磁盘顺序写操作 (1)磁盘随…

svn 崩溃、 cleanup失败 怎么办

在使用svn的过程中,可能出现整个svn崩溃, 例如cleanup 失败的情况,类似于 这时可以下载本贴资源文件并解压。 或者直接访问网站 SQLite Download Page 进行下载 解压后得到 sqlite3.exe 放到发生问题的svn根目录的.svn路径下 右键呼出pow…

前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的,因为一直没有很好的解决问题。 正文 当我们通过webstorm等IDE开发工具启动项目的时候,通过命令控制台可以观察到启动项目的命令 如下: webpack-dev-server --inline --prog…

在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)

适用于windows环境下通过docker desktop实现opengauss部署,请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项:后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…

Java开发经验——Spring Test 常见错误

摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…

基于 RBF 神经网络整定的 PID 控制

基于 RBF 神经网络整定的 PID 控制 是结合了传统 PID 控制和 RBF(径向基函数)神经网络的自适应控制方法。在这种方法中,RBF 神经网络用于自适应地调整 PID 控制器的增益(比例增益 KpK_pKp​,积分增益 KiK_iKi​ 和微分…

空间注意力网络的性能优化与多维评估

在本文中,首先分析空间注意力网络(Spatial Attention Neural Network)在五个不同数据集上的训练结果。这些数据集包括Daily_and_Sports_Activities、WISDM、UCI-HAR、PAMAP2和OPPORTUNITY。通过对比这些结果,我们可以深入理解空间…

Linux——1_系统的延迟任务及定时任务

系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…

【数据结构】—— 线索二叉树

引入 我们现在提倡节约型杜会, 一切都应该节约为本。对待我们的程序当然也不例外,能不浪费的时间或空间,都应该考虑节省。我们再观察团下图的二叉树(链式存储结构),会发现指针域并不是都充分的利用了,有许…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…

虚幻引擎---初识篇

一、学习途径 虚幻引擎官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-5-5-documentation虚幻引擎在线学习平台:https://dev.epicgames.com/community/unreal-engine/learning哔哩哔哩:https://www.b…

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环(Hardware-in-the-Loop,简称HiL)仿真测试,是模型基于设计(Model-Based Design,简称MBD)验证流程中的一个关键环节。该步骤至关重要,因为它整合了实际…

C++编程库与框架实战——sqlite3数据库

一,SQLite数据库简介 SQLite是可以实现类似于关系型数据库中各种操作的事务性SQL数据库引擎。 SQLite可以为应用程序提供存储于本地的嵌入式数据库,帮助应用程序实现轻量级的数据存储。 SQLite是一个库文件,并不是单独的进程,它可以静态或动态链接到C++应用程序中,然后…

STM32F10x 定时器

使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…

PyQt6+pyqtgraph折线图绘制显示

1、实现效果 2、环境: 确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装: pip install pyqtgraph 3、代码实现: 绘制折线函数: import sys import random from PySide6.QtWidgets import QAppl…

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名,运行此进程的用户名。PID: 进程ID(Process ID),每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…