如何对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表进行时间分区的方法有以下几种:

  1. 使用ALTER TABLE … MOVE … PARTITION …语句,将原来的表移动到一个新的分区表中,然后删除原来的表。这种方法的优点是比较简单和直接,但是缺点是需要额外的空间和时间,而且会导致索引和约束失效,需要重新创建。
  2. 使用ALTER TABLE … SPLIT PARTITION …语句,将原来的表分割成多个分区,然后删除不需要的分区。这种方法的优点是可以保留索引和约束,但是缺点是需要指定每个分区的范围,而且可能会影响性能和并发。
  3. 使用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;

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

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

相关文章

小研究 - 基于 SpringBoot 微服务架构下前后端分离的 MVVM 模型(三)

本文主要以SpringBoot微服务架构为基础&#xff0c;提出了前后端分离的MVVM模型&#xff0c;并对其进行了详细的分析以及研究&#xff0c;以此为相关领域的工作人员提供一定的技术性参考。 目录 6 互联网应用开发架构分析 6.1 微服务架构与单体架构 6.1.1 系统更改部署 6.1…

关于什么是框架

框架&#xff08;Framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。 IT语境中的框架&#xff0c;特指为解决一个开放性问题而设计的具有一定 性的支撑结构。在此结构上约束可以根据具体问题扩展、安插更多的组成部分&#xff0c;从而更迅…

lz4 与 lz77 压缩算法举例

lz4算法 abcd efab cdeh 压缩过程&#xff1a; 以长度&#xff14;为滑窗&#xff0c;&#xff11;为步长&#xff0c;对abcd计算hash存入hash table&#xff0c;计算 bcde, cdef,defa,efab,fabc的 hash 分别加入 hash table&#xff0c;下一个滑窗 abcd 找到了匹配&#xf…

TS学习01-基本数据类型

基础类型 数组 第一种&#xff1a; 元素类型[] let arr: number[] [1,2,3]第二种: 数组泛型-Array<元素类型> let arr: Array<number> [1,2,3]元组 Tuple 表示一个已知元素数量和类型的数组 let arr: [string, number] a [RenNing, 18]当访问越界元素&…

调整vscode

调整vscode 连wifi linux连接wifi

不懂录音转文字转换器如何使用?来掌握这几个方法吧

作为一名忙碌的职场人士&#xff0c;我每天都要参加各种会议。我发现自己经常会错过会议的一些重要信息&#xff0c;利用录音记录又要费时间去听再转录&#xff0c;实在令我很头疼。直到我开始使用录音转文字这个工具&#xff0c;它简直像魔法一样。只要将需要转换的音频上传就…

信息安全:认证技术原理与应用.

信息安全&#xff1a;认证技术原理与应用. 认证机制是网络安全的基础性保护措施&#xff0c;是实施访问控制的前提&#xff0c;认证是一个实体向另外一个实体证明其所声称的身份的过程。在认证过程中&#xff0c;需要被证实的实体是声称者&#xff0c;负责检查确认声称者的实体…

SPGEMM_example解析

// 设备端并行求偏移数组 不判断当前列号是否出现过也添加进去 // 列号排序 // 然后计算 #include <hip/hip_runtime.h>// 核函数每个线程负责一行 计算当前行中有多少个元素 并先存入相应的偏移量数组中行号的1位置 (不判断列号是否重复的版本) __global__ void getRowN…

【前端】html

HTML标签&#xff08;上&#xff09; 目标&#xff1a; -能够说出标签的书写注意规范 -能够写出HTML骨架标签 -能够写出超链接标签 -能够写出图片标签并说出alt和title的区别 -能够说出相对路径的三种形式 目录&#xff1a; HTML语法规范HTML基本结构标签开发工具HTML常用标…

PY32F003 FLASH

了解py32芯片的flash内容&#xff0c;对于py32进行api升级有更好的了解的操作 //uiOffset 0(4MHz), 1(8MHz), 2(16MHz), 3(22.12MHz), 4(24MHz) void SetFlashParameter(uint32_t uiOffset) {WRITE_REG(FLASH->KEYR, FLASH_KEY1);WRITE_REG(FLASH->KEYR, FLASH_KEY2); …

责任链模式(Chain of Responsibility)

责任链模式是一种行为设计模式&#xff0c;允许将请求沿着处理者链进行发送。收到请求后&#xff0c;每个处理者均可对请求进行处理&#xff0c;或将其传递给链上的下个处理者。职责链模式使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。…

qt中cmake自动处理ui文件的前提

说明&#xff1a;个人理解&#xff0c;未必正确 参考了下面的网址 http://cn.voidcc.com/question/p-wpcanvtj-tn.html http://cn.voidcc.com/question/p-wpcanvtj-tn.html cmake中将set(CMAKE_AUTOUIC ON)打开 set(CMAKE_AUTOUIC ON) # 自动处理ui文件, 自动处理ui文件是有…

构建未来移动应用:探索安卓、iOS和HarmonyOS的技术之旅

安卓、iOS和HarmonyOS的比较分析 在移动应用开发领域&#xff0c;安卓、iOS和HarmonyOS是三个常见的操作系统。本文将对它们进行比较分析&#xff0c;并展示一些相关的代码示例。 安卓&#xff08;Android&#xff09; 安卓是由Google开发的移动操作系统&#xff0c;基于Lin…

在外SSH远程连接Ubuntu系统

在外SSH远程连接Ubuntu系统【无公网IP】 文章目录 在外SSH远程连接Ubuntu系统【无公网IP】前言1. 在Ubuntu系统下安装cpolar软件2. 完成安装后打开cpolar客户端web—UI界面3. 创建隧道取得连接Ubuntu系统公网地址4. 打开Windows的命令界面并输入命令 前言 随着科技和经济的发展…

Synchronized同步锁的优化方法 待完工

Synchronized 和后来出的这个lock锁的区别 在并发编程中&#xff0c;多个线程访问同一个共享资源时&#xff0c;我们必须考虑如何维护数据的原子性。在 JDK1.5 之前&#xff0c;Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁…

[RTKLIB]模糊度固定相关问题(二)

文章目录 一、固定模糊度的前置工作1. 做好固定模糊度的准备2. 建立双差模糊度3. 问题与总结 版权声明&#xff1a;本文为原创文章&#xff0c;版权归 Winston Qu 所有&#xff0c;转载请注明出处。 在上一篇文章中&#xff0c;介绍了RTKLIB中manage_amb_LAMBDA()函数&#xff…

SSL介绍

1. SSL工作过程是什么&#xff1f; 当客户端向一个 https 网站发起请求时&#xff0c;服务器会将 SSL 证书发送给客户端进行校验&#xff0c;SSL 证书中包含一个公钥。校验成功后&#xff0c;客户端会生成一个随机串&#xff0c;并使用受访网站的 SSL 证书公钥进行加密&#xf…

论文阅读 RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 RRNet: A Hybrid Detector for Object Detection in Drone-captured ImagesAbstract1. Introduction2. Related work3. AdaResampling4. Re-Regression Net4.1. Coarse detector4.2. Re-Regression 5. Experiments5.1. Data augmentation5.2. Network details5.3. Tra…

NeRF室内重建对比:Nerfstudio vs. Luma AI vs. Instant-NGP

十年前&#xff0c;Matterport 改变了房地产业&#xff0c;让房地产买家可以进行数字旅游。 买家可以在房产内从一个点移动到另一个点并环顾四周。 与 2D 照片库相比&#xff0c;这是一个巨大的改进。 然而&#xff0c;买家仍然被房产内的一系列问题所困扰。 推荐&#xff1a;用…

rk3399移植linux kernel

rk3399移植linux kernel 0.前言一、移植ubuntu根文件系统二、移植linux1.支持NFS(可选)2.配置uevent helper3.支持etx4文件系统(默认已支持)4.配置DRM驱动5.有线网卡驱动6.无线网卡驱动 三、设备树四、内核镜像文件制作五、烧录六、总结 参考文章&#xff1a; 1.RK3399移植u-bo…