Oracle 19c入门学习教程,从入门到精通,Oracle 表分区与索引分区 —— 语法详解与综合实践(12)

Oracle 表分区与索引分区 —— 语法详解与综合实践


一、环境准备(Oracle 安装与配置)

说明:本章内容基于Oracle Database 21c XE(Express Edition),适用于 Windows / Linux。

1. 下载与安装(简要步骤)

  • 下载地址
    https://www.oracle.com/database/technologies/xe-downloads.html

  • 安装步骤(Windows)

    1. 以管理员身份运行OracleXE213_Win64.exe
    2. 设置统一口令(如:oracle123
    3. 安装路径默认即可
    4. 安装完成后自动启动服务:
      • OracleServiceXE
      • OracleXETNSListener

⚠️ 注意:Oracle XE 支持分区功能(自 18c 起),但部分高级特性(如复合分区)在 XE 中可能受限。建议使用Enterprise Edition进行完整测试。若仅用于学习,XE 已支持基本分区操作。

2. 创建练习用户

-- 以 sysdba 登录sqlplus sys/oracle123@localhost:1521/XEassysdba-- 创建表空间CREATETABLESPACEpart_ts DATAFILE'part_ts.dbf'SIZE200M AUTOEXTENDON;-- 创建用户CREATEUSERpart_user IDENTIFIEDBYpart123DEFAULTTABLESPACEpart_ts;-- 授予权限(分区需要额外权限)GRANTCONNECT,RESOURCE,CREATEANYTABLE,CREATEANYINDEXTOpart_user;

使用part_user/part123登录进行本章练习。


二、分区技术简介

什么是分区?

  • 将一个大表物理上划分为多个小段(分区),逻辑上仍为一张表。
  • 优势
    • 提升查询性能(分区裁剪)
    • 简化维护(如删除整月数据只需DROP PARTITION
    • 提高可用性(一个分区损坏不影响其他分区)

分区类型概览

类型依据适用场景
范围分区(Range)值范围(如日期、ID)时间序列数据(日志、订单)
散列分区(Hash)哈希函数均匀分布数据,避免热点
列表分区(List)枚举值列表地区、状态等离散值
Interval 分区自动按间隔扩展按月/日自动创建新分区
组合分区两级分区(如 Range + Hash)大数据量复杂场景

三、创建表分区

1. 范围分区(Range Partitioning)

语法:
CREATETABLEtable_name(...)PARTITIONBYRANGE(column)(PARTITIONpart_nameVALUESLESS THAN(value),...PARTITIONpart_maxVALUESLESS THAN(MAXVALUE));
案例:按销售日期分区
CREATETABLEsales(sale_id NUMBER,product VARCHAR2(50),region VARCHAR2(20),amount NUMBER(10,2),sale_dateDATE)PARTITIONBYRANGE(sale_date)(PARTITIONp_2023_q1VALUESLESS THAN(DATE'2023-04-01'),PARTITIONp_2023_q2VALUESLESS THAN(DATE'2023-07-01'),PARTITIONp_2023_q3VALUESLESS THAN(DATE'2023-10-01'),PARTITIONp_2023_q4VALUESLESS THAN(DATE'2024-01-01'),PARTITIONp_futureVALUESLESS THAN(MAXVALUE)-- 捕获未来数据);

MAXVALUE表示最大可能值,必须放在最后。


2. 散列分区(Hash Partitioning)

语法:
CREATETABLE...PARTITIONBYHASH(column)PARTITIONS n;-- 或指定每个分区名PARTITIONBYHASH(column)(PARTITIONpart1,PARTITIONpart2,...);
案例:按客户 ID 均匀分布
CREATETABLEcustomers(cust_id NUMBER,name VARCHAR2(50),email VARCHAR2(100))PARTITIONBYHASH(cust_id)PARTITIONS4;-- 自动创建 4 个分区:SYS_P1, SYS_P2...

✅ 适合无法预知数据分布的场景,确保 I/O 均衡。


3. 列表分区(List Partitioning)

语法:
CREATETABLE...PARTITIONBYLIST(column)(PARTITIONpart_nameVALUES('val1','val2',...),PARTITIONpart_otherVALUES(DEFAULT)-- 可选);
案例:按地区分区
CREATETABLEorders(order_id NUMBER,customer VARCHAR2(50),region VARCHAR2(10),amount NUMBER(10,2))PARTITIONBYLIST(region)(PARTITIONp_northVALUES('BJ','TJ','HEB'),PARTITIONp_southVALUES('GD','FJ','HN'),PARTITIONp_westVALUES('SC','YN','XZ'),PARTITIONp_otherVALUES(DEFAULT)-- 兜底分区);

4. Interval 分区(自动范围分区)

  • 在 Range 分区基础上,自动创建新分区
  • 适用于按时间周期(日/月/年)增长的数据。
案例:按月自动分区
CREATETABLEmonthly_logs(log_id NUMBER,msg VARCHAR2(200),log_timeDATE)PARTITIONBYRANGE(log_time)INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))-- 每月一个分区(PARTITIONp_startVALUESLESS THAN(DATE'2025-01-01'));

✅ 插入2025-03-15的数据时,系统自动创建2025-03分区。


5. 组合分区(Composite Partitioning)

支持两级分区,常见组合:

  • Range-Hash
  • Range-List
  • List-Range 等
案例:Range(年) + Hash(客户ID)
CREATETABLEbig_sales(sale_id NUMBER,cust_id NUMBER,sale_dateDATE,amount NUMBER(10,2))PARTITIONBYRANGE(sale_date)SUBPARTITIONBYHASH(cust_id)SUBPARTITIONS4(PARTITIONp_2024VALUESLESS THAN(DATE'2025-01-01'),PARTITIONp_2025VALUESLESS THAN(DATE'2026-01-01'));

✅ 每个年份分区下再分 4 个子分区,共 8 个物理段。


四、管理表分区

1. 添加分区(ADD PARTITION)

仅适用于Range / List分区(Interval 分区自动添加,无需手动)。

-- 为 Range 分区添加新分区ALTERTABLEsalesADDPARTITIONp_2024_q1VALUESLESS THAN(DATE'2024-04-01');-- 为 List 分区添加ALTERTABLEordersADDPARTITIONp_eastVALUES('SH','JS','ZJ');

⚠️ 不能在MAXVALUEDEFAULT分区后添加新分区。


2. 合并分区(MERGE PARTITIONS)

将两个相邻分区合并为一个。

-- 合并 Q1 和 Q2ALTERTABLEsalesMERGEPARTITIONS p_2023_q1,p_2023_q2INTOPARTITIONp_2023_h1;

3. 删除分区(DROP PARTITION)

-- 删除整个分区(数据一并删除)ALTERTABLEsalesDROPPARTITIONp_2023_q1;-- 删除分区但保留数据(移入其他表)ALTERTABLEsalesDROPPARTITIONp_2023_q1UPDATEGLOBALINDEXES;-- 避免全局索引失效

UPDATE GLOBAL INDEXES是关键,否则全局索引变UNUSABLE


4. 并入范围分区(SPLIT PARTITION)

将一个分区拆分为两个。

-- 将 p_future 按 2024-07-01 拆分ALTERTABLEsales SPLITPARTITIONp_future AT(DATE'2024-07-01')INTO(PARTITIONp_2024_h1,PARTITIONp_future);

五、创建索引分区

1. 索引分区概述

类型特点适用场景
本地索引(Local)每个表分区对应一个索引分区,自动维护大多数 OLAP 场景
全局索引(Global)索引独立于表分区,可跨分区高频唯一查询(如主键)

2. 本地索引分区(Local Index)

语法:
CREATEINDEXindex_nameONtable_name(column)LOCAL;
案例:
-- 为 sales 表的 sale_date 创建本地索引CREATEINDEXidx_sales_dateONsales(sale_date)LOCAL;-- 查看索引分区SELECTindex_name,partition_name,statusFROMuser_ind_partitionsWHEREindex_name='IDX_SALES_DATE';

✅ 本地索引自动与表分区对齐,维护简单。


3. 全局索引分区(Global Index)

语法:
CREATEINDEXindex_nameONtable_name(column)GLOBALPARTITIONBYRANGE(column)(...);
案例:全局唯一索引(主键)
-- 假设 sale_id 需全局唯一CREATEUNIQUEINDEXuk_sales_idONsales(sale_id)GLOBALPARTITIONBYHASH(sale_id)PARTITIONS4;

⚠️ 全局索引在 DDL(如 DROP PARTITION)后可能失效,需UPDATE GLOBAL INDEXES或重建。


六、管理索引分区

1. 删除索引分区(仅全局索引支持)

-- 删除全局索引的某个分区(本地索引不能单独删)ALTERINDEXuk_sales_idDROPPARTITIONpart1;

2. 重命名索引分区

ALTERINDEXidx_sales_dateRENAMEPARTITIONp_2023_q1TOsales_2023_q1_idx;

✅ 本地索引分区名默认与表分区同名,可重命名便于识别。

3. 重建索引分区

-- 重建本地索引分区ALTERINDEXidx_sales_date REBUILDPARTITIONp_2023_q1;-- 重建整个本地索引ALTERINDEXidx_sales_date REBUILD;

七、综合性案例

场景:电商平台订单系统

需求:

  1. 订单表按年+月自动分区(Interval)
  2. 客户ID建立散列子分区(负载均衡)
  3. 为订单ID建全局唯一索引
  4. 为订单日期建本地索引
  5. 演示删除旧分区(归档)

步骤 1:创建组合分区表

CREATETABLEecom_orders(order_id NUMBERPRIMARYKEY,cust_id NUMBERNOTNULL,product VARCHAR2(100),amount NUMBER(10,2),order_dateDATEDEFAULTSYSDATE)PARTITIONBYRANGE(order_date)INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))SUBPARTITIONBYHASH(cust_id)SUBPARTITIONS4(PARTITIONp_startVALUESLESS THAN(DATE'2025-01-01'));

步骤 2:创建索引

-- 全局唯一索引(主键已隐式创建,此处显式演示)-- 注意:主键默认创建全局唯一索引-- 若需本地主键,需特殊处理(不推荐)-- 本地索引加速按日期查询CREATEINDEXidx_order_dateONecom_orders(order_date)LOCAL;-- 本地索引加速按客户查询CREATEINDEXidx_order_custONecom_orders(cust_id)LOCAL;

步骤 3:插入测试数据

INSERTINTOecom_orders(order_id,cust_id,product,amount,order_date)VALUES(1001,101,'Laptop',5999.00,DATE'2025-03-15');INSERTINTOecom_orders(order_id,cust_id,product,amount,order_date)VALUES(1002,102,'Phone',3999.00,DATE'2025-04-20');-- 自动创建 2025-03 和 2025-04 分区

步骤 4:删除旧分区(如归档 2025-03 前数据)

-- 先确认分区名SELECTpartition_name,high_valueFROMuser_tab_partitionsWHEREtable_name='ECOM_ORDERS';-- 假设要删除 2025-03 之前的分区(实际需根据 HIGH_VALUE 判断)-- 此处演示删除 p_start(包含 <2025-01 的数据)ALTERTABLEecom_ordersDROPPARTITIONp_startUPDATEGLOBALINDEXES;-- 保持全局索引有效

步骤 5:验证分区与索引状态

-- 查表分区SELECTpartition_name,num_rowsFROMuser_tab_partitionsWHEREtable_name='ECOM_ORDERS';-- 查本地索引分区SELECTpartition_name,statusFROMuser_ind_partitionsWHEREindex_name='IDX_ORDER_DATE';-- 查全局索引状态SELECTstatusFROMuser_indexesWHEREindex_name='SYS_C0012345';-- 主键索引名

八、总结对比表

操作语法注意事项
创建 Range 分区PARTITION BY RANGE (...)MAXVALUE或 Interval
创建 Hash 分区PARTITION BY HASH (...) PARTITIONS n数据均匀分布
Interval 分区INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))自动扩展
添加分区ALTER TABLE ... ADD PARTITION不适用于 Interval
删除分区DROP PARTITION ... UPDATE GLOBAL INDEXES避免索引失效
本地索引CREATE INDEX ... LOCAL自动对齐表分区
全局索引CREATE INDEX ... GLOBAL PARTITION BY ...需手动维护

九、最佳实践建议

  1. 选择合适分区键

    • 时间字段 → Range / Interval
    • 离散值 → List
    • 高并发写入 → Hash 避免热点
  2. 索引策略

    • 查询条件含分区键 → 优先用本地索引
    • 唯一约束(如主键)→ 全局索引
  3. 维护操作

    • 删除分区前加UPDATE GLOBAL INDEXES
    • 定期监控分区大小,避免倾斜
  4. 开发注意

    • 应用 SQL 最好包含分区键,触发分区裁剪(Partition Pruning)
    • 避免SELECT * FROM table扫全表

通过本章学习,您已掌握 Oracle 表与索引分区的核心技术,能够设计高性能、易维护的大表架构,为海量数据处理提供坚实支撑。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 中 keep-alive 组件的生命周期钩子

Vue 中 keep-alive 组件的生命周期钩子 本文来自于我关于 Vue生命周期钩子 的系列文章。欢迎阅读、点评与交流~ 1、Vue 中的生命周期钩子 2、Vue 中 keep-alive 组件的生命周期钩子 1. keep-alive 组件概述 keep-alive 是 Vue 的内置组件&#xff0c;用于缓存不活动的组件实例…

实用软件-杀软清流!火绒6.0:零广告+真免费,附赠9把系统手术刀!

在各种安全软件里面&#xff0c;火绒是分享迷用的最久的一个&#xff0c;至今在用。它以其简洁无广告、功能实用的特性&#xff0c;成为杀毒软件界的口碑担当&#xff0c;清流般的存在。 火绒目前已来到了6.0&#xff0c;那么这次分享迷要把呼声最高的火绒小工具独立版分享给大…

CMS站群批量导入WORD到CKEDITOR如何避免卡顿?

PHP程序员的逆袭&#xff1a;680元搞定CMS编辑器神级插件&#xff01; &#xff08;敲黑板&#xff09;各位西安的码农兄弟们注意啦&#xff01;今天给大家分享一个我最近在做的"骚操作"——用680元预算搞定了客户提出的"编辑器神级需求"&#xff0c;现在…

芯片制造文档通过CKEDITOR导入WORD为何报错?

山东某软件公司前端工程师需求实现记录&#xff1a;基于CKEditor4的文档处理集成方案 一、需求拆解与技术选型&#xff08;Vue2 CKEditor4 JSP&#xff09; 核心功能确认&#xff1a; 编辑器增强需求&#xff1a; Word粘贴净化&#xff08;保留核心样式&#xff0c;去除冗余…

机械设计EXCEL表格导入CKEDITOR后如何锁定单元格?

CMS项目Word导入功能开发纪实&#xff1a;从需求分析到技术落地 一、需求确认与技术选型 作为PHP开发工程师&#xff0c;在接到客户提出的"在CKEditor编辑器中实现Word文档导入及一键粘贴功能"的需求后&#xff0c;我首先进行了详细的需求拆解&#xff1a; 核心功…

红外碳硫分析仪正规厂家排名,无锡钱荣分析仪器实力凸显

问题1:为什么选择红外碳硫分析仪时必须认准正规厂家?非正规产品有哪些风险? 红外碳硫分析仪是检测材料中碳、硫元素含量的核心设备,其检测精度直接影响产品质量、生产安全甚至行业合规性,因此选择正规厂家是避免风…

全网最全自考必备AI论文软件TOP9测评

全网最全自考必备AI论文软件TOP9测评 2026年自考AI论文软件测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的自考学生开始借助AI论文软件提升写作效率、优化内容质量。然而&#xff0c;面对市场上琳琅满目的工具&#xf…

探寻云迹精准客户线索系统,哪个公司口碑好?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为企业选型提供客观依据,助力精准匹配适配的销售增长服务伙伴。 TOP1 推荐:无锡云迹科技有限公司 推荐指数:★★★★★ | 口碑评分:国内首推销售…

互联网产品文档从CONFLUENCE转CKEDITOR为何乱码?

企业级Word内容导入解决方案需求分析报告 需求背景 作为广东科技小巨人领军企业的项目负责人&#xff0c;我司在政府、军工、金融等领域承接了大量信息化建设项目。近期多个项目组反馈&#xff0c;客户强烈要求在CMS系统中增加专业级Word内容导入功能&#xff0c;以满足政府公…

深度测评MBA必备AI论文工具TOP10:开题报告与文献综述全解析

深度测评MBA必备AI论文工具TOP10&#xff1a;开题报告与文献综述全解析 2026年MBA学术写作工具测评&#xff1a;精准选型助力高效研究 在MBA学习与研究过程中&#xff0c;论文撰写是贯穿始终的核心任务&#xff0c;尤其是开题报告与文献综述环节&#xff0c;往往需要耗费大量时…

全网口碑好的移动话费充值卡回收平台推荐

在数字化消费盛行的当下,移动话费充值卡的使用频率逐渐降低,不少人手中都积攒了闲置的充值卡。与其让这些卡券过期浪费,不如通过专业回收平台将其变现,实现资源再利用。以下为大家推荐几个全网口碑良好的移动话费充…

【Svelte】本地正常,线上报错的奇怪问题

这个问题产生的原因是&#xff1a;在 Svelte 5 中&#xff0c;你不能在 page.server.ts 的 load 函数中使用 $app/state (如 page) 或 $app/stores。 错误信息 lifecycle_outside_component 表明你尝试在 Svelte 组件生命周期之外&#xff08;即在纯服务器端代码中&#xff09;…

同城代驾平台开发+代驾系统源码:从架构设计到高可用落地实战

温馨提示&#xff1a;文末有资源获取方式~随着夜间经济崛起与酒驾法规收紧&#xff0c;代驾服务已形成千亿级刚需市场。一款优质代驾系统不仅要满足“下单-接单-结算”基础流程&#xff0c;更需应对高并发派单、轨迹精准追踪、复杂计费规则等技术挑战。本文结合实战经验&#x…

Vue2项目中实现文件上传下载,有哪些推荐的解决方案?

前端老哥的“懒人”大文件上传方案&#xff08;Vue3原生JS&#xff09; 兄弟们&#xff01;我是辽宁一名“头发没秃但代码量秃”的前端程序员&#xff0c;最近接了个外包活——给客户做文件管理系统&#xff0c;核心需求就仨字儿&#xff1a;“稳、省、兼容”&#xff01;客户…

vue.js网页中,实现文件上传下载的三种解决方案是什么?

【一个网工仔的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某高校网络工程专业的菜狗一枚&#xff0c;刚啃完《JavaScript从入门到住院》&#xff0c;就被导师按头要求搞个10G大文件上传系统。现在前端用Vue3原生JS硬…

JavaScript网页开发中,文件上传下载有哪些推荐解决方案?

我&#xff0c;某IT企业技术总监&#xff0c;聊聊这套“高可靠、强兼容”大文件传输解决方案的落地实践 作为服务过300政企客户的技术负责人&#xff0c;我太清楚大文件传输场景的“坑”了——从100G文件的断点续传稳定性&#xff0c;到IE8兼容的技术攻坚&#xff1b;从文件夹…

【免费开源】基于 STM32 的远程视频监控项目 —— 从无线通信选型到系统架构实战解析

基于 STM32 的远程视频监控项目 —— 从无线通信选型到系统架构实战解析 一、项目背景与意义 随着物联网&#xff08;IoT&#xff09;与嵌入式系统的快速发展&#xff0c;远程视频监控已经从传统安防领域&#xff0c;扩展到智慧农业、工业巡检、实验室管理、无人值守机房、智…

城市AI智能体:让城市拥有“自主思考”的神经中枢

如果说物联网是城市的“神经末梢”&#xff0c;大数据是城市的“血液”&#xff0c;那城市AI智能体就是统筹全局的“大脑”。它不是单一的AI工具&#xff0c;而是能感知、思考、执行、迭代的闭环系统&#xff0c;核心是用技术打破城市运行的“信息孤岛”&#xff0c;让治理从“…

jquery网页应用中,文件上传下载有哪些实用的解决方案?

我是一名扎根于湖南长沙的程序员&#xff0c;近期正面临一个极具挑战性的项目需求&#xff1a;需要运用百度开源组件WebUploader来实现大文件的高效传输&#xff0c;目标文件规模高达20G左右。此项目不仅要求实现文件的上传与下载功能&#xff0c;还需支持文件夹的上传和下载&a…

评估,才是微调里最反直觉的部分

微调跑通≠成功!训练是确定性工程,评估才是核心认知挑战:loss不反映真实效果,人工评估难但不可替代。关键在明确定义“何为更好”,用固定对照集+对比输出持续校准目标,让评估成为理解模型行为的迭代过程。训练跑…