oracle 表分区设置

一基本操作:

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

查看表的分区键:

SELECT * FROM ALL_PART_KEY_COLUMNS where name='EMP';

表的分区查询:SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'EMP' 

 创建时间范围分区:

CREATE TABLE emp (
	empno NUMBER (10),
	ename VARCHAR2 (30),
	hiredate DATE
	
) 
PARTITION BY RANGE (hiredate)
(
PARTITION p1 VALUES LESS THAN(to_date('2022-04-01','yyyy-mm-dd')),
PARTITION p2 VALUES LESS THAN(to_date('2022-07-01','yyyy-mm-dd')),
PARTITION p3 VALUES LESS THAN(to_date('2022-10-01','yyyy-mm-dd'))
)

如果不创建最大值:

PARTITION p4 VALUES LESS THAN(maxvalue) --其他值去分区4

插入比上面分区范围大的值时会报错:

[Err] ORA-14400: inserted partition key does not map to any partition

否则就要定时去增加新的分区:

ALTER TABLE EMP ADD PARTITION p4 VALUES LESS THAN(to_date('2023-03-01','yyyy-mm-dd'))

创建成功后,可以成功插入数据

二:分区表常用查询

如果查询当前用户下得分区表:
select * from user_tables where partitioned='YES'
如果要查询整个数据库中的分区表:
select * from dba_tables where partitioned='YES'
如果要查询某个用户下得分区表:
select * from dba_tables where partitioned='YES' and owner=' '
查询索引、表上在那些列上创建了分区:
SELECT * FROM USER_PART_KEY_COLUMNS;
看一个表是否是分区表:
select * from user_tables where table_name =''如果这个表里的tablespace_name为空,代表的就是分区表
分区信息存在SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = ?

三:分区建立语法

创建表空间

CREATE tablespace op_emp1
datafile '/u01/data/qmtest/op_emp1.dbf'
size 100M
autoextend on next 100M maxsize unlimited;

3.1范围分区:分区字段可以是日期,也可以是数字
CREATE TABLE emp (
    empno NUMBER (10),
    ename VARCHAR2 (30),
    hiredate DATE

PARTITION BY RANGE (hiredate)
(
PARTITION p1 VALUES LESS THAN(to_date('2022-04-01','yyyy-mm-dd')) tablespace op_emp1,
PARTITION p2 VALUES LESS THAN(to_date('2022-07-01','yyyy-mm-dd')) tablespace op_emp2,
PARTITION p3 VALUES LESS THAN(to_date('2022-10-01','yyyy-mm-dd')) tablespace op_emp3,
PARTITION p4 VALUES LESS THAN(maxvalue) tablespace op_emp4--其他值去分区4
)

3.2列表分区:针对于该列只有固定几个值的分区:例如省份,部门

CREATE TABLE emp (
    empno NUMBER (10),
    ename VARCHAR2 (30),
    hiredate DATE,
    city varchar(10)

PARTITION BY list (city)
(
PARTITION p1 VALUES ('江苏','安徽','浙江') ,
PARTITION p2 VALUES ('黑龙江','吉林','辽宁'),
PARTITION p3 VALUES ('新疆') ,
PARTITION p4 VALUES ('其他') --其他值去分区4
)

分区后不加tablespace op_emp1,会自动分到默认的表空间

3.3hash分区:主要是针对于字符串字段的分区
CREATE TABLE emp (
    empno NUMBER (10),
    ename VARCHAR2 (30),
    hiredate DATE

PARTITION BY hash (ename)
(
PARTITION p1 ,
PARTITION p2 ,
PARTITION p3 ,
PARTITION p4 --其他值去分区4

)

hash分区很难知道数据具体在哪个分区,sql 查询表后面就不好加 partition(p1)的分区查询

3.4复合分区
    范围分区与散列分区或范围分区与列表分区

create table student(
  sno number,sname varchar2(10)
)
partition by range(sno)
subpartition by hash(sname)
subpartitions 4
(
   partition p1 values less than (1000),
   partition p2 values less than (2000),
   partition p3 values less than (maxvalue)
)

四:已创建的分区表的查询

表的数量如下图,目前查询速度正常:

 已有创建分区的表进行查询,查询条件不是分区键,看到Partition Start :ROW LOCATION 查询全部分区表,从前往后依次扫描,直到找到数据,这个时候如果不加分区值,就是感觉和全表扫描没什么区别

 查询条件包含分区键时,可看到Partition Start的具体选择值,Partiton_Start:3 对应的就是表分区信息的Partition_Positiotn。这个时候大表分区就会只查唯一指定的分区,查询自然会很快

 查询条件已知分区时和上面类似

 Oracle 分区表查询,可参考:oracle分区表查询(转) - 走看看

总结:

1:大表建不建分区,还是要看是否经常用到分区键的查询

2:分区是否需要建的比较频繁:分区多的话,并且没有加分区或者使用分区键为条件,并不会提高查询速度

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值