`
阅读更多

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   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   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   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   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   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   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   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   into (partition p1,partition partmax);
3   
4 Table altered.
5   
6 SQL>

即分区分裂操作临界值是1000id<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   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   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   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   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   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   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   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   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>

小结:在分裂分区的时候,如果将新分区指向新的表空间的话,并且分裂之后,即使包含空分区的情况下,只有新空分区的本地索引不需要重建,而含有数据的新分区的本地分区索引以及全局分区索引均需重建。这有别于快速分裂,或者说是快速分裂的一种特殊情况

分享到:
评论

相关推荐

    rw-splitting.lua

    rw-splitting.lua LINUX MYSQL主从备份文件

    Splitting文件合并器

    只需按照软件界面的提示,选择需要处理的文件,设置相应的参数,点击开始,Splitting就会自动完成任务,提供简单而高效的文件管理解决方案。 总的来说,Splitting文件合并器是一款值得信赖的工具,尤其适合需要频繁...

    splitting Bregman

    "Splitting Bregman"是一种优化算法,主要应用于图像处理领域,特别是图像去噪和复原。这个算法是由Yin等人在2009年提出的,它结合了Bregman迭代和交替方向方法,旨在解决带有L1正则化的优化问题。在图像处理中,L1...

    Traffic Splitting on SDN Switch

    在SDN(软件定义网络)中,流量分片(Traffic Splitting)是一种常见的网络管理功能,旨在通过网络的不同路径或组件分配数据流量,以优化网络资源使用、提升系统性能和可靠性。特别是在大型云服务提供商环境中,由于...

    code.zip_RSMA_Rate Splitting_通信系统仿真_速率拆分

    本文将深入探讨RSMA(Rate Splitting Multiple Access)技术在有限反馈通信系统中的应用,特别是通过MMSE(Minimum Mean Square Error)基预编码进行的实现。速率拆分是现代多用户通信系统中一种重要的信号处理策略...

    EURASIP JWCN_Rate-Splitting_noma_NOMAcvx_ratesplitting_NOMAmatla

    Rate-splitting multiple access for downlink communication systems: bridging generalizing and outperforming SDMA and NOMA.&quot; EURASIP Journal on Wireless Communications and Networking 2018.1 (2018):...

    splitting.min.js

    splitting.min.js

    实用的文件分割器-Splitting(分割器)

    Splitting(分割器)正是这样一款应用,它专注于基本的文件分割功能,确保操作的安全性和简易性。这款工具避免了不必要的写入行为,降低了对原始数据的潜在风险,并且易于复原已分割的文件,让用户能够高效地处理大...

    config-readwrite-splitting.yaml

    shardingsphere-proxy conf 目录下的配置文件

    006_OSQP: An Operator Splitting Solver forQuadratic Programs

    OSQP(Operator Splitting Solver for Quadratic Programs)是一种用于求解凸二次规划问题的高效算法。二次规划是优化领域中的核心问题,它涉及到寻找一个向量x,使其在满足线性约束的同时,使得以x为变量的二次函数...

    A daptive Splitting Protocols for RFID Tag Collision Arbitration

    《适应性分割协议在RFID标签碰撞仲裁中的应用》 一、引言 无线电频率识别(RFID)系统作为自动识别技术的一种,由读写器和标签组成,其中标签存储有唯一标识号(ID),读写器通过与标签的连续通信来识别附着于其上...

    splitting_bregman分裂算法用于求解最优化问题.zip

    Splitting Bregman算法的核心思想是将复杂的优化问题分解为一系列简单的小问题,通过引入Bregman距离来处理非凸和非平滑的项。它通常应用于求解以下形式的优化问题: \[ \min_{x} \left\{ f(x) + g(Ax) \right\} \]...

    Allen--Cahn的绞线分裂能量耗散_Energy dissipation of Strang splitting for

    《Allen--Cahn的绞线分裂能量耗散:Energy dissipation of Strang splitting for Allen--Cahn》 本文深入探讨了Allen-Cahn方程的一种二阶Strang分裂方法的能量耗散特性,该方程常用于描述多组分合金中相变过程中的...

    自由翻转畸变能的分裂方案_A Splitting Scheme for Flip-Free Distortion Energie

    通过将复杂问题分解为更简单的子问题,ADMM可以逐次迭代优化这些子问题,从而达到全局最优。 3. ADMM算法的应用: 提出的ADMM算法在每个迭代步长中,全局步骤仅涉及一次矩阵乘法操作,大大降低了计算复杂度。而局部...

    presentaci_n_seminario_rachfford_SPLITTING_Douglas_algorithm_

    《Douglas-Rachford Splitting算法详解》 在数值计算和优化领域,Douglas-Rachford Splitting算法(简称DR算法)是一种强大的工具,尤其在处理复合优化问题时展现出其独特的优势。本篇论文深入探讨了该算法的原理、...

    Fast Corotated FEM using Operator Splitting

    ### Fast Corotated FEM using Operator Splitting #### 概述 本文介绍了一种改进的共形有限元(FEM)模拟技术,该技术利用算子分裂方法来提高计算效率和准确性。这种方法特别适用于处理非线性材料模型,如共线性...

    region-merge.zip_image splitting_matlab区域合并_region splitting_四叉树

    **区域分裂(Region Splitting)** 区域分裂是将一个大的图像区域划分为多个子区域的过程,目的是为了更好地理解图像内容。这个过程通常基于某些特征,如颜色、纹理或亮度的差异。在Matlab中,可以使用多种算法来...

Global site tag (gtag.js) - Google Analytics