本文详细说明了Oracle表的分区方法,并通过示例代码详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
目录
一、表空间和分区表空间的概念:分区表空间:二。表空间分区的具体作用何时使用分区的表空间:三。表空间分区的优缺点:IV。表空间分区的类型和操作方法1。范围划分:2。列表分区:3。哈希分区:4。复合(范围列表)分区5。添加分区2、删除分区3、截断分区4、合并分区5、拆分分区6、连接分区7、重命名表分区8以及相关查询。
一、 表空间及分区表的概念
表空间:
它是一个或多个数据文件的集合。所有的数据对象都存储在一个指定的表空间中,但主要的是表,所以称之为表空间。
分区表:
当表中的数据量不断增加时,数据查询的速度会变慢,应用程序的性能会下降。这时候就要考虑对表进行分区了。表分区后,表在逻辑上仍然是一个完整的表,只是表中的数据物理上存储在多个表空间(物理文件)中,这样在查询数据时,就不会每次都扫描整个表。
二、表分区的具体作用
Oracle的表分区功能通过提高可管理性、性能和可用性,为各种应用程序带来了巨大的好处。通常,分区可以大大提高某些查询和维护操作的性能。此外,分区可以大大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区函数可以将表、索引或索引组织表进一步细分为段,这些数据库对象的段称为分区。每个分区都有自己的名称,您也可以选择自己的存储特征。从数据库管理员的角度来看,一个分区对象有多个段,可以集中管理,也可以单独管理,这使得数据库管理员在管理分区对象时有相当大的灵活性。但是,从应用程序的角度来看,分区表和非分区表是完全一样的。用SQL DML命令访问分区表时,不需要做任何修改。
什么时候使用分区表:
1.该表的大小超过2GB。
2.该表包含历史数据,新数据被添加到所有新分区中。
三、表分区的优缺点
优点:
提高查询性能:对于分区对象的查询,可以只搜索自己关心的分区,从而提高检索速度。可用性增强:如果表的一个分区失效,表在其他分区的数据仍然可用;维护方便:如果表的一个分区出现故障,需要修复数据,只需修复该分区即可;平衡的I/O:您可以将不同的分区映射到磁盘,以平衡I/O并提高整个系统的性能。
缺点:
分区表关联:没有办法直接将现有的表转换成分区表。但是,Oracle提供了在线重定义表的能力。
四、表分区的几种类型及操作方法
1、范围分区:
Range根据范围将数据映射到每个分区,范围由创建分区时指定的分区键确定。这种分区方法是最常用的,分区键经常采用日期。例如,您可以按月对销售数据进行分区。
使用范围分区时,请考虑以下规则:
每个分区都必须有一个VALUES LESS THEN子句,该子句指定不包括在分区中的上限值。键值等于或大于该上限值的任何记录都将被添加到下一个更高的分区中。除了第一个分区,所有分区都会有一个隐式的下限,也就是这个分区的上一个分区的上限。在最高的分区中,定义了MAXVALUE。MAXVALUE表示一个不确定的值。该值高于其他分区中任何分区键的值,或者可以理解为高于任何分区中指定的小于的值,包括空值。
示例1:
假设有一个顾客表,表中有数据200000行,我们将此表通过客户标识进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:
创建表客户
(
客户标识号不是空主键,
名字VARCHAR2(30)不为空,
姓氏VARCHAR2(30)不为空,
电话VARCHAR2(15)不为空,
电子邮件VARCHAR2(80),
状态字符(1)
)
按范围划分(客户标识)
(
分区CUS _第一部分值小于(100000)表空间CUS_TS01,
分区CUS _第2部分的值小于(200000)表空间CUS_TS02
)
例二:按时间划分
创建订单_活动表
(
订单ID号(7)不为空,
订单日期日期,
总计_金额数字,
客户标识号(7),
付费字符(1)
)
按范围分区(订单日期)
(
分区订单_行动_零件01值小于(截止日期(' 2003年5月1日','年月日'),
分区订单_行动_零件02值小于(截止日期(' 2003年6月1日','年月日'),
分区订单_行动_零件02值小于(截止日期(' 2003年7月1日','年月日')表空间订单_TS03
)
例三:最大值
创建表格范围表格
(
国际直拨电话号码主键,
iNAME VARCHAR(10),
等级积分
)
按范围(等级)划分
(
分区第一部分值小于(1000)表空间Part1_tb,
分区第二部分值小于(最大值)表空间第二部分_tb
);
2、列表分区:
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
例一
创建表问题_票证
(
问题标识号(7)非空主键,
描述VARCHAR2(2000年年),
客户标识号(7)不为空,
日期_输入的日期不为空,
状态变量2(20)
)
按列表分区(状态)
(
分区PROB_ACTIVE值(“主动”)表空间PROB_TS01,
分区PROB_INACTIVE值(“不活动”)表空间PROB_TS02
);
例二
创建表格列表表格
(
id INT主键,
名称VARCHAR (20),
area VARCHAR (10)
)
按列表分区(区域)
(
分区第一部分值('广东','北京)表空间Part1_tb,
分区第二部分值('上海','南京)表空间第二部分_tb
);
3、散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在输入-输出设备上进行散列分区,使得这些分区大小一致。
例一:
创建表哈希_表
(
列号(8),
INF VARCHAR2(100)
)
哈希分区(列)
(
分区第一部分表空间HASH_TS01,
分区第二部分表空间HASH_TS02,
分区第三部分表空间哈希_TS03
)
简写:
创建表电磁脉冲
(
empno编号(4),
ename VARCHAR2 (30),
盐数
)
散列分区(empno)分区8
存储在(emp1,emp2,emp3,emp4,emp5,emp6,emp7,EMP 8);
混杂分区最主要的机制是根据混杂算法来计算具体某条纪录应该插入到哪个分区中,哈希算法中最重要的是混杂函数,甲骨文中如果你要使用混杂分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
4、复合(范围列表)分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
创建表格销售
(
PRODUCT_ID VARCHAR2(5),
销售日期日期,
销售_成本编号(10)、
状态变量2(20)
)
按范围分区(销售日期)按列表子分区(状态)
(
分区第一亲代值小于(截止日期(' 2003年1月1日','年-月-日'))表空间rptfact2009
(
子分区P1SUB1值(' ACTIVE ')表空间rptfact2009,
子分区P1SUB2值(“非活动”)表空间rptfact2009
),
分区P2值小于(TO_DATE('2003-03-01 ',' YYYY-MM-DD '))表空间rptfact2009
(
子分区P2SUB1值(' ACTIVE ')表空间rptfact2009,
子分区P2SUB2值(“非活动”)表空间rptfact2009
)
)
5、复合(范围散列)分区:
这种划分基于范围划分和哈希划分。表先按某一列分区,再按某一列分区。
创建表dinya_test
(
transaction_id号主键,
item_id号(8)不为空,
item_description varchar2(300),
交易日期日期
)
按范围划分(事务日期)子分区按哈希划分(事务id)子分区3存储在(dinya_space01、dinya_space02、dinya_space03)中
(
分区part_01值小于(to_date('2006-01-01 ',' yyyy-mm-dd '),
partition part_02值小于(to_date('2010-01-01 ',' yyyy-mm-dd '),
part_03分区值小于(maxvalue)
);
五、有关表分区的一些维护性操作:
1、添加分区
下面的代码将P3分区添加到SALES表中。
ALTER TABLE SALES ADD PARTITION P3值小于(TO_DATE('2003-06-01 ',' YYYY-MM-DD ');
注意:上面添加的分区边界应该高于最后一个分区边界。
以下代码将一个P3SUB1子分区添加到SALES表的P3分区中。
ALTER TABLE SALES MODIFY PARTITION P3 ADD子分区P3SUB1值(' COMPLETE ');
2、删除分区
以下代码删除P3表分区:
更改表销售删除分区P3;
在以下代码中删除了P4SUB1子分区:
ALTER TABLE SALES DROP子分区P4SUB1
注意:如果被删除的分区是表中唯一的分区,则不能将其删除。要删除该分区,必须删除该表。
3、截断分区
截断分区意味着删除分区中的数据,但它不会删除该分区,也不会删除其他分区中的数据。即使表中只有一个分区,也可以被截断。通过以下代码截断分区:
ALTER TABLE SALES截断分区P2;
使用以下代码截断子分区:
ALTER表SALES TRUNCATE子分区P2SUB2
4、合并分区
合并分区是指将相邻的分区合并成一个分区。因此,分区将采用更高分区的边界。值得注意的是,分区不能合并到更低边界的分区中。以下代码实现了P1 P2分区的合并:
将P2的P1分区并入P2分区;
5、拆分分区
Partition将一个分区拆分成两个新分区,拆分后原分区不再存在。请注意,哈希类型的分区不能拆分。
将表SALES SBLIT分区P2 AT(TO_DATE('2003-02-01 ',' YYYY-MM-DD ')更改为(分区P21,分区P22);
6、接合分区(coalesca)
分区是将散列分区中的数据连接到其他分区。当散列分区中的数据很大时,可以添加散列分区,然后进行联接。值得注意的是,join分区只能在hash分区中使用。通过以下代码联接分区:
更改表SALES COALESCA分区;
7、重命名表分区
以下代码将P21更改为P2。
将分区P21重命名为P2;
8、相关查询
跨分区查询
select sum( *) from
(从t_table_SS分区(P200709_1)中选择count(*) cn
联合所有
从t_table_SS分区(P200709_2)中选择count(*) cn
);
查询表上有多少个分区?
SELECT * FROM useR_TAB_PARTITIONS,其中TABLE_NAME='tableName '
查询索引信息
select对象名称,对象类型,表空间名称,sum(值)
来自v$segment_statistics
其中statistic_name IN('物理读取','物理写入','逻辑读取'),object_type='INDEX '
按对象名、对象类型、表空间名分组
由4 desc订购
其他查询
-显示数据库所有分区表的信息:
select * from DBA_PART_TABLES
-显示当前用户可访问的所有分区表信息:
从所有零件表中选择*
-显示当前用户的所有分区表信息:
从用户零件表中选择*
-display table partition information显示数据库所有分区表的详细分区信息:
select * from DBA_TAB_PARTITIONS
-显示当前用户可访问的所有分区表的详细分区信息:
select *从所有分区中选择
-显示当前用户的所有分区表的详细分区信息:
select * from USER_TAB_PARTITIONS
-显示子分区信息显示数据库所有组合分区表的子分区信息:
select * from DBA _ TAB _ sub partitions
-显示当前用户可访问的所有组合分区表的子分区信息:
select * from ALL _ TAB _ sub partitions
-显示当前用户的所有组合分区表的子分区信息:
select * from USER _ TAB _ SUBPARTITIONS
-Display Partition Column显示数据库中所有分区表的分区列信息:
select * from DBA _ PART _ KEY _ COLUMNS
-显示当前用户可访问的所有分区表的分区列信息:
select * from ALL _ PART _ KEY _ COLUMNS
-显示当前用户的所有分区表的分区列信息:
select * from USER _ PART _ KEY _列
-Display子分区列显示数据库中所有分区表的子分区列信息:
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截断分区P5;
这就是本文关于Oracle表分区的内容。希望对大家的学习有帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。