- 浏览: 70717 次
- 性别:
- 来自: 杭州
文章分类
最新评论
Oracle splitting partitions简单小结[转]
- 博客分类:
- Oracle SQL Tunning
- Oracle
http://www.oracleonlinux.cn/2012/09/oracle-splitting-partitions/
本文简单记录在Oracle 10g数据库上对范围分区表的Splitting Partitions测试过程和结论,并不涉及到Oracle数据库中分区技术的详细描述。
1 测试环境及平台:
OS:
1 |
[root@localhost ~] # uname -rm
|
2 |
2.6.18-164.el5 x86_64 |
3 |
[root@localhost ~] # |
Oracle:
01 |
SQL> select * from v$version;
|
02 |
|
03 |
BANNER |
04 |
---------------------------------------------------------------- |
05 |
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
|
06 |
PL/SQL Release 10.2.0.5.0 - Production |
07 |
CORE 10.2.0.5.0 Production |
08 |
TNS for Linux: Version 10.2.0.5.0 - Production
|
09 |
NLSRTL Version 10.2.0.5.0 - Production |
10 |
|
11 |
SQL> |
2 创建范围分区表:
01 |
SQL> show user ;
|
02 |
USER is "SYS" |
03 |
SQL> create table part_range(id number, name varchar2(30))
|
04 |
2 partition by range(id)
|
05 |
3 (partition partmax values less than (maxvalue))
|
06 |
4 tablespace users;
|
07 |
|
08 |
Table created.
|
09 |
|
10 |
SQL> |
3 插入测试数据:
1 |
SQL> insert into part_range select object_id,object_name from dba_objects
|
2 |
2 where object_id<2000;
|
3 |
|
4 |
1953 rows created.
|
5 |
|
6 |
SQL> |
4 在分区表part_range上创建2种分区索引:
本地分区索引【Locally partitioned index】:
1 |
SQL> create index part_range_id_idx on part_range(id) local ;
|
2 |
|
3 |
Index created.
|
4 |
|
5 |
SQL> |
全局分区索引【Globally partitioned index】:
1 |
SQL> create index part_range_name_idx on part_range( name ) tablespace users;
|
2 |
|
3 |
Index created.
|
4 |
|
5 |
SQL> |
5 查看分区表信息:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions
|
2 |
2 where table_name= 'PART_RANGE' ;
|
3 |
|
4 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
5 |
------------------------------ ------------------------------ ------------------------------ |
6 |
PART_RANGE PARTMAX USERS |
7 |
|
8 |
SQL> |
6 查看索引信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions
|
02 |
2 where index_name= 'PART_RANGE_ID_IDX' ;
|
03 |
|
04 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
05 |
------------------------------ ------------------------------ ------------------------------ -------- |
06 |
PART_RANGE_ID_IDX PARTMAX USERS USABLE |
07 |
|
08 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes
|
09 |
2 where table_name= 'PART_RANGE' ;
|
10 |
|
11 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
12 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
13 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
14 |
PART_RANGE_NAME_IDX PART_RANGE USERS VALID NO |
15 |
|
16 |
SQL> |
7 对分区表part_range执行Splitting partitions【分区分裂】操作:
1 |
SQL> alter table part_range split partition partmax at (2000)
|
2 |
2 into (partition p1,partition partmax);
|
3 |
|
4 |
Table altered.
|
5 |
|
6 |
SQL> |
注意,这里的分区分裂操作临界值是2000,即id<2000的记录将全部重组到p1分区,而partmax分区将为空,即0记录。
01 |
SQL> select count (*) from part_range;
|
02 |
|
03 |
COUNT (*)
|
04 |
---------- |
05 |
1953
|
06 |
|
07 |
SQL> select count (*) from part_range partition(p1);
|
08 |
|
09 |
COUNT (*)
|
10 |
---------- |
11 |
1953
|
12 |
|
13 |
SQL> select count (*) from part_range partition(partmax);
|
14 |
|
15 |
COUNT (*)
|
16 |
---------- |
17 |
0
|
18 |
|
19 |
SQL> |
8 再次分别查看分区表、索引信息:
分区表:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions
|
2 |
2 where table_name= 'PART_RANGE' ;
|
3 |
|
4 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
5 |
------------------------------ ------------------------------ ------------------------------ |
6 |
PART_RANGE PARTMAX USERS |
7 |
PART_RANGE P1 USERS |
8 |
|
9 |
SQL> |
索引信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions
|
02 |
2 where index_name= 'PART_RANGE_ID_IDX' ;
|
03 |
|
04 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
05 |
------------------------------ ------------------------------ ------------------------------ -------- |
06 |
PART_RANGE_ID_IDX P1 USERS USABLE |
07 |
PART_RANGE_ID_IDX PARTMAX USERS USABLE |
08 |
|
09 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes
|
10 |
2 where table_name= 'PART_RANGE' ;
|
11 |
|
12 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
13 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
14 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
15 |
PART_RANGE_NAME_IDX PART_RANGE USERS VALID NO |
16 |
|
17 |
SQL> |
小结:对于分区分裂之后,如果包含有空分区的话,那么对于本地分区索引和全局分区索引都是可用的。这种分区分裂的方式通常也叫做快速分裂【Fast Splitting】,索引不需要rebuild。
9 如果在上述步骤7中,执行的分区分裂操作如下:
1 |
SQL> alter table part_range split partition partmax at (1000)
|
2 |
2 into (partition p1,partition partmax);
|
3 |
|
4 |
Table altered.
|
5 |
|
6 |
SQL> |
即分区分裂操作临界值是1000,id<1000的记录将重组到p1分区,id>=1000的记录将重组到partmax分区。也就是此时,分裂出来的p1和partmax这两个分区均不为空。
01 |
SQL> select count (*) from part_range;
|
02 |
|
03 |
COUNT (*)
|
04 |
---------- |
05 |
1953
|
06 |
|
07 |
SQL> select count (*) from part_range partition(p1);
|
08 |
|
09 |
COUNT (*)
|
10 |
---------- |
11 |
953
|
12 |
|
13 |
SQL> select count (*) from part_range partition(partmax);
|
14 |
|
15 |
COUNT (*)
|
16 |
---------- |
17 |
1000
|
18 |
|
19 |
SQL> |
那么,查看到的分区表、索引信息如下:
分区表:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions
|
2 |
2 where table_name= 'PART_RANGE' ;
|
3 |
|
4 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
5 |
------------------------------ ------------------------------ ------------------------------ |
6 |
PART_RANGE PARTMAX USERS |
7 |
PART_RANGE P1 USERS |
8 |
|
9 |
SQL> |
索引信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions
|
02 |
2 where index_name= 'PART_RANGE_ID_IDX' ;
|
03 |
|
04 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
05 |
------------------------------ ------------------------------ ------------------------------ -------- |
06 |
PART_RANGE_ID_IDX P1 USERS UNUSABLE |
07 |
PART_RANGE_ID_IDX PARTMAX USERS UNUSABLE |
08 |
|
09 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes
|
10 |
2 where table_name= 'PART_RANGE' ;
|
11 |
|
12 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
13 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
14 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
15 |
PART_RANGE_NAME_IDX PART_RANGE USERS UNUSABLE NO |
16 |
|
17 |
SQL> |
小结:对于分区分裂之后,如果不包含空分区的话,那么对于本地分区索引和全局分区索引都将不可用,索引的状态都变为UNUSABLE。均需要重建:
01 |
SQL> alter index PART_RANGE_ID_IDX rebuild partition p1;
|
02 |
|
03 |
Index altered.
|
04 |
|
05 |
SQL> alter index PART_RANGE_ID_IDX rebuild partition partmax;
|
06 |
|
07 |
Index altered.
|
08 |
|
09 |
SQL> alter index PART_RANGE_NAME_IDX rebuild;
|
10 |
|
11 |
Index altered.
|
12 |
|
13 |
SQL> |
重建之后,本地分区索引、全局分区索引信息,已由UNUSABLE变为USABLE:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions
|
02 |
2 where index_name= 'PART_RANGE_ID_IDX' ;
|
03 |
|
04 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
05 |
------------------------------ ------------------------------ ------------------------------ -------- |
06 |
PART_RANGE_ID_IDX P1 USERS USABLE |
07 |
PART_RANGE_ID_IDX PARTMAX USERS USABLE |
08 |
|
09 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes
|
10 |
2 where table_name= 'PART_RANGE' ;
|
11 |
|
12 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
13 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
14 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
15 |
PART_RANGE_NAME_IDX PART_RANGE USERS VALID NO |
16 |
|
17 |
SQL> |
当然,如果在分裂分区的同时带上UPDATE INDEXES的话,可以在分裂分区的同时重建索引【包含本地分区索引和全局分区索引,状态均为USABLE、VALID】:
1 |
SQL> alter table part_range split partition partmax at (1000) into (partition p1,partition partmax) update indexes;
|
2 |
|
3 |
Table altered.
|
4 |
|
5 |
SQL> |
分裂分区之后,表信息:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions
|
2 |
2 where table_name= 'PART_RANGE' ;
|
3 |
|
4 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
5 |
------------------------------ ------------------------------ ------------------------------ |
6 |
PART_RANGE PARTMAX USERS |
7 |
PART_RANGE P1 USERS |
8 |
|
9 |
SQL> |
索引信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions where index_name= 'PART_RANGE_ID_IDX' ;
|
02 |
|
03 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
04 |
------------------------------ ------------------------------ ------------------------------ -------- |
05 |
PART_RANGE_ID_IDX P1 USERS USABLE |
06 |
PART_RANGE_ID_IDX PARTMAX USERS USABLE |
07 |
|
08 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes where table_name= 'PART_RANGE' ;
|
09 |
|
10 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
11 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
12 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
13 |
PART_RANGE_NAME_IDX PART_RANGE USERS VALID NO |
14 |
|
15 |
SQL> |
而如果在分裂分区的同时带上UPDATE GLOBAL INDEXES的话,可以在分裂分区的同时重建全局分区索引【不包含本地分区索引,只有全局分区索引状态为VALID】,而本地分区索引需要重建:
1 |
SQL> alter table part_range split partition partmax at (1000) into (partition p1,partition partmax) update global indexes;
|
2 |
|
3 |
Table altered.
|
4 |
|
5 |
SQL> |
分裂分区之后,表信息:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions
|
2 |
2 where table_name= 'PART_RANGE' ;
|
3 |
|
4 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
5 |
------------------------------ ------------------------------ ------------------------------ |
6 |
PART_RANGE PARTMAX USERS |
7 |
PART_RANGE P1 USERS |
8 |
|
9 |
SQL> |
索引信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions where index_name= 'PART_RANGE_ID_IDX' ;
|
02 |
|
03 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
04 |
------------------------------ ------------------------------ ------------------------------ -------- |
05 |
PART_RANGE_ID_IDX P1 USERS UNUSABLE |
06 |
PART_RANGE_ID_IDX PARTMAX USERS UNUSABLE |
07 |
|
08 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes where table_name= 'PART_RANGE' ;
|
09 |
|
10 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
11 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
12 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
13 |
PART_RANGE_NAME_IDX PART_RANGE USERS VALID NO |
14 |
|
15 |
SQL> |
需要注意的是,在分裂分区的同时重建索引,将会消耗更多时间来完成分裂工作,以及消耗更多的系统资源。如果系统资源较为充足的话,可以考虑带上UPDATE INDEXES选项。
10 最后,再看看另外一种比较特殊的情况。在分裂分区的时候,如果将新分区指向新的表空间【由USERS到EXAMPLE表空间】的话,并且分裂之后,包含空分区的情况。即,分裂的语句如下:
01 |
SQL> alter table part_range split partition partmax at (2000)
|
02 |
2 into (partition p1 tablespace example,partition partmax tablespace example);
|
03 |
|
04 |
Table altered.
|
05 |
|
06 |
SQL> select count (*) from part_range;
|
07 |
|
08 |
COUNT (*)
|
09 |
---------- |
10 |
1953
|
11 |
|
12 |
SQL> select count (*) from part_range partition(p1);
|
13 |
|
14 |
COUNT (*)
|
15 |
---------- |
16 |
1953
|
17 |
|
18 |
SQL> select count (*) from part_range partition(partmax);
|
19 |
|
20 |
COUNT (*)
|
21 |
---------- |
22 |
0
|
23 |
|
24 |
SQL> |
那么可以看到分区表:
1 |
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions where table_name= 'PART_RANGE' ;
|
2 |
|
3 |
TABLE_NAME PARTITION_NAME TABLESPACE_NAME |
4 |
------------------------------ ------------------------------ ------------------------------ |
5 |
PART_RANGE PARTMAX EXAMPLE |
6 |
PART_RANGE P1 EXAMPLE |
7 |
|
8 |
SQL> |
索引分区信息:
01 |
SQL> select index_name,partition_name,tablespace_name,status from user_ind_partitions where index_name= 'PART_RANGE_ID_IDX' ;
|
02 |
|
03 |
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS |
04 |
------------------------------ ------------------------------ ------------------------------ -------- |
05 |
PART_RANGE_ID_IDX P1 EXAMPLE UNUSABLE |
06 |
PART_RANGE_ID_IDX PARTMAX EXAMPLE USABLE |
07 |
|
08 |
SQL> select index_name,table_name,tablespace_name,status,partitioned from user_indexes where table_name= 'PART_RANGE' ;
|
09 |
|
10 |
INDEX_NAME TABLE_NAME TABLESPACE_NAME STATUS PAR |
11 |
------------------------------ ------------------------------ ------------------------------ -------- --- |
12 |
PART_RANGE_ID_IDX PART_RANGE N/A YES |
13 |
PART_RANGE_NAME_IDX PART_RANGE USERS UNUSABLE NO |
14 |
|
15 |
SQL> |
小结:在分裂分区的时候,如果将新分区指向新的表空间的话,并且分裂之后,即使包含空分区的情况下,只有新空分区的本地索引不需要重建,而含有数据的新分区的本地分区索引以及全局分区索引均需重建。这有别于快速分裂,或者说是快速分裂的一种特殊情况。
发表评论
-
关于Oracle 版本
2015-10-10 10:23 0第一部分是“Version Number",也就是产 ... -
了解Oracle数据库的版本号
2015-10-10 10:20 0Major Database Release ... -
PDF 资料
2013-03-13 15:45 0Java design pattern --Bob ... -
Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别 [转]
2013-03-12 14:17 1024sys和system用户区别 1)最重要的区别,存储的数 ... -
Oracle 用户、对象权限、系统权限 [转]
2013-03-12 14:12 0--============================ ... -
表分区分割脚本
2013-03-12 13:10 737表分区分割脚本 -
Oracle Session 视图[转]
2013-03-06 10:17 976v$session v$session_wait v$ ... -
10G中查看历史执行计划信息[转]
2013-03-01 11:02 3763现在总结下10G的,使用的是AWR报告中的信息,主要是查询 ... -
Oracle 表连接 [转]
2013-02-26 15:20 648Oracle 表之间的连接分为三种: 1. 内连接(自然 ... -
oracle的number类型精度、刻度范围 [转]
2013-02-26 15:06 5254一、 oracle 的 number 类型精度、刻度范围 ... -
DBMS_XPLAN.Display_Cursor 分析[转]
2012-12-27 10:49 977Oracle 10 added the awesome pro ... -
Oracle Tablespace
2012-11-29 16:53 01. 几个重要的TableSpace SYSTE ... -
[转]解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
2012-11-28 11:11 849Tag: http://www.oraclefans. ... -
Estimate TEMP usage without running SQL [转]
2012-11-28 11:09 785Estimate TEMP usage without run ... -
[转]Optimizing SPLIT PARTITION and SPLIT SUBPARTITION Operations
2012-11-27 15:11 912Optimizing SPLIT PARTITION and ... -
When the explanation doesn't sound quite right
2012-10-30 13:05 0When the explanatio ... -
Bind variables - The key to application performance[转]
2012-11-27 15:16 776Overview If you've been ... -
oracle中join的用法 .
2012-10-10 11:43 0oracle中join的用法8i: create ... -
[转]Oracle中Left Outer Join和外关联(+)的区别
2012-11-27 15:15 844外关联是Oracle数据库的专有语句 Left Outer ... -
[转]关于ORACLE的锁表与解锁总结
2012-09-29 11:11 0总结1:Oracle的锁表与解锁 selects.userna ...
相关推荐
rw-splitting.lua LINUX MYSQL主从备份文件
只需按照软件界面的提示,选择需要处理的文件,设置相应的参数,点击开始,Splitting就会自动完成任务,提供简单而高效的文件管理解决方案。 总的来说,Splitting文件合并器是一款值得信赖的工具,尤其适合需要频繁...
"Splitting Bregman"是一种优化算法,主要应用于图像处理领域,特别是图像去噪和复原。这个算法是由Yin等人在2009年提出的,它结合了Bregman迭代和交替方向方法,旨在解决带有L1正则化的优化问题。在图像处理中,L1...
在SDN(软件定义网络)中,流量分片(Traffic Splitting)是一种常见的网络管理功能,旨在通过网络的不同路径或组件分配数据流量,以优化网络资源使用、提升系统性能和可靠性。特别是在大型云服务提供商环境中,由于...
本文将深入探讨RSMA(Rate Splitting Multiple Access)技术在有限反馈通信系统中的应用,特别是通过MMSE(Minimum Mean Square Error)基预编码进行的实现。速率拆分是现代多用户通信系统中一种重要的信号处理策略...
Rate-splitting multiple access for downlink communication systems: bridging generalizing and outperforming SDMA and NOMA." EURASIP Journal on Wireless Communications and Networking 2018.1 (2018):...
splitting.min.js
Splitting(分割器)正是这样一款应用,它专注于基本的文件分割功能,确保操作的安全性和简易性。这款工具避免了不必要的写入行为,降低了对原始数据的潜在风险,并且易于复原已分割的文件,让用户能够高效地处理大...
shardingsphere-proxy conf 目录下的配置文件
OSQP(Operator Splitting Solver for Quadratic Programs)是一种用于求解凸二次规划问题的高效算法。二次规划是优化领域中的核心问题,它涉及到寻找一个向量x,使其在满足线性约束的同时,使得以x为变量的二次函数...
《适应性分割协议在RFID标签碰撞仲裁中的应用》 一、引言 无线电频率识别(RFID)系统作为自动识别技术的一种,由读写器和标签组成,其中标签存储有唯一标识号(ID),读写器通过与标签的连续通信来识别附着于其上...
Splitting Bregman算法的核心思想是将复杂的优化问题分解为一系列简单的小问题,通过引入Bregman距离来处理非凸和非平滑的项。它通常应用于求解以下形式的优化问题: \[ \min_{x} \left\{ f(x) + g(Ax) \right\} \]...
《Allen--Cahn的绞线分裂能量耗散:Energy dissipation of Strang splitting for Allen--Cahn》 本文深入探讨了Allen-Cahn方程的一种二阶Strang分裂方法的能量耗散特性,该方程常用于描述多组分合金中相变过程中的...
通过将复杂问题分解为更简单的子问题,ADMM可以逐次迭代优化这些子问题,从而达到全局最优。 3. ADMM算法的应用: 提出的ADMM算法在每个迭代步长中,全局步骤仅涉及一次矩阵乘法操作,大大降低了计算复杂度。而局部...
《Douglas-Rachford Splitting算法详解》 在数值计算和优化领域,Douglas-Rachford Splitting算法(简称DR算法)是一种强大的工具,尤其在处理复合优化问题时展现出其独特的优势。本篇论文深入探讨了该算法的原理、...
### Fast Corotated FEM using Operator Splitting #### 概述 本文介绍了一种改进的共形有限元(FEM)模拟技术,该技术利用算子分裂方法来提高计算效率和准确性。这种方法特别适用于处理非线性材料模型,如共线性...
**区域分裂(Region Splitting)** 区域分裂是将一个大的图像区域划分为多个子区域的过程,目的是为了更好地理解图像内容。这个过程通常基于某些特征,如颜色、纹理或亮度的差异。在Matlab中,可以使用多种算法来...