oracle表分区详解(按天、按月、按年等)

oracle分区表创建(自动按年、月、日分区)实战 前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了。如果开启了这个选项,就会把这行从这个分区中 delete 掉,并加到更新后所属的分区,此时就会发生 rowid 的改变。2、这张表主要是查询,而且可以按分区查询,只会修改当前最新分区的数据,对以前的不怎么做删除和修改。 阅读详情

分区表的概念:

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表的优点:

  1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

  2. 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

  3. 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

  4. 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

分区表的种类:

1.范围分区
概念: 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。

– 按行分区
SQL> CREATE TABLE part_andy1
2 (
3 andy_ID NUMBER NOT NULL PRIMARY KEY,
4 FIRST_NAME VARCHAR2(30) NOT NULL,
5 LAST_NAME VARCHAR2(30) NOT NULL,
6 PHONE VARCHAR2(15) NOT NULL,
7 EMAIL VARCHAR2(80),
8 STATUS CHAR(1)
9 )
10 PARTITION BY RANGE (andy_ID)
11 (
12 PARTITION PART1 VALUES LESS THAN (10000) ,
13 PARTITION PART2 VALUES LESS THAN (20000)
14 );

Table created.

– 按时间分区

SQL> CREATE TABLE part_andy2
2 (
3 ORDER_ID NUMBER(7) NOT NULL,
4 ORDER_DATE DATE,
5 OTAL_AMOUNT NUMBER,
6 CUSTOTMER_ID NUMBER(7),
7 PAID CHAR(1)
8 )
9 PARTITION BY RANGE (ORDER_DATE)
10 (
11 PARTITION p1 VALUES LESS THAN (TO_DATE(‘2014-10-1’, ‘yyyy-mm-dd’)) ,
12 PARTITION p2 VALUES LESS THAN (TO_DATE(‘2015-10-1’, ‘yyyy-mm-dd’)) ,
13 PARTITION p3 VALUES LESS THAN (TO_DATE(‘2016-10-1’, ‘yyyy-mm-dd’)) ,
14 partition p4 values less than (maxvalue)
15 );

Table created.

  1. Hash分区

概念:
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

注意:
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

–按hash分区
SQL> create table part_andy3
2 (
3 transaction_id number primary key,
4 item_id number(8) not null
5 )
6 partition by hash(transaction_id)
7 (
8 partition part_01 ,
9 partition part_02 ,
10 partition part_03
11 );

Table created.

  1. List分区

概念:
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。

注意:
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

– 按list分区
SQL> create table part_andy4
2 (
3 id varchar2(15 byte) not null,
4 city varchar2(20)
5 )
6 partition by list (city)
7 (
8 partition t_list025 values (‘beijing’),
9 partition t_list372 values (‘shanghai’) ,
10 partition t_list510 values (‘changsha’),
11 partition p_other values (default)
12 );

Table created.

  1. 组合分区

Oracle10g提供两种分区组合
– Range-hash
SQL> create table part_andy5
2 (
3 transaction_id number primary key,
4 item_id number(8) not null,
5 item_description varchar2(300),
6 transaction_date date
7 )
8 partition by range(transaction_date)subpartition by hash(transaction_id)
9 (
10 partition part_01 values less than(TO_DATE(‘2014-10-1’, ‘yyyy-mm-dd’)),
11 partition part_02 values less than(TO_DATE(‘2015-10-1’, ‘yyyy-mm-dd’)),
12 partition part_03 values less than(maxvalue)
13 );

Table created.

– Range-list
SQL> CREATE TABLE SALES
2 (
3 PRODUCT_ID VARCHAR2(5),
4 SALES_DATE DATE,
5 SALES_COST NUMBER(10),
6 STATUS VARCHAR2(20)
7 )
8 PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
9 (
10 PARTITION P1 VALUES LESS THAN(TO_DATE(‘2014-10-1’, ‘yyyy-mm-dd’))
11 (SUBPARTITION P1SUB1 VALUES (‘ACTIVE’) ,SUBPARTITION P1SUB2 VALUES (‘INACTIVE’)
12 ),PARTITION P2 VALUES LESS THAN (TO_DATE(‘2015-10-1’, ‘yyyy-mm-dd’))
13 (
14 SUBPARTITION P2SUB1 VALUES (‘ACTIVE’) ,
15 SUBPARTITION P2SUB2 VALUES (‘INACTIVE’)
16 )
17 );

Table created.

Oracle11g增加了四种组合
– RANGE-RANGE
– LIST-RANGE
– LIST-HASH
– LIST-LIST

Oracle 11g 中虚拟列来实现。在11g之前 分区表的partition key必须是物理存在的。11g开始提供了虚拟列,并且可以作为partition key 。
–按星期分区
SQL> CREATE TABLE part_andy6
2 (
3 getdate date NOT NULL,
4 wd NUMBER GENERATED ALWAYS AS (TO_NUMBER (TO_CHAR (getdate, ‘D’))) VIRTUAL
5 )
6 PARTITION BY LIST (wd)
7 (
8 PARTITION Mon VALUES (1),
9 PARTITION Tue VALUES (2),
10 PARTITION Wed VALUES (3),
11 PARTITION Thu VALUES (4),
12 PARTITION Fri VALUES (5),
13 PARTITION Sat VALUES (6),
14 PARTITION Sun VALUES (7)
15 );

Table created.

SQL>
SQL> insert into part_andy6(getdate) values(sysdate);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-1);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-2);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-3);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-4);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-5);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-6);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-7);

1 row created.

– 检查测试成功
SQL> select * from part_andy6;

GETDATE WD


2014-11-23 16:35:07 1
2014-11-24 16:35:07 2
2014-11-25 16:35:07 3
2014-11-26 16:35:07 4
2014-11-27 16:35:07 5
2014-11-28 16:35:07 6
2014-11-29 16:35:07 7
2014-11-22 16:35:08 7

8 rows selected.

Oracle Database 11g,Interval类型分区表,可以根据加载数据,自动创建指定间隔的分区。

创建按月分区的分区表:

a. 创建分区表

SQL> CREATE TABLE interval_andy7 (a1 NUMBER, a2 DATE)
2 PARTITION BY RANGE (a2)
3 INTERVAL ( NUMTOYMINTERVAL (1, ‘MONTH’) )
4 (PARTITION part1
5 VALUES LESS THAN (TO_DATE(‘2014-11-1’, ‘yyyy-mm-dd’)),
6 PARTITION part2
7 VALUES LESS THAN (TO_DATE(‘2014-12-1’, ‘yyyy-mm-dd’))
8 );

Table created.
注意:如果在建Interval分区表是没有把所有的分区写完成,在插入相关数据后会自动生成分区
b. 查看现在表的分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name=‘INTERVAL_ANDY7’;
TABLE_NAME PARTITION_NAME


INTERVALPART PART1
INTERVALPART PART2
c. 插入测试数据:
SQL> begin
2 for i in 0 … 11 loop
3 insert into interval_andy7 values(i,add_months(to_date(‘2014-11-1’,‘yyyy-mm-dd’),i));
4 end loop ;
5 commit;
6 end;
7 /

PL/SQL procedure successfully completed.

PL/SQL 过程已成功完成。
补充:add_months()函数获取前一个月或者下一个月的月份, 参数中 负数 代表 往前, 正数 代表 往后。
–上一个月
select to_char(add_months(trunc(sysdate),-1),‘yyyymm’) from dual;
–下一个月
select to_char(add_months(trunc(sysdate),1),‘yyyymm’) from dual;
d. 观察自动创建的分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name=‘INTERVAL_ANDY7’;

TABLE_NAME PARTITION_NAME


INTERVAL_ANDY7 PART1
INTERVAL_ANDY7 PART2
INTERVAL_ANDY7 SYS_P24
INTERVAL_ANDY7 SYS_P25
INTERVAL_ANDY7 SYS_P26
INTERVAL_ANDY7 SYS_P27
INTERVAL_ANDY7 SYS_P28
INTERVAL_ANDY7 SYS_P29
INTERVAL_ANDY7 SYS_P30
INTERVAL_ANDY7 SYS_P31
INTERVAL_ANDY7 SYS_P32

TABLE_NAME PARTITION_NAME


INTERVAL_ANDY7 SYS_P33
INTERVAL_ANDY7 SYS_P34

13 rows selected.

下面创建一个以天为间隔的分区表:

  1. 创建分区表:
    SQL> create table interval_andy8
    2 (
    3 id number,
    4 dt date
    5 )
    6 partition by range (dt)
    7 INTERVAL (NUMTODSINTERVAL(1,‘day’))
    8 (
    9 partition p20141101 values less than (to_date(‘2014-11-1’,‘yyyy-mm-dd’))
    10 );

Table created.

  1. 查看表分区:
    SQL> select table_name,partition_name from user_tab_partitions where table_name=‘INTERVAL_ANDY8’;

TABLE_NAME PARTITION_NAME


INTERVAL_ANDY8 P20141101

  1. 插入测试数据:
    begin
    for i in 1 … 12 loop
    insert into INTERVAL_ANDY8 values(i,trunc(to_date(‘2014-11-1’,‘yyyy-mm-dd’)+i));
    end loop;
    commit;
    end;
    /
    PL/SQL 过程已成功完成。
  2. 观察自动创建的分区:
    SQL> select table_name,partition_name from user_tab_partitions where table_name=‘INTERVAL_ANDY8’;

TABLE_NAME PARTITION_NAME


INTERVAL_ANDY8 P20141101
INTERVAL_ANDY8 SYS_P35
INTERVAL_ANDY8 SYS_P36
INTERVAL_ANDY8 SYS_P37
INTERVAL_ANDY8 SYS_P38
INTERVAL_ANDY8 SYS_P39
INTERVAL_ANDY8 SYS_P40
INTERVAL_ANDY8 SYS_P41
INTERVAL_ANDY8 SYS_P42
INTERVAL_ANDY8 SYS_P43
INTERVAL_ANDY8 SYS_P44

TABLE_NAME PARTITION_NAME


INTERVAL_ANDY8 SYS_P45
INTERVAL_ANDY8 SYS_P46

13 rows selected.

SAP S/4HANA Cloud 管理员业务角色创建实战:基于 SAP_BR_ADMINISTRATOR 模板的一站式指南 摘要:SAP S/4HANA Cloud新系统初始登录时常见Fiori Launchpad无磁贴的问题,这是由于缺乏合适的业务角色分配。本文介绍了通过预交付的SAP_BR_ADMINISTRATOR模板创建管理员角色的完整流程,包括业务用户、业务角色和业务目录的核心概念解析。重点说明了直接使用模板的风险,并提供了从模板创建自定义管理员角色的详细步骤(4.1-4.3),以及权限限制设置的注意事项。文中还分享了一个实际项目案例,强调正确配置管理员角色对后续权限体系建设的关键作用。(149字) 阅读详情

相关推荐

vivado Block Design 设计 .tcl 文件使用,导出,修改,添加方式

在vivado中生成 Block Design可以导出tcl文件进行保存(体积小),或者在别的版本vivado中打开(版本互通),这是一个非常好的功能。另外GitHub中很多项目都是采用这种方式上传的,学会如何使用可以快速修改历程项目。

2203_75345038的博客 2493

Oracle 创建自增表分区之按月、按天自增表分区

按月自增表分区;按天自增表分区;在进行表分区情况查询时,表的名称必须要大写。查看已经插入的表数据;查看已经插入的表数据;

weixin_42321155的博客 9310

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1571

oracle表分区

--先创建表,分别分区,指定表空间,添加子分区 create table WID_EVT_INS_FIX_BEH_MON ( serv_id NUMBER(12), acc_nbr VARCHAR2(31), local_call_dur NUMBER, local_bil...

weixin_30593443的博客 316

MacOS下微信小程序源码提取与逆向实战:从找到.wxapkg到完整还原

本文详细介绍了在MacOS系统下进行微信小程序源码提取与逆向分析的完整实战流程。从定位沙盒机制中的.wxapkg缓存文件,到搭建Node.js环境与配置wxappUnpacker工具链,再到执行核心反编译命令并处理分包等复杂情况,提供了清晰的操作步骤。文章还汇总了Node版本、依赖缺失、文件乱码等常见问题的解决方案,旨在帮助开发者、安全研究人员高效完成小程序安全审计与学习。

weixin_29246195的博客 1598

Python在Genesis2000 CAM软件中的编程应用

Genesis2000是一款功能强大的计算机辅助制造(CAM)软件,它提供了广泛的功能和工具,用于帮助制造商进行CAD(计算机辅助设计)到CAM的转换。在Genesis2000中,我们可以利用Python的灵活性和功能来扩展软件的自定义能力,并通过编写脚本来自动化各种制造任务。例如,假设我们需要在Genesis2000中添加一个新的操作,用于自动计算零部件的重量。我们可以编写一个Python脚本,通过遍历模型的几何数据并应用相关的计算公式,来实现这个功能。

PixelEnigma的博客 2423

Oracle按日周月年自动分区

Oracle分区表按日周月年自动分区,与无分区建表语句相比多了一些分区信息

qq_39136872的博客 3182

在 SAP BTP 上为应用开启多租户能力:基于 SaaS Provisioning 和 XSUAA 的完整实践指南

本文介绍了在SAP BTP上配置多租户应用的实战指南。主要内容包括: 多租户架构概述:解释provider子账户、consumer子账户和tenant的概念,以及数据隔离机制。 安全配置:在xs-security.json中设置tenant-mode为shared,并为SaaS Provisioning服务添加回调scope授权。 路由配置:通过manifest.yml设置TENANT_HOST_PATTERN来定义多租户访问模式,确保不同租户通过不同子域名访问同一应用。 服务绑定:将XSUAA和SaaS

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 144

Oracle创建分区表(按年、季、月、日自动分区)

这种分区方式会根据插入的数据自动增加分区,不需要手工维护 分区字段必须是日期类型 按年分区 create table test.test_r1 ( id NUMBER(20) not null primary key, name VARCHAR2(20) not null, joindate DATE not null ) tablespace test partition by range(joindate) interval (numtoyminterval(1,'year')) (partition

guang.yan的博客 1万+

华为OD机试真题 新系统2026-04-01 Python&JS 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 1298

DEA模型及matlab应用3:SBM-DEA 模型

好的产出通常是通过资本、基础设施、劳动力的投入而获得的期望产出,非期望产出的产生,比如碳排放、二氧化硫、粉尘和污水等。 由于经典的 DEA 模型对相对效率的评价要求尽可能的减少投入,增加产出。而我们考虑非期望产出的影响则要尽可能的减少非期望产出才能获得更好的经济效益,与传统 DEA 模型的要求不符。考虑非期望产出的DEA模型是:基于松弛变量的 DEA 模型 SBM(Slacks-based mod...

wjyxld的博客 2万+

mysql建表分区按天_oracle表分区详解(按天、按月、按年等)

分区表的概念:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。分区表的优点:1) 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。2) 增强可用性:如果表的某个分区出现故障,表在其...

weixin_30782699的博客 577

第3讲:单端传输线的时域TDR仿真(基于实战的第一次仿真视角切换)

本文为CST仿真系列教程的第3讲,主要介绍传输线阻抗(TDR)的两种仿真方法:基于S参数的频域计算和基于高斯脉冲的时域计算。文章详细演示了在CST PCB Studio中修改电容参数、设置TDR仿真参数(包括截止时间和采样点数)的操作步骤,并通过对比实验展示TVS寄生电容对阻抗曲线的影响。最后将两种TDR方法的结果进行对比,验证了两种方法的一致性。本教程适合硬件工程师通过时域波形直观分析传输线阻抗特性,是信号完整性分析的重要技能。

一只豌豆象的博客 226

Oracle实现按天自动表分区

一、什么是数据库表分区 数据库表分区,和数据库分表是不同的概念,分表是指将一个表分成N多个小表进行数据存储,对外显示有N个表;而表分区是将一个表的数据分成N个区进行存储,对外显示还是只有一个表。本次文章主要记录表分区的实现,将不在对数据库分表进行多说明。现实中可表分区和数据库分表一起使用,增加数据库对数据量大的支持。 1.1、为什么要使用表分区? 在日常的开发中,我们经常会遇到大表,即数据量达到数百万条乃至数千万条的情况。这样的表过于庞大,以至于在进行查询、修改的时候耗时太长,性能低下,所以我..

WuJiangang5112的博客 6673

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

oracle 表分区详解

关于oracle表分区的一些操作。

weixin_44826393的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 物联网数据特点
下一篇: Oracel 索引
狂野弘仁
博客等级 码龄8年 34粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值