oracle表分区详解

oracle表分区详解

从以下几个方面来整理关于分区表的概念及操作:

  1. 表空间及分区表的概念
  2. 表分区的具体作用
  3. 表分区的优缺点
  4. 表分区的几种类型及操作方法
  5. 对表分区的维护性操作

 1.表空间及分区表的概念

表空间:

  是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。

 

分区表:

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

 

2.表分区的具体作用

Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

 

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库 管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但 是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

 

什么时候使用分区表:

1)   表的大小超过2GB。

2)   表中包含历史数据,新的数据被增加都新的分区中。

 

3.表分区的优缺点

优点:

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

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

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

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

 

缺点:

分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

 

4.表分区的几种类型及操作方法

1.范围分区

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

当使用范围分区时,请考虑以下几个规则:

1)   每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。

2)   所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。

3)   在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。

例1:

假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:

复制代码
CREATE TABLE CUSTOMER
(CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,FIRST_NAME  VARCHAR2(30) NOT NULL,LAST_NAME   VARCHAR2(30) NOT NULL,PHONE        VARCHAR2(15) NOT NULL,EMAIL        VARCHAR2(80),STATUS       CHAR(1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
)
复制代码

 

例2:按时间划分

复制代码
CREATE TABLE ORDER_ACTIVITIES
(ORDER_ID      NUMBER(7) NOT NULL,ORDER_DATE    DATE,TOTAL_AMOUNT NUMBER,CUSTOTMER_ID NUMBER(7),PAID           CHAR(1)
)PARTITION BY RANGE (ORDER_DATE)
(PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03)
复制代码

 

例3:MAXVALUE

复制代码
CREATE TABLE RangeTable
(idd   INT PRIMARY KEY ,iNAME VARCHAR(10),grade INT 
)
PARTITION  BY  RANGE (grade)
(PARTITION  part1 VALUES  LESS  THEN (1000) TABLESPACE  Part1_tb,PARTITION  part2 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  Part2_tb
);
复制代码

 

2.列表分区:

该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

例1

复制代码
CREATE TABLE PROBLEM_TICKETS
(PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,DESCRIPTION  VARCHAR2(2000),CUSTOMER_ID  NUMBER(7) NOT NULL,DATE_ENTERED DATE NOT NULL,STATUS       VARCHAR2(20)
)
PARTITION BY LIST (STATUS)
(PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
复制代码

 

例2

复制代码
CREATE  TABLE  ListTable
(id    INT  PRIMARY  KEY ,name  VARCHAR (20),area  VARCHAR (10)
)
PARTITION  BY  LIST (area)
(PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb
);)
复制代码

 

 

3.散列分区:

这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。

散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

例1:

复制代码
CREATE TABLE HASH_TABLE
(COL NUMBER(8),INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(PARTITION PART01 TABLESPACE HASH_TS01,PARTITION PART02 TABLESPACE HASH_TS02,PARTITION PART03 TABLESPACE HASH_TS03
)
复制代码

 

简写:

复制代码
CREATE TABLE emp
(empno NUMBER (4),ename VARCHAR2 (30),sal   NUMBER
)
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
复制代码

 

 

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

 

4.组合范围散列分区

这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

复制代码
CREATE TABLE SALES
(PRODUCT_ID VARCHAR2(5),SALES_DATE DATE,SALES_COST NUMBER(10),STATUS VARCHAR2(20))PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)(PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009(SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009),PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009(SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009)
)
复制代码

 

 

5.复合范围散列分区:

这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

复制代码
create table dinya_test(transaction_id number primary key,item_id number(8) not null,item_description varchar2(300),transaction_date date)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));
复制代码

 

 

5.有关表分区的一些维护性操作

1)   添加分区

以下代码给SALES表添加了一个P3分区

ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD')); 

 

注意:以上添加的分区界限应该高于最后一个分区界限。

以下代码给SALES表的P3分区添加了一个P3SUB1子分区

ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

 

2)   删除分区

以下代码删除了P3表分区:

ALTER TABLE SALES DROP PARTITION P3;

 

在以下代码删除了P4SUB1子分区:

ALTER TABLE SALES DROP SUBPARTITION P4SUB1;

 

注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

3)   截断分区

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

ALTER TABLE SALES TRUNCATE PARTITION P2;

 

通过以下代码截断子分区:

ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;

 

4)   合并分区

合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:

ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

 

5)   拆分分区

拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。

ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22); 

 

6)   接合分区(coalesca)

结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:

ALTER TABLE SALES COALESCA PARTITION;

 

7)   重命名表分区

以下代码将P21更改为P2

ALTER TABLE SALES RENAME PARTITION P21 TO P2;

 

8)   相关查询

跨分区查询

复制代码
select sum( *) from(select count(*) cn from t_table_SS PARTITION (P200709_1)union allselect count(*) cn from t_table_SS PARTITION (P200709_2)); 
复制代码

 

查询表上有多少分区

SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName' 

 

查询索引信息

复制代码
select object_name,object_type,tablespace_name,sum(value)from v$segment_statisticswhere statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'group by object_name,object_type,tablespace_nameorder by 4 desc 
复制代码

 

 

--显示数据库所有分区表的信息:

select * from DBA_PART_TABLES 

 

--显示当前用户可访问的所有分区表信息:

select * from ALL_PART_TABLES 

 

--显示当前用户所有分区表的信息:

 

select * from USER_PART_TABLES 

 

--显示表分区信息 显示数据库所有分区表的详细分区信息:

select * from DBA_TAB_PARTITIONS 

 

--显示当前用户可访问的所有分区表的详细分区信息:

select * from ALL_TAB_PARTITIONS 

 

--显示当前用户所有分区表的详细分区信息:

select * from USER_TAB_PARTITIONS 

 

--显示子分区信息 显示数据库所有组合分区表的子分区信息:

select * from DBA_TAB_SUBPARTITIONS 

 

--显示当前用户可访问的所有组合分区表的子分区信息:

 

select * from ALL_TAB_SUBPARTITIONS

 

--显示当前用户所有组合分区表的子分区信息:

 

select * from USER_TAB_SUBPARTITIONS

 

--显示分区列 显示数据库所有分区表的分区列信息:

select * from DBA_PART_KEY_COLUMNS

 

--显示当前用户可访问的所有分区表的分区列信息:

select * from ALL_PART_KEY_COLUMNS 

 

--显示当前用户所有分区表的分区列信息:

select * from USER_PART_KEY_COLUMNS 

 

--显示子分区列 显示数据库所有分区表的子分区列信息:

select * from DBA_SUBPART_KEY_COLUMNS

 

--显示当前用户可访问的所有分区表的子分区列信息:

select * from ALL_SUBPART_KEY_COLUMNS 

 

--显示当前用户所有分区表的子分区列信息:

select * from USER_SUBPART_KEY_COLUMNS 

 

--怎样查询出oracle数据库中所有的的分区表

select * from user_tables a where a.partitioned='YES' 

 

--删除一个表的数据是

truncate table table_name; 

 

--删除分区表一个分区的数据是

alter table table_name truncate partition p5; 

 

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

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

相关文章

如果您不将Docker用于数据科学项目,那么您将生活在1985年

重点 (Top highlight)One of the hardest problems that new programmers face is understanding the concept of an ‘environment’. An environment is what you could say, the system that you code within. In principal it sounds easy, but later on in your career yo…

jmeter对oracle压力测试

下载Oracle的jdbc数据库驱动包,注意Oracle数据库的版本,这里使用的是:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production; 一般数据库的驱动包文件在安装路径下:D:\oracle\product\10.2.…

docker部署flask_使用Docker,GCP Cloud Run和Flask部署Scikit-Learn NLP模型

docker部署flaskA brief guide to building an app to serve a natural language processing model, containerizing it and deploying it.构建用于服务自然语言处理模型,将其容器化和部署的应用程序的简要指南。 By: Edward Krueger and Douglas Franklin.作者&am…

SQL的执行计划

SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。 执行计划的定义:执行目标SQL的所有步骤的组合。 我们首…

[转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.

USB-C和Thunderbolt 3连接线你搞懂了吗? 2018年11月25日 07:30 6318 次阅读 稿源:威锋网 3 条评论按照计算行业的风潮,USB Type-C 将会是下一代主流的接口。不过,在过去两年时间里,关于 USB-C、Thunderbolt 3、USB 3.1…

大数据技术 学习之旅_为什么聚焦是您数据科学之旅的关键

大数据技术 学习之旅David Robinson, a data scientist, has said the following quotes:数据科学家David Robinson曾说过以下话: “When you’ve written the same code 3 times, write a function.”“当您编写了3次相同的代码时,请编写一个函数。” …

无监督学习 k-means_无监督学习-第4部分

无监督学习 k-means有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as much as …

vCenter 升级错误 VCSServiceManager 1603

近日,看到了VMware发布的vCenter 6.7 Update 1b的更新消息。其中有一条比较震撼。有误删所有VM的概率,这种BUG谁也承受不起。Removing a virtual machine folder from the inventory by using the vSphere Client might delete all virtual machinesIn t…

day28 socketserver

1. socketserver 多线程用的 例 import socket import timeclientsocket.socket() client.connect(("127.0.0.1",9000))while 1:cmdinput("请输入指令")client.send(cmd.encode("utf-8"))from_server_msgclient.recv(1024).decode("utf…

车牌识别思路

本文源自我之前花了2天时间做的一个简单的车牌识别系统。那个项目,时间太紧,样本也有限,达不到对方要求的95%识别率(主要对于车牌来说,D,0,O,I,1等等太相似了。然后,汉字…

深度学习算法原理_用于对象检测的深度学习算法的基本原理

深度学习算法原理You just got a new drone and you want it to be super smart! Maybe it should detect whether workers are properly wearing their helmets or how big the cracks on a factory rooftop are.您刚刚拥有一架新无人机,并希望它变得超级聪明&…

【python】numpy库linspace相同间隔采样 详解

linspace可以用来实现相同间隔的采样; numpy.linspace(start,stop,num50,endpointTrue,retstepFalse, dtypeNone) 返回num均匀分布的样本,在[start, stop]。 Parameters(参数): start : scalar(标量) The starting value of the sequence(序列的起始点)…

Spring整合JMS——基于ActiveMQ实现(一)

Spring整合JMS——基于ActiveMQ实现(一) 1.1 JMS简介 JMS的全称是Java Message Service,即Java消息服务。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的…

CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-8CDH5安装和集群配置

Cloudera Manager Server和Agent都启动以后,就可以进行CDH5的安装配置了。 准备文件 从 http://archive.cloudera.com/cdh5/parcels/中下载CDH5.14.0的相关文件 把CDH5需要的安装文件放到主节点上,新建目录为/opt/cloudera/parcel-repo把我们之前下载的…

node.js安装部署测试

(一)安装配置: 1:从nodejs.org下载需要的版本 2:直接安装,默认设置 ,默认安装在c:\program files\nodejs下。 3:更改npm安装模块的默认目录 (默认目录在安装目录下的node…

社群系统ThinkSNS+ V2.2-V2.3升级教程

WARNING本升级指南仅适用于 2.2 版本升级至 2.3 版本,如果你并非 2.2 版本,请查看其他升级指南,Plus 程序不允许跨版本升级!#更新代码预计耗时: 2 小时这是你自我操作的步骤,确认将你的 2.2 版本代码升级到…

activemq部署安装

一、架构和技术介绍 1、简介 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 2、activemq的特性 1. 多种语言和协议编写客户端。语言: Java, C, C, C#, Ruby, Perl, Python, PHP。应用协议: …

主串与模式串的匹配

主串与模式串的匹配 (1)BF算法: BF算法比较简单直观,其匹配原理是主串S.ch[i]和模式串T.ch[j]比较,若相等,则i和j分别指示串中的下一个位置,继续比较后续字符,若不相等,从…

什么是 DDoS 攻击?

欢迎访问网易云社区,了解更多网易技术产品运营经验。 全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务。通俗点讲就是利用网络…

nginx 并发过十万

一般来说nginx 配置文件中对优化比较有作用的为以下几项: worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每…