如何对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作为支持汽车以太网进程和设备间通信的一种通信协议应…...

什么?200?跨域?
情景复现 今天我遇到了一件很奇怪的事情就是,当我请求后端网关,然后通过网关去请求相应的服务,都进行了跨域处理 但是,奇怪的是我在请求的时候,回来的响应码是200,但是报错了,报的还是200的同…...

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比
【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)? ❤️🔥 前面已经解释了什么是算法? 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题,我们往往有很多种解决思路和方法&#x…...

搜索综合训练
搜索综合训练 选数详细注释的代码 小木棍详细注释的代码 费解的开关详细注释的代码 选数 详细注释的代码 #include <iostream> #include <vector>using namespace std;// 判断一个数是否为素数 bool isPrime(int num) {if (num < 1)return false;// 判断从2到s…...

snowboy+新一代kaldi(k2-fsa)sherpa-onnx实现离线语音识别【语音助手】
背景 本系列主要目标初步完成一款智能音箱的基础功能,包括语音唤醒、语音识别(语音转文字)、处理用户请求(比如查天气等,主要通过rasa自己定义意图实现)、语音合成(文字转语音)功能。 语音识别、语音合成采用离线方式实现。 语…...

APT80DQ20BG-ASEMI快恢复二极管80A 200V
编辑:ll APT80DQ20BG-ASEMI快恢复二极管80A 200V 型号:APT80DQ20BG 品牌:ASEMI 芯片个数:双芯片 封装:TO-3P 恢复时间:≤50ns 工作温度:-55C~150C 浪涌电流:600A*2 正向电流…...

Go的任务调度单元与并发编程
摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 本文主要介绍Go语言、进程、线程、协程的出现背景原因以及Go 语言如何解决协程的…...

PDFbox教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 PDFBox是一个开源Java库,支持PDF文档的开发和转换.使用此库,您可以开发用于创建,转换和操作PDF文档的Java程序.除此之外,PDFBox还包括一个命令行实用程序,用于使用可用的PDF对PDF执行各种操作Jar文件. PDFB…...

Node.js-模块化理解及基本使用
模块化的定义 讲一个复杂的程序文件按照一定的规则拆分成多个独立的小文件,这些小文件就是小模块,这就是模块化。 每个小模块内部的数据是私有的,可以暴露内部数据给外部其他模块使用。 模块化优点 减少命名的冲突提高复用性提高可维护性按需…...

arguments 和 剩余参数
加油 !! 💕 文章目录 前言一、arguments二、arguments转成array三、箭头函数不绑定arguments四、剩余参数 ... 前言 其实在es6之后不推荐使用 arguments , 建议使用剩余参数 一、arguments arguments 是一个 对应于 传递给函数的参数 的 类数…...

【BASH】回顾与知识点梳理(十二)
【BASH】回顾与知识点梳理 十二 十二. Linux 文件与目录管理12.1 目录与路径相对路径与绝对路径相对路径的用途绝对路径的用途 12.2 目录的相关操作cd (change directory, 变换目录)pwd (Print Working Directory, 显示目前所在的目录)mkdir (make directory, 建立新目录)rmdir…...