如何对oracle和mysql进行 分区分表
前提:使用自带的分区和分表机制进行操作
oracle,mysql分区分表
分区
分区是一种将一个大的表或索引分割成多个小的部分的技术,每个部分称为一个分区。分区可以提高数据的管理和查询效率,因为可以根据不同的条件对不同的分区进行操作,而不需要扫描整个表或索引。例如,可以根据日期对表进行分区,然后只查询或删除某个时间范围内的数据,而不影响其他时间范围的数据。
Oracle和MySQL都支持分区的功能,但是实现方式和使用方法有所不同。
下面我会详细地介绍一下Oracle和MySQL的分区的特点和差异。
Oracle支持四种类型的分区:
范围分区、列表分区、散列分区和复合分区1。范围分区是根据分区键的值落在某个范围内来划分分区,例如按照年份或月份划分。列表分区是根据分区键的值匹配某个列表中的值来划分分区,例如按照国家或地区划分。散列分区是根据分区键的值经过一个散列函数计算出一个散列值来划分分区,例如按照用户ID或订单号划分。复合分区是将两种或以上的类型的分区组合起来使用,例如按照年份和国家划分。
Oracle还支持一些扩展功能,例如间隔分区、参考分区、虚拟列分区等。
MySQL支持五种类型的分区:
范围分区、列表分区、散列分区、线性散列分区和键值分区。范围分区和列表分区与Oracle类似,但是MySQL不支持复合分区。散列分区和线性散列分区也与Oracle类似,但是MySQL不允许用户自定义散列函数,而是使用内置的函数。
键值分区是根据一组列或表达式的值经过一个内置的散列函数计算出一个散列值来划分分区,
例如按照用户名或邮箱划分。要创建一个带有分区的表,
Oracle和MySQL都需要在创建表时指定PARTITION BY子句,并为每个分区指定一个名称和一个选项。
例如,以下语句可以在Oracle中创建一个按照年份范围划分的表:
CREATE TABLE sales (order_id NUMBER(10) PRIMARY KEY,customer_id NUMBER(10) NOT NULL,product_id NUMBER(10) NOT NULL,order_date DATE NOT NULL,amount NUMBER(10,2) NOT NULL
)
PARTITION BY RANGE (order_date) (PARTITION sales_2019 VALUES LESS THAN (2020),PARTITION sales_2020 VALUES LESS THAN (2021),PARTITION sales_2021 VALUES LESS THAN (2022),PARTITION sales_2022 VALUES LESS THAN (2023),PARTITION sales_2023 VALUES LESS THAN (2024)
);
以下语句可以在MySQL中创建一个类似的表:
CREATE TABLE sales (order_id INT PRIMARY KEY,customer_id INT NOT NULL,product_id INT NOT NULL,order_date DATE NOT NULL,amount DECIMAL(10,2) NOT NULL
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION sales_2019 VALUES LESS THAN (2020),PARTITION sales_2020 VALUES LESS THAN (2021),PARTITION sales_2021 VALUES LESS THAN (2022),PARTITION sales_2022 VALUES LESS THAN (2023),PARTITION sales_2023 VALUES LESS THAN (2024)
);
要查询一个带有分区的表,
Oracle和MySQL都可以在查询中使用普通的SQL语句,数据库会自动选择需要扫描的分区,并优化查询计划 。
例如,以下语句可以在Oracle和MySQL中查询2020年的销售数据:
SELECT * FROM sales
WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31';
要管理一个带有分区的表,Oracle和MySQL都提供了一些分区相关的语句,例如添加、删除、合并、拆分、重建、交换等 。
例如,以下语句可以在Oracle中添加一个新的分区:
ALTER TABLE sales
ADD PARTITION sales_2022 VALUES LESS THAN (DATE '2023-01-01');
以下语句可以在MySQL中删除一个旧的分区:
ALTER TABLE sales
DROP PARTITION sales_2019;
如何对一个已经有数据的Oracle表进行时间分区的方法有以下几种:
- 使用ALTER TABLE … MOVE … PARTITION …语句,将原来的表移动到一个新的分区表中,然后删除原来的表。这种方法的优点是比较简单和直接,但是缺点是需要额外的空间和时间,而且会导致索引和约束失效,需要重新创建。
- 使用ALTER TABLE … SPLIT PARTITION …语句,将原来的表分割成多个分区,然后删除不需要的分区。这种方法的优点是可以保留索引和约束,但是缺点是需要指定每个分区的范围,而且可能会影响性能和并发。
- 使用DBMS_REDEFINITION包,将原来的表在线重定义为一个新的分区表,然后同步数据和元数据。这种方法的优点是可以在线进行,不影响用户访问,而且可以自动处理索引和约束,但是缺点是比较复杂和耗时,而且需要满足一些先决条件。
比如使用ALTER TABLE … SPLIT PARTITION …语句来对 sales 表进行分区,
需要先确定要按照什么字段和条件来划分分区。例如,假设想按照日期字段date_field来划分分区,并且每个月划分一个分区。
那么可以使用以下语句来创建一个新的分区表:
CREATE TABLE sales_new (-- 原表的字段定义...
)
PARTITION BY RANGE (date_field) (-- 按照月份划分分区PARTITION p_202101 VALUES LESS THAN (DATE '2021-02-01'),PARTITION p_202102 VALUES LESS THAN (DATE '2021-03-01'),PARTITION p_202103 VALUES LESS THAN (DATE '2021-04-01'),...
);
然后可以使用以下语句将原来的表的数据移动到新的分区表中:
INSERT INTO sales_new
SELECT * FROM sales;
最后可以使用以下语句删除原来的表,并将新的表重命名为原来的表名:
DROP TABLE sales;
RENAME sales_new TO eval_sum_organization;
那么,当插入一条2023年的数据时,例如:
INSERT INTO sales VALUES (1001, 101, 201, '2023-01-01', 100.00);
Oracle会自动地将这条数据存储在sales_2023分区中,而不会影响其他分区。同样地,当查询2023年的数据时,例如:
SELECT * FROM sales
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
Oracle会自动地只扫描sales_2023分区,而不会扫描其他分区。这样可以大大减少数据的读写和传输量,提高数据的访问速度和性能。
想查看数据落在哪个分区
可以使用以下几种方法:
使用ROWID来获取数据的物理位置,然后使用DBMS_ROWID包来解析ROWID的组成部分,
包括数据对象ID、文件号、块号和行号。然后可以使用数据对象ID来查询用户对象视图,获取分区的名称。
例如,以下语句可以查询order_id为1001的数据落在哪个分区:
SELECT subobject_name FROM user_objects
WHERE data_object_id = (SELECT dbms_rowid.rowid_object (ROWID) FROM salesWHERE order_id = 1001
);
使用分区扩展语法来指定分区的名称,然后使用EXISTS子句来判断数据是否存在于该分区。
例如,以下语句可以查询order_id为1001的数据是否存在于sales_2023分区:
SELECT CASE WHEN EXISTS (SELECT 1 FROM sales PARTITION (sales_2023)WHERE order_id = 1001
) THEN 'YES' ELSE 'NO' END AS result FROM dual;
统计使用
想统计一个分区表的总量,可以使用COUNT函数来计算表中的记录数,或者使用SUM函数来计算表中的某个字段的总和。
例如,以下语句可以统计eval_sum_organization表中的总记录数:
SELECT COUNT(*) FROM eval_sum_organization;
以下语句可以统计eval_sum_organization表中的amount字段的总和:
SELECT SUM(amount) FROM eval_sum_organization;
如果想对一个分区表进行排名,可以使用RANK函数或ROW_NUMBER函数来给每个记录分配一个排名或序号,
然后根据排名或序号进行排序或过滤。
例如,以下语句可以按照amount字段对eval_sum_organization表进行降序排名,并只显示前十名:
SELECT * FROM (SELECT *, RANK() OVER (ORDER BY amount DESC) AS rankFROM eval_sum_organization
) WHERE rank <= 10;
以下语句可以按照date_field字段对eval_sum_organization表进行升序序号,并只显示第十行:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY date_field) AS rnFROM eval_sum_organization
) WHERE rn = 10;
如果想按照单位下所有部门进行排序,可以使用PARTITION BY子句来将表按照单位字段进行分组,
然后在每个分组内按照部门字段进行排序。
例如,以下语句可以按照单位和部门对eval_sum_organization表进行升序排序:
SELECT * FROM eval_sum_organization
ORDER BY unit, department;
分表
那么可以使用动态SQL来根据日期拼接子表的名称,然后执行查询。
例如,假设有一个按照天分割成多个子表的表,名为table,子表的名称是tableYYYYMMDD,
那么可以使用以下语句来查询2022年10月1日的数据:
-- Oracle
DECLAREv_sql VARCHAR2(1000);v_date DATE := DATE '2022-10-01';
BEGINv_sql := 'SELECT * FROM table' || TO_CHAR(v_date, 'YYYYMMDD');EXECUTE IMMEDIATE v_sql;
END;-- MySQL
SET @sql = CONCAT('SELECT * FROM table', DATE_FORMAT('2022-10-01', '%Y%m%d'));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
相关文章:
如何对oracle和mysql进行 分区分表
前提:使用自带的分区和分表机制进行操作 oracle,mysql分区分表 分区 分区是一种将一个大的表或索引分割成多个小的部分的技术,每个部分称为一个分区。分区可以提高数据的管理和查询效率,因为可以根据不同的条件对不同的分区进行操作&#x…...

Windows下安装Sqoop
Windows下安装Sqoop 一、Sqoop简介二、Sqoop安装2.1、Sqoop官网下载2.2、Sqoop网盘下载2.3、Sqoop安装(以version:1.4.7为例)2.3.1、解压安装包到 D:\bigdata\sqoop\1.4.7 目录2.3.2、新增环境变量 SQOOP_HOME2.3.3、环境变量 Path 添加 %SQO…...

Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题
我们在使用浏览器访问各个网站时,经常会保存密码。在下一次访问时,直接使用保存的密码填充,简单方便。 但是突然有一天(怀疑是谷歌浏览器更新导致的),每次使用密码填充时,都有如下拦截 拦截提…...

Java技术整理(3)—— 多线程并发篇
1、Java 线程实现/创建方式 (1)继承Thread类 Thread类本质上是实现了Runnable接口的实例,代表一个线程的实例,通过start()启动,自动执行run()方法。 (2)实现Runnable接口 Runnable是一个没有…...

2023热门跨境电商平台哪个入驻条件适合新手?
一、 Shopee 1.平台简介:东南亚最大跨境电商平台,覆盖新加坡、马来西亚、菲律宾、泰国、越南、巴西等十余个市场。 2.平台优势:流量大、物流快、东南亚市场前景好 3.入驻要求:企业或个体营业执照其他电商平台经验 4.平台费用&…...

【MFC】05.MFC第一大机制:程序启动机制-笔记
MFC程序开发所谓是非常简单,但是对于我们逆向人员来说,如果想要逆向MFC程序,那么我们就必须了解它背后的机制,这样我们才能够清晰地逆向出MFC程序,今天这篇文章就来带领大家了解MFC的第一大机制:程序启动机…...
小程序动画 animation 的常规使用
公司小程序项目比较多,最近正好有时间看一下小程序的动画,同时记录一下我的学习过程;看到这个文章的,我建议你之间去小程序后台:https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimati…...

Swift 周报 第三十四期
文章目录 前言新闻和社区iPhone Pro 要提价!新款 iPhone 或会使用 USB-C 充电器,边框更薄与 App Store 专家会面交流让你的 App 和游戏在 visionOS 模拟器外更进一步 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swif…...

[虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密
本插件可以在虚幻引擎中使用蓝图对字符串,字节数组,文件进行Base64的加密和解密。 目录 1. 节点说明 String To Base64 Base64 To String Binary To Base64 Base64 To Binary File To Base64 Base64 To File 2. 案例演示 3. 插件下载 1. 节点说…...

Jmeter组件作用域及执行顺序
目录 一、Jmeter八大可执行元件 二、组件执行顺序 三、组件作用域 四、特殊说明 一、Jmeter八大可执行元件 配置元件---Config Element 用于初始化默认值和变量,以便后续采样器使用。配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分…...
题目:2309.兼具大小写的最好英文字母
题目来源: leetcode题目,网址:2309. 兼具大小写的最好英文字母 - 力扣(LeetCode) 解题思路: 遍历字符串以获得兼具大小写的英文字母,然后返回最大者或空串即可。 解题代码: c…...

RISC-V公测平台发布:如何在SG2042上玩转OpenMPI
About HS-2 HS-2 RISC-V通用主板是澎峰科技与合作伙伴共同研发的一款专为开发者设计的标准mATX主板,它预装了澎峰科技为RISC-V高性能服务器定制开发的软件包,包括各种标准bencmark、支持V扩展的GCC编译器、计算库、中间件以及多种典型服务器应用程序。…...

Jenkins 使用
Jenkins 使用 文章目录 Jenkins 使用一、jenkins 任务执行二、 Jenkins 连接gitee三、Jenkins 部署静态网站 一、jenkins 任务执行 jenkins 创建 job job的名字最好是有意义的 restart_web_backend restart_web_mysql[rootjenkins ~]# ls /var/lib/jenkins/ config.xml …...

使用go-zero快速构建微服务
本文是对 使用go-zero快速构建微服务[1]的亲手实践 编写API Gateway代码 mkdir bookstore && cd bookstorego mod init bookstore mkdir api && goctl api -o api/bookstore.api syntax "v1"info(title: "xx使用go-zero"desc: "xx用…...

Java开发 - Redis事务怎么用?
前言 最近博主感觉捅了Redis窝,从Redis主从,哨兵,集群,集群原理纷纷讲了一遍,不知道大家都学会了多少,想着送佛送到西,不如再添一把火,所以今天带给大家的博客是Redis事务ÿ…...
Windows Server 2019安装使用PostgreSQL 15
主要是参考这篇文章来做的: Windows11安装配置PostgreSQL(图文详细教程)_win11安装postgres 并管理工具_return strxi的博客-CSDN博客 1. 下载的是postgresql 15.3 windows x64-86版本 Community DL Page 2. 安装时一定要右击安装exe文件…...

中科驭数亮相DPU峰会,分享HADOS软件生态实践和大数据计算方案,再获评“匠芯技术奖”
又是一年相逢时,8月4日,第三届DPU峰会在北京开幕,本届峰会由中国通信学会指导,江苏省未来网络创新研究院主办,SDNLAB社区承办,以“智驱创新芯动未来”为主题,沿袭技术创新、生态协同的共创效应&…...
chrome、edge、Firefox关闭音量提醒控件显示
文章目录 1. Chrome2. edge3. firefox 1. Chrome 在地址栏输入: chrome://flags/#hardware-media-key-handling 将Hardware Media Key Handling的状态设为Disabled 2. edge 在地址栏输入 edge://flags/#hardware-media-key-handling 将Hardware Media Key Handling的状态…...

3.7v升压5v4A芯片用什么型号
问:我需要一个能够将3.7V锂电池的电压升压到5V,并且能够提供4A的电流输出的芯片。请问有什么推荐的型号吗? 答:小编为您推荐AH6922B芯片,它具备以下特点来满足您的需求: 1. 输入电压范围适配:…...

鉴源实验室丨SOME/IP协议安全攻击
作者 | 张昊晖 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 引 言 随着汽车行业对于数据通信的需求不断增加,SOME/IP作为支持汽车以太网进程和设备间通信的一种通信协议应…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...