Oracle
发布时间:2022-05-17 发布网站:大佬教程 code.js-code.com
大佬教程 收集整理的这篇文章主要介绍了oracle表分区详解 ,大佬教程 大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
从以下几个方面来整理关于分区表的概念及操作:
表空间及分区表的概念
表分区的具体作用
表分区的优缺点
表分区的几种类型及操作方法
对表分区的维护性操作
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 ) NulL ,LAST_name 15 ) 80 ),STATUS CHAR (1 )
)
PARTITION BY RANGE (CUSTOMER_ID)
(
PARTITION CUS_PART1 VALUES LESS THAN (100000 ) tableSPACE CUS_TS01,PARTITION CUS_PART2 200000 ) tableSPACE CUS_TS02
)
例2:按时间划分
table
ORDER_ACTIVITIES
(
ORDER_ID NUMBER (
7 )
NUMBER ,CUSTOTMER_ID 7 ),PAID 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 01-JUN-2003 ' )) tableSPACE ORD_TS02,0); line-height:1.5!important">01-Jul-2003 ' )) tableSPACE ORD_TS03
)
例3:MAXVALUE
table
Rangetable
(
IDd INT VARCHAR (
10 ),grade INT
)
PARTITION BY RANGE (grade)
(
PARTITION part1 VALUES LESS
THEN (
1000 ) tableSPACE Part1_tb,PARTITION part2 THEN (MAXVALUE) tableSPACE Part2_tb
);
2.列表分区:
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
例1
table
PROBLEM_TICKETS
(
PROBLEM_ID 2000 ),CUSTOMER_ID 20 )
)
PARTITION BY List (STATUS)
(
PARTITION PROB_ACTIVE VALUES (
ACTIVE ' ) tableSPACE PROB_TS01,PARTITION PROB_INACTIVE INACTIVE ' ) tableSPACE PROB_TS02
例2
CREATE
table Listtable
(
ID INT PRIMARY VARCHAR (
20 ),area 10 )
)
PARTITION BY List (area)
(
PARTITION part1 guangdong beijing ' ) tableSPACE Part1_tb,0); line-height:1.5!important">shanghai nanjing ' ) tableSPACE Part2_tb
);
)
3.散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
例1:
table
HASH_table
(
Col 8 ),INF 100 )
)
PARTITION BY HASH (Col)
(
PARTITION PART01 tableSPACE HASH_TS01,PARTITION PART02 tableSPACE HASH_TS02,PARTITION PART03 tableSPACE HASH_TS03
)
简写:
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.组合范围散列分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
table
SALES
(
PRODUCT_ID 5 ),SALES_DATE DATE,SALES_COST 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 ' ) tableSPACE rptfact2009,SUBPARTITION P1SUB2 ' ) tableSPACE rptfact2009
),PARTITION P2 2003-03-01 ' )) tableSPACE rptfact2009
(
SUBPARTITION P2SUB1 ' ) 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 2010 values less than(maxvalue)
);
5.有关表分区的一些维护性操作
1) 添加分区
以下代码给SALES表添加了一个P3分区
ALTER table SALES ADD PARTITION P3 2003-06-01 ' ));
注意:以上添加的分区界限应该高于最后一个分区界限。
以下代码给SALES表的P3分区添加了一个P3SUB1子分区
table
SALES MODIFY PARTITION P3
ADD SUBPARTITION P3SUB1
VALUES (
COMPLETE ' );
2) 删除分区
以下代码删除了P3表分区:
DROP PARTITION P3;
在以下代码删除了P4SUB1子分区:
DROP SUBPARTITION P4SUB1;
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。
3) 截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
TruncATE PARTITION P2;
通过以下代码截断子分区:
TruncATE SUBPARTITION P2SUB2;
4) 合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:
table SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
5) 拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。
table SALES SBliT PARTITION P2 AT(TO_DATE(2003-02-01 ' )) INTO (PARTITION P21,PARTITION P22);
6) 接合分区(coalesca)
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:
table SALES COALESCA PARTITION;
7) 重命名表分区
以下代码将P21更改为P2
table SALES REname PARTITION P21 TO P2;
8) 相关查询
跨分区查询
select
sum (
* )
from
( count (
* ) cn
from t_table_SS PARTITION (P200709_1)
union all
from t_table_SS PARTITION (P200709_2)
);
查询表上有多少分区
SELECT
* FROM useR_TAB_PARTITIONS
WHERE table_name
= tablename '
查询索引信息
object_name,object_type,tablespace_name,255); line-height:1.5!important">sum
(value)
from v$segment_statistics
where statistic_name
IN (
physical reads physical write logical reads ' )
and object_type
INDEX '
group by object_name ,tablespace_name
order by 4 desc
--显示数据库所有分区表的信息:
select
from DBA_PART_tableS
--显示当前用户可访问的所有分区表信息:
from ALL_PART_tableS
--显示当前用户所有分区表的信息:
from USER_PART_tableS
--显示表分区信息 显示数据库所有分区表的详细分区信息:
from DBA_TAB_PARTITIONS
--显示当前用户可访问的所有分区表的详细分区信息:
from ALL_TAB_PARTITIONS
--显示当前用户所有分区表的详细分区信息:
from USER_TAB_PARTITIONS
--显示子分区信息 显示数据库所有组合分区表的子分区信息:
from DBA_TAB_SUBPARTITIONS
--显示当前用户可访问的所有组合分区表的子分区信息:
from ALL_TAB_SUBPARTITIONS
--显示当前用户所有组合分区表的子分区信息:
from USER_TAB_SUBPARTITIONS
--显示分区列 显示数据库所有分区表的分区列信息:
from DBA_PART_KEY_ColUMNS
--显示当前用户可访问的所有分区表的分区列信息:
from ALL_PART_KEY_ColUMNS
--显示当前用户所有分区表的分区列信息:
from USER_PART_KEY_ColUMNS
--显示子分区列 显示数据库所有分区表的子分区列信息:
from DBA_SUBPART_KEY_ColUMNS
--显示当前用户可访问的所有分区表的子分区列信息:
from ALL_SUBPART_KEY_ColUMNS
--显示当前用户所有分区表的子分区列信息:
from USER_SUBPART_KEY_ColUMNS
--怎样查询出oracle数据库中所有的的分区表
from user_tables a where a.partitionedYES '
--删除一个表的数据是
truncate table table_name;
--删除分区表一个分区的数据是
alter table table_name truncate partition p5;
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
编程之家官方1群(满)
编程之家官方2群(满)
编程之家官方3群(满)
编程之家官方4群
编程之家官方5群(新)
上一篇:oracle数据库中为已经存在表的主键下一篇:Oracle 中的 TO_DATE 和 TO_CHAR 函
Oracle相关文章
Oracle递归查询
SQL: select * from PT_ORG_INFO START WITH id='102' CONNECT BY PRIOR id=par_id 连表递归查询SQL: sel
DG:重启之后主备数据重新同步
问题描述:本来配置好的DG第二天重启之后,发现主备库数据不能同步,在主库上执行日志切换以及创建表操作都传不到备库上,造成这种错误的原因是主库实例断掉后造成备库日志与主库无法实时接收 主库:orcl 备
delete误删数据使用SCN恢复
参考51CTO博客 问题描述:使用scn号恢复误删数据 1.查询系统闪回的scn值以及当前日志的scn值,因为我这个是测试,创建的表是在在后边,所以scn值要大于下边这两个scn值,所以对我恢复数据没
ORA-00845 startup启动不起来关于磁盘空间扩充
问题描述:今天在虚拟机下进行startup的操作,但是没有起来,系统报错:ORA-00845: MEMORY_TARGET not supported on this system 1.startup
oracle实例状态
oracle数据库实例启动过程分三个步骤,分别是启动实例,加载数据库,打开数据。 1.NOMOUNT模式:这种模式只会创建实例,不会打开任何的数据文件,用户要以sysdba的身份登录,才具有关闭和启动
startup启动不起来关于监听的问题
问题描述:要在sqlplus中启动到startup状态,但是提示我没有监听,本来以为启动一下就可以,但是connecting to一直卡半天,stop都停止不了 1.发现监听有问题,前去更改 SQL&
DG:switchover切换操作
问题描述:我们配置DG的目的就是为了在主库出现故障时,备库能够提供服务,保证业务的正常运行,switchover是用户有计划的进行停机切换,能够保证不丢失数据,我记录一下我进行switchover中的
编程分类
MySQLMsSQLOracleSqlitePostgre SQLMariadbMongoDBNoSQLHBaseJDBCmycat
热门文章
• Oracle导入导出命令 • Oracle递归查询 • Oracle创建用户、表空间并设置 • DG:重启之后主备数据重新同步 • delete误删数据使用SCN恢复 • oracle逻辑存储结构 • ORA-00845 startup启动不起来关 • oracle实例状态 • 基于SCN增量恢复DG同步 • startup启动不起来关于监听的问 • DG:switchover切换操作 • RHEL5.6静默安装oracle11.2.0数
最新文章
• Oracle导入导出命令 • Oracle递归查询 • Oracle创建用户、表空间并设置 • DG:重启之后主备数据重新同步 • delete误删数据使用SCN恢复 • oracle逻辑存储结构 • ORA-00845 startup启动不起来关 • oracle实例状态 • 基于SCN增量恢复DG同步 • startup启动不起来关于监听的问
热门标签
python-3.xpandasswiftarraysspring-boosql-serverrubydataframeamazon-webfirebasegoalgorithmazuredelphiVBAregexPowerShellasp.net-coelasticseaspring-mvcruby-on-ramultithrealoopsgoogle-clovisual-stutomcatperformancapache-spaasp.net-mvTSQLgoogle-clounity3d.net-corevb.netfor-loopmavenmachine-leauthenticaherokuscaladjango-modpysparklinqobjective-if-statemesshasynchronodplyrwinformssecurityjpaentity-frauser-intergraphqlfirebase-roptimizatidebuggingdjango-vievariablesgoogle-bigmatlabparsingamazon-ec2xamarinnetworkingsql-serverrecursionintellij-iintegercmakeentity-fraimage-procfirebase-asqlalchemydata-strucindexingspring-datautomationplsqlnlp
大佬总结
以上是大佬教程 为你收集整理的oracle表分区详解 全部内容,希望文章能够帮你解决oracle表分区详解 所遇到的程序开发问题。
如果觉得大佬教程 网站内容还不错,欢迎将大佬教程 推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。 如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。