[oracle]分区表学习

(一)什么是分区

所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区。

(二)分区的优势

  • 提高数据可管理性。对表进行分区,数据的加载、索引的创建与重建、数据的备份与恢复等操作都可以在分区表上进行,而不必在表级别上进行,提高了数据的可管理性;
  • 增强数据库的可用性。某个分区出现问题,只影响该分区,其它分区照常运作;
  • 改善查询性能。将对整个表的查询转化为对某个分区表的查询,提高了查询速度;
  • 提高数据库操作的并行性。可对分区表进行并行操作;
  • 透明性。将一张表分区后,对于用户而言是无感的,即用户不会感知到有多个分区表的存在,用户不需要对SQL语句做处理;

(三)什么时候需要分区

什么时候对表进行分区,我们可以从下面的条件进行考虑:

  • 表大于2G;
  • 对一个表并行进行DML操作;
  • 为了平衡硬盘I/O,需将同一个表分区到不同的表空间,必须对表进行分区;
  • 要将表的一部分设为只读状态,另一部分设为读写状态,需要对表进行分区;
  • 要将表一部分设为可用状态,另一部分设为不可用状态,需要队标进行分区;
  • 要将表中数据按照一定规则分散到不同的磁盘中去,需要对表进行分区;

(四)分区方法

oracle数据库提供了3种分区方法:范围分区(Range Partitioning)、列表分区(List Partitioning)和散列分区(Hash Partitioning),结合3种方法,又可以进行复合分区。

(1)范围分区(Range Partitioning)

范围分区是根据分区列值的范围对表进行分区,每条记录根据分区列值的范围分配到不同的分区表中。常用于按照日期分区的表。

(2)列表分区(List Partitioning)

如果分区列值的并不能划分范围(非数值或日期类型),但是分区列的值仅包含少数值,可采用分区列,将特定的值保存到分区中。例如,要统计整个省的人口信息,如果将全部信息放在一张表中,那么表将会非常臃肿,这时候我们可以考虑按照列表分区,将人口信息按照市分配到多个分区表中。

(3)散列分区(Hash Partitioning)

基于分区列的哈希算法,将数据均匀分不到指定的分区中,一个记录分配到哪个分区中是由Hash函数决定的。

(4)复合分区(Composite Partitioning)

复合分区是结合两种基本分区方法,先采用一种分区方法进行分区,然后再采用另一种方法进行分区。

(五)创建分区表

(1)创建范围分区表

CREATE TABLE table_name (...)
PARTITION BY RANGE(column1 [,column2,...])
(PARTITION partition1 VALUES LESS THAN(literal | MAXVALUE)[TABLESPACE tablespace]PARTITION partition2 VALUES LESS THAN(literal | MAXVALUE)[TABLESPACE tablespace][PARTITION partition3 VALUES LESS THAN(iteral | MAXVALUE)[TABLESPACE tablespace]]
)

参数说明:

PARTITION BY RANGE:采用范围分区;

column:分区列,可以是单列,也可以是多列;

PARTITION:分区设置;

VALUE LESS THAN:分区上限;

TABLESPACE:分区表存储的表空间

例子1:创建一个销售分区表,按照季度进行分区

create table sale_by_range
(prod_id number, cust_id number,time_id date,channel_id char(1),promo_id number(6),quantity_sold number(3),amount_sold number
)
partition by range(time_id)
(partition sales_q1_2012 values less than(to_date('1-4-2012','dd-mm-yyyy')) tablespace TBS1,partition sales_q2_2012 values less than(to_date('1-7-2012','dd-mm-yyyy')) tablespace TBS2,partition sales_q3_2012 values less than(to_date('1-10-2012','dd-mm-yyyy')) tablespace TBS3,partition sales_q4_2012 values less than(to_date('1-1-2013','dd-mm-yyyy')) tablespace TBS4
)

结果如下:

823295-20170303174823923-1898777582

插入数据,发现没有问题

insert into sale_by_range(prod_id,cust_id,time_id,quantity_sold)
values(2,12,to_date('2012-04-01','yyyy-mm-dd'),103);

结果如下:

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
         2         12 01-4月-12                                  103           

 

(2)创建列表分区表

通过使用带PARTITION BY LIST子句的CREATE TABLE来创建列表分区表:

CREATE TABLE table_name(...)
PARTITION BY LIST(column)
(PARTITION partition1 VALUES([literal|NULL]|[DEFAULT])TABLESPACE tablespace_name,[,PARTITION partition2 VALUES([literal|NULL]|[DEFAULT]),TABLESPACE tablespace_name...]
);

参数说明:

PARTITION BY LIST:采用列表分区;

DEFAULT:如果列值不符合其它分区记录的要求,保存在该分区表;

例子2:创建一个销售分区表,按照地区进行分区

--创建一个销售分区表,按照地区进行分区
create table sales_by_list
(dept number,deptname varchar(20),quarterly_sales number(10,2),province varchar(20)
)
partition by list(province)
(partition southeast values('guangdong','fujian') tablespace TBS1,                --广东、福建的存放在southeast分区表partition northeast values('heilongjiang','liaoning','jilin') tablespace TBS2,   --黑龙江、辽宁、吉林放在northeast分区表partition southwest values('sichuan','yunnan','guizhou') tablespace TBS3,        --四川、云南、贵州放在southwest分区表partition otherprovince values(default) tablespace TBS4                          --其他省的放在otherprivince分区表
)

插入数据:

--插入数据
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(1,'fa',2000,'sichuan');
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(2,'cim',4000,'guangdong');
insert into sales_by_list(dept,quarterly_sales,province) values(3,6000,'liaoning');
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(4,'cell',8000,'hunan');
insert into sales_by_list(dept,deptname) values(5,'model')

查看数据:

SQL> select * from sales_by_list;DEPT DEPTNAME             QUARTERLY_SALES PROVINCE
---------- -------------------- --------------- --------------------2 cim                             4000 guangdong3                                 6000 liaoning1 fa                              2000 sichuan4 cell                            8000 hunan5 model

(3)创建散列分区表

通过创建PARTITION BY HASH子句的CREATE TABLE语句创建散列分区表:

CREATE TABLE table_name(...)
PARTITION BY HASH(column1[,column2,...])
[([PARTITION partition [TABLESPACE tablespace] [,...])]  --设置分区表名称及对应表空间
|
[PARTITION hash_parttition_quantity STORE IN([tablespace1[,...])]  --设置分区数量及存储表空间
]

说明:

HASH分区有2种方式来决定分区的数量,一种是通过设置分区表的名称来决定分区的数量,一种是直接设置分区的数量。

例子3:通过直接设置分区的数量来创建HASH分区表

--创建一个HASH分区表
create table dept_by_hash
(dept number,deptname varchar(20),quarterly_sales number(20),province varchar(20)
)
partition by hash(dept)
partitions 4 store in(TBS1,TBS2,TBS3,TBS4);  --需要注意的是,创建分区时不需要小括号

数据的插入与上面2种方法一样,这里不做讨论。

(4)创建复合分区表

Oracle 11g支持的6种复合分区方法:

  • Range-Range
  • Range-List
  • Range-Hash
  • List-Range
  • List-List
  • List-Hash

为什么不以Hash开头?通过Hash分区的方式可知,Hash分区是将数据均匀的分配到其分区表中,它不关心数据内容,所以,先以Hash分,然后再用其它方式,显然没有意义。

创建符合分区时,首先在CREATE TABLE语句中使用PARTITION BY [RANGE|LIST]子句确定分区方法、分区列,然后再使用SUBPARTITION BY [RANGE|LIST|HASH]子句指定分区的分区方法、分区列、分区数量等信息。

例子4.创建一个分区列表,将2012年的销售记录先按季度进行范围分区,再按区域进行列表分区

--创建一个分区列表,将2012年的销售记录先按季度进行范围分区,再按区域进行列表分区
create table sales_by_range_list
(dept number,deptname varchar(20),time_id date,quarterly_sales number(10,2),province varchar(20)
)
partition by range(time_id)
subpartition by list(province)
(partition sales_q1_2012 values less than(to_date('1-4-2012','dd-mm-yyyy'))  tablespace TBS1    --第一季度销售情况(SUBPARTITION sales_q1_2012_southeast VALUES ('guangdong', 'fujian'),                               --广东、福建的存放在southeast分区表SUBPARTITION sales_q1_2012_northeast VALUES ('heilongjiang', 'liaoning', 'jilin'),                --黑龙江、辽宁、吉林放在northeast分区表SUBPARTITION sales_q1_2012_southwest VALUES ('sichuan', 'yunnan', 'guizhou'),                     --四川、云南、贵州放在southwest分区表SUBPARTITION sales_q1_2012_otherprovince VALUES ( DEFAULT )                                         --其他省的放在otherprivince分区表),partition sales_q2_2012 values less than(to_date('1-7-2012','dd-mm-yyyy'))                      --第二季度销售情况(subpartition sales_q2_2012_southeast values('guangdong','fujian'),subpartition sales_q2_2012_northeast values('heilongjiang','liaoning','jilin'),subpartition sales_q2_2012_southwest values('sichuan','yunnan','guizhou'),subpartition sales_q2_2012_otherprovince values(default)),partition sales_q3_2012 values less than(to_date('1-10-2012','dd-mm-yyyy'))                    --第三季度销售情况(subpartition sales_q3_2012_southeast values('guangdong','fujian'),subpartition sales_q3_2012_northeast values('heilongjiang','liaoning','jilin'),subpartition sales_q3_2012_southwest values('sichuan','yunnan','guizhou'),subpartition sales_q3_2012_otherprovince values(default)),partition sales_q4_2012 values less than(MAXVALUE)                                               --第四季度销售情况(subpartition sales_q4_2012_southeast values('guangdong','fujian'),subpartition sales_q4_2012_northeast values('heilongjiang','liaoning','jilin'),subpartition sales_q4_2012_southwest values('sichuan','yunnan','guizhou'),subpartition sales_q4_2012_otherprovince values(default))
)

 向表中插入数据,

--向表中插入数据
insert into sales_by_range_list values(1,'a1',to_date('2012-1-2','yyyy-mm-dd'),1000,'guangdong');  --模拟一季度四个地区的数据
insert into sales_by_range_list values(2,'a1',to_date('2012-2-6','yyyy-mm-dd'),1000,'heilongjiang');
insert into sales_by_range_list values(3,'a1',to_date('2012-2-28','yyyy-mm-dd'),1000,'guizhou');
insert into sales_by_range_list values(4,'a1',to_date('2012-3-4','yyyy-mm-dd'),1000,'gansu');
insert into sales_by_range_list values(5,'a1',to_date('2012-4-6','yyyy-mm-dd'),1000,'fujian');  --模拟二季度四个地区的数据
insert into sales_by_range_list values(6,'a1',to_date('2012-5-6','yyyy-mm-dd'),1000,'jilin');
insert into sales_by_range_list values(7,'a1',to_date('2012-5-28','yyyy-mm-dd'),1000,'yunnan');
insert into sales_by_range_list values(8,'a1',to_date('2012-6-6','yyyy-mm-dd'),1000,'xizang');
insert into sales_by_range_list values(9,'a1',to_date('2012-7-6','yyyy-mm-dd'),1000,'guangdong');  --模拟三季度四个地区的数据
insert into sales_by_range_list values(10,'a1',to_date('2012-8-6','yyyy-mm-dd'),1000,'heilongjiang');
insert into sales_by_range_list values(11,'a1',to_date('2012-9-6','yyyy-mm-dd'),1000,'guizhou');
insert into sales_by_range_list values(12,'a1',to_date('2012-9-25','yyyy-mm-dd'),1000,'gansu');
insert into sales_by_range_list values(13,'a1',to_date('2012-10-6','yyyy-mm-dd'),1000,'fujian');  --模拟四季度四个地区的数据
insert into sales_by_range_list values(14,'a1',to_date('2012-11-6','yyyy-mm-dd'),1000,'jilin');
insert into sales_by_range_list values(15,'a1',to_date('2012-12-6','yyyy-mm-dd'),1000,'yunnan');
insert into sales_by_range_list values(16,'a1',to_date('2012-12-26','yyyy-mm-dd'),1000,'xizang');

可以看到结果:

sales_by_range_list

(六)查看分区表

(1)查看分区表信息

可以通过DBA_PART_TABLES、ALL_PART_TABLES、USER_PART_TABLES来查看分区表信息,具体用法如下:

  • DBA_PART_TABLES:查看数据库里面的全部分区表信息,需要具有DBA权限,否则会报“ora-00942: 表或视图不存在”错误;
  • ALL_PART_TABLES:查看当前用户可见的全部分区表信息;
  • USER_PART_TABLES:查看当前用户拥有的全部分区表信息;

例子5:查看当前用户拥有的的全部分区表信息

select * from user_part_tables;

user_part_table

重要参数说明:

TABLE_NAME:分区表名称;

PARTITION_TYPE:分区类型;

SUBPARTITION_TYPE:子分区类型;

PARTITION_COUNT:分区数量;

SUBPARTITION_KEY_COUNT:子分区用于分区的列的数量。

通过上面的查询,我们可以得到:分区表名称、分区数量、子分区数量等信息,但是并没有得到分区/子分区的名称,以及分区/子分区是如何定义等信息,接下来可以使用USER_TAB_PARTITION和USER_TAB_SUBPARTITION查看分区表/子分区表信息:

--查询分区表信息
SELECT * FROM USER_TAB_PARTITIONS;

user_tab_partition

--查询子分区表信息
SELECT * FROM USER_TAB_SUBPARTITIONS;

user_tab_subpartition

 

(2)查看分区表数据

在向分区表插入数据时,我们最关心的就是数据是否按照我们的规划进入了各个分区表,这时,就需要我们查看分区表的数据,那么,怎么查看分区表的数据,通过sql语句:

SELECT * FROM table_name PARTITION(partition_table_name)

例子6.查看SALES_BY_LIST_RANGE分区表第一季度的信息

select * from SALES_BY_RANGE_LIST partition(sales_q1_2012);

得到结果:

partition table

(七)维护分区表

 (1)添加分区

ALTER TABLE table_name ADD PARTITION ...        --添加分区ALTER TABLE table_name MODIFY PARTITION partition ADD SUBPARTITION ...    --为分区添加子分区

(2)删除分区

ALTER TABLE table_name DROP PARTITION partition;        --删除分区ALTER TABLE table_name DROP SUBPARTITION subpartition;    --删除子分区

(3)其他

此外,还有联合分区、交换分区、合并分区等操作,不一一介绍。

(八)与分区相关的数据字典

数据字典说明
xxx_PART_TABLES包含分区表的分区信息
xxx_TAB_PARTITIONS包含分区层次、分区存储、分区统计等信息
xxx_TAB_SUBPARTITIONS包含子分区层次、分区存储、分区统计等信息
xxx_PART_KEY_COLUMNS包含分区表的分区列信息
xxx_SUBPART_KEY_COLUMNS包含子分区表的分区列信息
xxx_COL_STATISTICS包含分区表的分区列的统计信息和柱状图信息
xxx:代表DBA、ALL、USER 

 

对分区表有了一定的了解,接下来学习分区索引。

转载于:https://www.cnblogs.com/lijiaman/p/6495465.html

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

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

相关文章

Matcher类的简单使用

今天工作时遇到一个问题&#xff0c; 用正则处理html标签时不知该如何下手。还好有Matcher帮助解决了问题。需求如下&#xff1a;例如有如下html文章内容&#xff1a;<p><a href"www.baidu.com">百度的链接</a>; 这是一个百度的链接。 <a href&…

USB 摄像头成熟方案介绍

UVC&#xff0c;全称为&#xff1a;USB video class 或USB video device class。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义 的协议标准&#xff0c;目前已成为USB org标准之一。 如今的主流操作系统(如Windows XP SP2 and later, Linux 2.4.6 and later…

JS练习:商品的左右选择

代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>商品的左右选择</title><!--步骤分析1. 确定事件: 点击事件 :onclick事件2. 事件要触发函数 selectOne3. selectOne要做一些操作(将左边选中的元…

Python 购物车

购物车需求&#xff1a; 可购买的商品信息显示 显示购物车内的商品信息、数量 购物车内的商品数量进行增加、减少 用户余额的充值 用户购买完成进行结账&#xff0c;将最终余额回写到用户文件中   流程图&#xff1a; 代码&#xff1a; 1、主文件 def login():# 验证用户帐号…

认对画对MOS管

MOS管我们在设计电路中经常用的一种无源器件。 首先介绍下&#xff0c;在原理图和PCB以及实物PCBA中如何辨别各种MOS管&#xff0c;作为应用好的先决条件&#xff0c;必须认对画对管子。 1. MOS管的GSD三极在原理图和PCB上怎么判定&#xff1a; G极(gate)—栅极&#xff0c;原…

Jmeter之BeanShell

在Jmeter中各种分类组件中都有相应的BeanShell组件&#xff0c;这里简单的说明一下Beanshell的使用。 一、概念 BeanShell是一种符合Java语法的脚本语言&#xff0c;也有自己的一些特定语法 二、内置变量 Jmeter在它的Beanshell中内置了变量&#xff0c;用户可以通过这些变量与…

HDU 1875 畅通工程再续

传送门&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1875 简单的最小生成树 #include <iostream> #include <cstdio> #include <cmath> using namespace std;const int maxn100005; const double INF1.0e20;struct Node{double x,y; } isl[maxn];…

C语言变长数组 struct中char data[0]的用法

摘要&#xff1a;在实际的编程中&#xff0c;我们经常需要使用变长数组&#xff0c;但是C语言并不支持变长的数组。此时&#xff0c;我们可以使用结构体的方法实现C语言变长数组。 struct MyData {int nLen;char data[0];}; 在结构中&#xff0c;data是一个数组名&#xff1b;但…

MOS管的实际应用

继上一篇“认对画对MOS管”后&#xff0c;现在小结一下MOS管的具体应用&#xff1a; 应用MOS管前&#xff0c;理解MOS管每个参数的具体意义后&#xff0c;再额外注意一下管子本身的体二极管&#xff0c;本身Vf1.6V&#xff0c;导通后管子本身阻抗一般是mΩ级&#xff1b;管子厂…

Spring - Spring Boot Spring Cloud

Spring -> Spring Boot > Spring Cloud 这几天刚刚上班&#xff0c;公司用的是Spring Cloud&#xff0c;接触不多。我得赶快学起来。 想学习就必须得知道什么是微服务&#xff0c;什么是Spring Boot&#xff0c;什么是Spring Cloud&#xff0c;以及两者之间有什么关系&am…

JAVA中循环删除list中元素的方法总结

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。 JAVA中循环遍历…

直流有刷电机与无刷电机的区别

首先介绍有刷电机与无刷电机工作原理&#xff0c;最后从调速方式及性能差异这两个方面详细的阐述了有刷电机与无刷电机的区别。 有刷电机与无刷电机工作原理 1、有刷电机 电机工作时&#xff0c;线圈和换向器旋转&#xff0c;磁钢和碳刷不转&#xff0c;线圈电流方向的交替变化…

MapReduce详解

MapReduce简介 MapReduce是一种编程模型&#xff0c;用于大规模数据集&#xff08;大于1TB&#xff09;的并行运算。概念"Map&#xff08;映射&#xff09;"和"Reduce&#xff08;归约&#xff09;"&#xff0c;是它们的主要思想。 MapReduce极大地方便了编…

运放的主要参数详细介绍

1. 引言 运放的作用是调节和放大模拟信号&#xff0c;它是用途十分广泛的器件&#xff0c;接入适当的反馈网络&#xff0c;可用作精密的交流和直流放大器、有源滤波器滤波器、振荡器振荡器及电压比较器。其应用领域包括但不限制通讯、电子、汽车、工业检测等等&#xff0c;并将…

MOS管的主要参数与重要特性

双极性晶体管&#xff1a;NPN和PNP管&#xff1b; 单极性晶体管&#xff1a;场效应管&#xff08;MOSFET和JFET&#xff09;&#xff1b; MOS管相对三极管具有速度快、输入阻抗高、噪声低、动态范围大、功耗小、容易集成等优点。 下面总结下其主要参数与重要特性&#xff0c…

垂直居中方法总结

<style>#box{position: absolute;margin: auto;top:0px;right: 0px;bottom: 0px;left: 0px;width: 100%;height: 30%;background-color: red;text-align: center;} </style> <body><div id"box"><h1>文字居中</h1></div> …

NAND 坏块管理

NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH为例&#xff0c;一片Nand flash为一个设备(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 数据块大小(512Bytes) OOB 块大小(16Bytes&…

运放的典型电路举例与计算仿真

运放电路的计算&#xff0c;通过记各种公式很难记住&#xff0c;但是掌握其两个重要概念&#xff0c;所有计算均可迎刃而解。 那就是运放的两个重要特性&#xff1a; 虚断&#xff1a;运放本质特性&#xff0c;输入阻抗大&#xff0c;两个输入端视为等效开路&#xff1b; 虚…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019独角兽企业重金招聘Python工程师标准>>> 对于不同的计算机体系结构&#xff0c;设备可能是端口映射&#xff0c;也可能是内存映射的。如果系统结构支持独立的IO地址空间&#xff0c;并且是端口映射&#xff0c;就必须使用汇编语言完成实际对设备的控制&#xff…

三极管基本参数介绍与放大电路分析

全称为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导器件&#xff0c;作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。 两个PN结的排列方式有两种&#xff1a;PNP和NPN。 三个端点依序称为射极&#…