本文是让有MySQL和SQL基础的用户掌握Oranle数据库的特性并快速上手而编写的

Oracle数据库

本文是让有MySQL和SQL基础的用户掌握Oranle数据库的特性并快速上手而编写的

一.基本特性

MySQL是一个开源的关系数据库管理系统,免费且易于使用,适合中小型企业和个人。Oracle则是一个对象关系数据库管理系统(ORDBMS),功能强大,适合大型企业,适合处理高并发大数据量的复杂业务场景。但需要付费。

对象关系 数据库管理系统:基于对象模型,存储数据及其方法,数据存储在对象中。拥有对象类、对象标识、多态、封装和继承等特性。用于存储复杂的数据。

关系 数据库管理系统:基于关系模型, 只存储数据,数据存储在实体里面,以包含特定信息的表格的形式存在。用于处理比较简单的数据

标准 RDBMS ORDBMS
缩写含义 关系数据库管理系统 面向对象数据库管理系统
数据存储方式 数据以表格形式存储,包含行和列 数据以对象形式存储
数据复杂性 适合处理简单的结构化数据 适合处理更大、更复杂的对象数据
分组 实体集合通过表定义,实体类型独立 通过类描述对象,包含属性、行为和关系
数据处理 仅存储数据,不存储方法或逻辑 存储数据及关联的方法(行为)
主要目标 数据独立性(与应用逻辑分离) 数据封装(数据与行为结合)
主键/对象标识 主键(Primary Key)唯一标识表中的行 对象标识符(OID)唯一且持久标识对象

客户规模:Oracle主要面向大企业级级别的用户,而MySQL则更适合中小型企业和个人。根据Gartner的数据,截至2020年,Oracle占据了全球关系型数据库管理系统市场的超过40%的份额,而MySQL仅占5%。

可移植性和兼容性:MySQL可以很容易地在各种平台上运行,并与其他许多开源软件集成。Oracle虽然也有跨平台支持,但更偏向于使用自己的技术堆栈和产品集成。

安全性:Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。MySQL只使用三个参数来验证用户,即用户名,密码和位置。

内存:Oracle占有内存空间大(因为面对对象,并且还存储数据的方法);MySQL占有内存空间比较小

性能和扩展性:由于MySQL的精简设计和管理方式,所以其性能通常比Oracle更高,尤其在读取和写入方面。MySQL的扩展性也相对较好,因为其社区活跃,有许多插件和工具可供选择和使用。
支持并发量:Oracle支持大并发访问量,是OLTP(联机事务处理)最好的工具;MySQL并发小,面对大访问量可以做分表分库优化。

OLTP(联机事务处理):表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。典型的OLTP系统有电子商务系统、银行、证券等。

存储内容:与Oracle相比,MySQL没有角色管理(MySQL8.0开始支持),快照,同义词和包以及自动存储管理。

表空间

Oracle:

  • SYSTEM:存放系统表、视图、存储过程。所有的数据库结构和管理信息都保存在这里。
    SYSAUX:SYSTEM 表空间的辅助空间,主要用于存储除数据字典外的其他数据对象,减少 SYSTEM 表空间的负荷
    TEMP:用于存储临时数据,通常是排序和临时操作所需的数据。
    UNDOTBS1:存放撤销数据,用于回滚事务和提供一致性读操作。    
    USERS:存放应用系统使用的数据对象,是默认用户表空间。
    EXAMPLE:存储数据库的示例数据,通常是 Oracle 安装时选择"示例方案"时所用的数据。
    
    1
    2
    3
    4
    5
    6
    7

    MySQL:

    - ```
    MySQL5.6之前,只有共享表空间(所有数据存储在一个 .ibdata 文件中)。

    5.6开始,支持独立表空间(每个表单独的 .ibd 文件)和共享表空间(存储系统数据库和表,初始12MB,会自动扩容)。

可移植性和兼容性:MySQL可以很容易地在各种平台上运行,并与其他许多开源软件集成。Oracle虽然也有跨平台支持,但更偏向于使用自己的技术堆栈和产品集成。

临时表特点:Oracle临时表默认所有会话内可见,一旦创建就会存在,直到显式删除。可以设置临时表仅在当前会话内或事务内可见。MySQL临时表只在当前会话可见,一旦会话关闭,临时表会自动删除。

二.基本操作

端口和管理员

Oracle默认端口:1521 默认用户:system
MySQL默认端口:3306 默认用户:root

登录

MySQL:

1
2
3
4
5
6
7
8
9
mysql -u root -p
-- 输入密码

-- 查询所有数据库
show databases;
-- 切换到 "test" 这个数据库
use test;
-- 查询该数据库所有表
show tables;

Oracle:

1
2
3
4
5
6
sqlplus
-- 输入用户名
-- 输入密码

-- 查询该用户的表
select TABLE_NAME from user_tables;

Oracle 登录需要授予登录用户 CREATE SESSION 权限,这意味着用户需要被授权创建数据库会话的权限才能成功登录。建表需要分配限额,指的是用户需要在其所属的表空间中拥有足够的存储空间配额才能创建新的表。如果没有足够的配额,即使拥有 CREATE TABLE 权限,也无法成功创建表。

修改密码

在管理员权限下修改普通用户密码

MySQL:

1
set password for 用户名@localhost = password('新密码')

Oracle:

1
ALTER USER 用户名 IDENTIFIED BY 新密码;

修改管理员用户密码

1.找到Oracle安装路径,访问database文件夹:

2.删除PWDorcl.ora

3.修改密码:

1
orapwd file=~\database\pwdPWDorcl.ora password=new_password

Oracle解锁账号

Oracle 在多次输错密码的情况下,会锁定该账户,导致无法登录数据库。

查看被锁定的账号:

1
2
3
SELECT username, account_status
FROM dba_users
WHERE account_status LIKE '%LOCKED%';

解锁账号:

1
ALTER USER 用户名 ACCOUNT UNLOCK;

恢复密码:

1
ALTER USER 用户名 IDENTIFIED BY 新密码 ACCOUNT UNLOCK;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 解锁。用户名不用引号
ALTER USER SYSTEM ACCOUNT UNLOCK;
-- 设置密码
ALTER USER SYSTEM IDENTIFIED BY SYSTEM ACCOUNT UNLOCK;
--语法结构:创建用户
CREATE USER 用户名 IDENTIFIED BY password [ACCOUNT LOCK|UNLOCK];

--语法结构:给用户授权
GRANT CONNECT,RESOURCE TO 用户名;
--- 直接将connect角色,--resource角色授予用户。
--- CONNECT角色:连接数据库。RESOURCE:正常使用数据库

GRANT CREATE TABLE TO 用户名; --- 给用户创建表的权限
GRANT CREATE VIEW TO 用户名; --- 给用户创建视图的权限

--语法结构:收回用户权限
REVOKE 角色|权限 FROM 用户(角色)

--语法结构:修改用户的密码
ALTER USER 用户名 IDENTIFIED BY 新密码;


--语法结构:给用户加锁/解锁
ALTER USER 用户名 ACCOUNT LOCK/UNLOCK;

内存优化

在Oracle 11g及之后的版本中,自动内存管理(Automatic Memory Management(AMM))默认是开启的

Oracle开启AMM后,会根据当前系统的内存情况动态地分配内存,直到达到指定的最大值。当系统需要更多内存时,AMM会自动减少内存使用量。

1
2
3
ALTER SYSTEM SET MEMORY_TARGET=2GB,SCOPE=SPFILE;
-- 最大内存
ALTER SYSTEM SET MEMORY_MAX_TARGET=3GB,SCOPE=SPFILE;

在Oracle 10g及其后续版本中,自动共享内存管理(Automatic Shared Memory Management(ASMM))是默认开启的

ASMM会自动检测当前系统的内存使用情况,并根据需求分配和释放共享内存区域。

与AMM不同,ASMM只处理共享池、缓冲区高速缓存、Java池和辅助预留区的共享内存。

1
2
ALTER SYSTEM SET SGA_TARGET=1024M;
ALTER SYSTEM SET SGA_MAX_SIZE=2048M;

Oracle创建表空间

创建表空间

1
create tablespace 表空间名称 logging datafile '路径\名称.dbf' size 2000m autoextend on next 500m maxsize 30720m extent management local;
  • autoextend on: 这启用了数据文件的自动扩展功能。当表空间已满时,数据文件将自动增加大小。
  • next 500m: 这指定了每次自动扩展时数据文件增加的大小为 500 MB。
  • maxsize 30720m: 这设置了数据文件的最大大小为 30720 MB (30GB)。数据文件不会超过这个大小自动扩展。
  • extent management local: 这指定了表空间使用本地管理的区段。这意味着表空间的区段分配信息存储在表空间本身的数据文件中,而不是存储在数据字典中。这通常是推荐的做法,因为它能提高性能并减少争用。

创建用户:

1
create user 用户名 identified by 密码 default tablespace 表空间名;

修改用户默认表空间:

1
alter user 用户名 default tablespace 表空间名

书写习惯

关键字(例如 SELECT、FROM、WHERE 等)不区分大小写如果你在双引号内定义的对象(如表名、列名),则会大小写敏感

1
2
3
CREATE TABLE "TableName"("id" number); // 如果创建表的时候是这样写的,那么就必须严格区分大小写

SELECT * FROM "TableName";

MySQL:大小写不敏感

基础数据类型

类别 类型 描述 示例
数值类型 NUMBER(p, s) 高精度数值,p为总位数,s为小数位数。若不指定,可存储任意精度。 NUMBER(10,2) → 12345678.90
BINARY_FLOAT 32位单精度浮点数(IEEE 754) 科学计算、高速近似计算
BINARY_DOUBLE 64位双精度浮点数(IEEE 754) 同上,更高精度
字符类型 CHAR(n) 定长字符串,不足补空格,最大2000字节。 CHAR(10) → ‘ABC ‘
VARCHAR2(n) 变长字符串,最大4000字节(推荐替代VARCHAR)。 VARCHAR2(100) → ‘Hello’
NCHAR(n) 定长Unicode字符串(按字符计算长度)。 NCHAR(10) → ‘中文 ‘
NVARCHAR2(n) 变长Unicode字符串(按字符计算长度)。 NVARCHAR2(100) → ‘こんにちは’
CLOB 大文本数据(最大128TB)。 存储长文章、XML/JSON文本
NCLOB Unicode大文本数据。 多语言文本存储
日期时间 DATE 日期+时间(精确到秒),格式为YYYY-MM-DD HH24:MI:SS DATE '2023-10-01'
TIMESTAMP(p) 时间戳,p为小数秒精度(0-9)。 TIMESTAMP(6) → 精确到微秒
TIMESTAMP WITH TIME ZONE 带时区的时间戳。 跨时区应用
INTERVAL YEAR TO MONTH 存储年月间隔。 INTERVAL '2-6' YEAR TO MONTH
INTERVAL DAY TO SECOND 存储日时间隔(可含小数秒)。 INTERVAL '10 03:30:00' DAY TO SECOND
二进制类型 BLOB 二进制大对象(最大128TB)。 存储图片、PDF文件
BFILE 指向外部文件的二进制指针(文件存储在操作系统)。 外部文件引用
RAW(n) 原始二进制数据(最大2000字节)。 加密数据、哈希值
LONG RAW 遗留类型(不推荐),最大2GB二进制数据(用BLOB替代)。

特殊与扩展类型

类型 描述 适用场景
ROWID 物理行地址(18字符字符串),唯一标识一行。 快速访问特定行
UROWID 通用行标识(支持逻辑和物理ROWID)。 分布式数据库
XMLType 存储和操作XML数据。 XML文档存储、XPath查询
JSON (12c+) 原生JSON支持(需Oracle 12c及以上版本)。 REST API数据存储
SDO_GEOMETRY 空间数据类型(需Oracle Spatial扩展)。 GIS地理信息系统
ANYDATA/ANYDATASET 存储任意类型的数据(动态类型)。 异构数据集成

运算

集合运算

1
2
3
4
intersect	--交集
union --并集,去重
union all --并集,不去重。性能最好
minus --补集

数据类型间相互转换

1
2
3
4
5
6
7
8
9
--转换日期型
to_date(x,y) --y的长度要和x保持一致
eg: to_date(sysdate,'yyyy-mm-dd hh24:mi:ss')

--转换字符型
to_char() --可以单独去'yyyy''mm''dd'...

--转换数字型
to_number()

DQL

和sql通用语句基本一致

注意:在oracle中没有mysql中的limit,当我们需要找某列的最大值或者最小值我们需要借助函数实现。

连接查询的oracle写法[oracle独有]
1
2
3
4
5
6
7
8
9
10
11
12
--内连接
select...
from 表1,表2,...
where 关联条件1/过滤条件 [and/or 关联条件2 and/or ....]
--左外连接
select...
from 表1,表2,...
where 表1的某个字段 运算符 表2的某个字段(+) --表1是主表,表2是从表
--右外连接
select...
from 表1,表2,...
where 表1的某个字段(+) 运算符 表2的某个字段 --表2是主表,表1是从表

伪列(oracle独有)

1
2
rownum  --对某列进行排序
rowid --返回当前列的ID值

删除重复行的rowid写法

1
2
3
4
5
6
7
8
9
-- 删除张三Chinese科目的非最新数据(只保留rowid最大的)的一行
delete from grade t2
where rowid != (select max(rowid)
from grade t
where t.name = '张三'
and t.subject = 'chinese')
and t2.name = '张三'
and t2.subject = 'chinese';
commit;

DML

数据操纵语言DML,该部分语言在执行完语句后需要添加commit语句进行提交的操作

函数

1.数字函数

  • nvl(目标字段,默认值) 
    --判断目标字段里面是否为空,如果不为空,则取目标字段的值,如果为空,则赋一个默认值
    abs(x)    --返回绝对值
    mod(x,y)    --返回x除以y的余数
    power(x,y)    --返回x的y次方
    ceil(x)        --向上取整
    floor(x)    --向下取整
    round(x,y)    --
    trunc(x,y)    --y的界限为小数点...断x在第y后的数字,把y位之后的数字全干掉(全换成0)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    2.日期函数

    - ```
    add_months(d,n) --返回日期d加上n个月后的日期
    last_day(d) --返回d所处月份的最后一天的日期
    months_between(d1,d2) --返回两个日期之间相隔几个月
    round(d[,fmt])
    --对日期d按照不同维度(fmt:yyyy/mm/dd/day[星期]/q[季度]/w[当月第几周]/iw[今年第几周1]/ww[今年第几周2])来进行四舍五入

    trunc(d[,fmt]) --对日期d按照不同维度(fmt)来截断,维度参照fmt

聚合函数

  • max()
    min()
    avg()
    sum()
    count()
    
    1
    2
    3
    4

    5. 分析函数
    a. 聚合类分析函数

    聚合函数名(目标字段)over(partition by...order by...desc/asc)
    1
    2
    3

    b. 排名类分析函数

    row_number()over() --不计算相同数据,排名依次往后。1234 rank()over() --计算想要的数据,相同的数据排名一样,并空出后继续排名。1224 dense_rank()over()--计算相同的数据,相同的数据排名一样,但是不空出后续排名。1223 order by 后面的字段就是排名的依据,所以它一定有 order by
    1
    2
    3

    c. 位移类分析函数

    lag()over([partition by...]order by...) --向上位移 lead()over([partition by...]order by...) --向下位移
    1
    2
    3

    6.判断函数

    nvl(目标字段,默认值) --判断目标字段是否为空,如果不为空,则取目标字段的值,如果为空,则赋默认值 nvl2(目标字段,默认值1,默认值2) --判断目标字段是否为空,如果不为空,则取默认值1,为空取默认值2 case when...then...else...end --对某一列数据进行判断,返回一列数据 decode(目标字段,值1,结果1,值2,结果2...,其他结果) --oracle独有。作用类似case...when exists(x) --判断x是否有数据返回,如果有则成立,没有则不成立。一般x为子查询结果 not exists(x) in() not in()

#exists和in可以相互转换
sign() —判断结果集,返回0,1,-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20



# 三.PLSQL

**PLSQL**是 Oracle 数据库对 SQL 语言的扩展。 它是一种过程化语言,允许在 SQL 语句中包含控制结构(如循环和条件语句)、变量和过程。 这使得开发者能够编写更复杂和高效的数据库应用程序。

```sql
declare
--声明变量
变量 数据类型 := 初始值;
变量 数据类型 := &提示字段;--自定义输入数据
变量 表名.列名%type := 初始值;--使用某表的列定义数据类型
变量 表名%type := 初始值;--将整个表的数据拿到自身,需要使用其中的数据类型时,表名.列名调用即可。
begin
select...--sql取数语句
into...--对应变量

dbms_output.put_line();--数据输出格式
end;

plsql的数据类型参照sql,仅有三种:varchar2、number、date

条件判断

a. if…else…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare
--声明部分
begin
--逻辑/操作部分
select...

if 条件1 and/or 条件2 then
操作1;
elsif 条件3 and/OR 条件4 then
操作2;
...
else
其他操作;
end if;

end;
b. case…when…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
--声明部分
begin
--逻辑/操作部分
case
when 条件1 and/or 条件2 then
操作1;
when 条件3 and/OR 条件4 then
操作2;
...
else
其他操作;
end case;
end;

循环控制

a. loop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare
--声明部分
begin
--逻辑部分
loop
--循环体

if 退出循环的条件 then
exit;
end if;

--退出循环的简写
exit when 退出循环的条件;

end loop;
end;
b. while
1
2
3
4
5
6
7
declare
--声明部分
begin
while 进入循环的条件 loop
--循环体
end loop;
end;
c. for
1
2
3
4
5
6
7
8
declare
--声明部分
begin
--逻辑部分
for 循环变量 in 循环下限 .. 循环上限 loop
--循环体
end loop;
end;

四.SQL优化

1. 索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--创建索引
create [unique] index index_name on
table_name (column_name [,column_name...])

--索引类别
/*
1. UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引。
2. index_name:指定索引名。
3. tabl_name:指定要为哪个表创建索引。
4. column_name:指定要对哪个列创建索引。我们也可以对多列创建索引;这种索引称为组合索引。

*/
--删除索引
DROP INDEX index_name

2. 表分区

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
1、范围分区
【例】按入职日期进行范围分区
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY RANGE (HIREDATE)
(
PARTITION part1 VALUES LESS THAN (TO_DATE('1981-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS01, --①
PARTITION part2 VALUES LESS THAN (TO_DATE('1982-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS02,
PARTITION part3 VALUES LESS THAN (TO_DATE('1983-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS03,
PARTITION part4 VALUES LESS THAN (TO_DATE('1988-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS04,
PARTITION part5 VALUES LESS THAN (MAXVALUE) TABLESPACE CUS_TS05
)

2.列表分区:
【例】按DEPTNO进行LIST分区
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY LIST (DEPTNO)
(
PARTITION MYEMP_DEPTNO_10 VALUES (10),
PARTITION MYEMP_DEPTNO_20 VALUES (20) ,
PARTITION MYEMP_DEPTNO_30 VALUES (30) ,
PARTITION MYEMP_DEPTNO_40 VALUES (40)
)

3.散列分区:
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY HASH (COL)
(
PARTITION PART01 TABLESPACE HASH_TS01,
PARTITION PART02 TABLESPACE HASH_TS02,
PARTITION PART03 TABLESPACE HASH_TS03
)
简写:
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

4.组合分区(组合范围散列分区)
基于 范围分区 和 列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区
【例】按入职日期进行范围分区,再按DEPTNO进行LIST子分区
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY RANGE(HIREDATE) SUBPARTITION BY LIST (DEPTNO)
(
PARTITION P1 VALUES LESS THAN(TO_DATE('1981-01-01','YYYY-MM-DD'))
(
SUBPARTITION P1A VALUES (10) ,
SUBPARTITION P1B VALUES (20),
SUBPARTITION P1C VALUES (30),
SUBPARTITION P1D VALUES (40)
),
PARTITION P2 VALUES LESS THAN (TO_DATE('1982-01-01','YYYY-MM-DD'))
(
SUBPARTITION P2A VALUES (10) ,
SUBPARTITION P2B VALUES (20),
SUBPARTITION P2C VALUES (30),
SUBPARTITION P2D VALUES (40)
),
PARTITION P3 VALUES LESS THAN (TO_DATE('1983-01-01','YYYY-MM-DD'))
(
SUBPARTITION P3A VALUES (10) ,
SUBPARTITION P3B VALUES (20),
SUBPARTITION P3C VALUES (30),
SUBPARTITION P3D VALUES (40)
),
PARTITION P4 VALUES LESS THAN (TO_DATE('1988-01-01','YYYY-MM-DD'))
(
SUBPARTITION P4A VALUES (10) ,
SUBPARTITION P4B VALUES (20),
SUBPARTITION P4C VALUES (30),
SUBPARTITION P4D VALUES (40)
)
)
5.复合分区(复合范围散列分区)
基于 范围分区 和 散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
partition by range(transaction_date) subpartition by hash(transaction_id)
subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
(
partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
partition part_03 values less than(maxvalue)
);

1)添加分区
以下代码给表添加了一个P3分区
ALTER TABLE 表名 ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意:以上添加的分区界限应该高于最后一个分区界限。

以下代码给表的P3分区添加了一个P3SUB1子分区
ALTER TABLE 表名 MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

2)删除分区
以下代码删除了P3表分区:
ALTER TABLE 表名 DROP PARTITION P3;

在以下代码删除了P4SUB1子分区:
ALTER TABLE 表名 DROP SUBPARTITION P4SUB1;
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

3)截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。
当表中即使只有一个分区时,也可以截断该分区。
通过以下代码截断分区:
ALTER TABLE 表名 TRUNCATE PARTITION P2;

通过以下代码截断子分区:
ALTER TABLE 表名 TRUNCATE SUBPARTITION P2SUB2;

4)合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,
注意的是,不能将分区合并到界限较低的分区。
以下代码实现了P1 P2分区的合并:
ALTER TABLE 表名 MERGE PARTITIONS P1,P2 INTO PARTITION P2;

5)拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。
ALTER TABLE 表名 SBLIT PARTITION 分区名 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);

6)接合分区(coalesca)
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,
注意的是,接合分区只能用于散列分区中。
通过以下代码进行接合分区:
ALTER TABLE 表名 COALESCA PARTITION;

7)重命名表分区
以下代码将P21更改为P2
ALTER TABLE 表名 RENAME PARTITION P21 TO P2;


新ICP备2025018290号-1
本站总访问量