分区表基础介绍

分区表

Oracle提供了范围分区、散列分区、列表分区、组合分区4种分区的方法

 

范围分区:按照列值范围将数据分布到不同分区

SQL>  CREATE TABLE ran_tab (

  2                              range_key_column date ,

  3                              data varchar2(20)

  4                             )

  5    PARTITION BY RANGE (range_key_column)

  6    ( PARTITION part_1 VALUES LESS THAN(to_date('01/01/2005','dd/mm/yyyy')),

  7      PARTITION part_2 VALUES LESS THAN(to_date('01/01/2006','dd/mm/yyyy'))

  8    )

  9  /

 

插入值

SQL> insert into ran_tab(range_key_column,data) values(to_date('2005-05-01','yyyy-mm-dd'),'chifan');

SQL> insert into ran_tab(range_key_column,data) values(to_date('2005-06-01','yyyy-mm-dd'),'chifan');

 

查看分区

SQL> select * from ran_tab partition(part_1);

 

RANGE_KEY_COLUMN DATA

---------------- --------------------

2004-6-1         chifan

2003-6-1         chifan

 

SQL> select * from ran_tab partition(part_2);

 

RANGE_KEY_COLUMN DATA

---------------- --------------------

2005-5-1         chifan

2005-6-1         chifan

 

 

查看分区表

SQL> select segment_name,partition_name,tablespace_name

  2  from user_segments where segment_name='RAN_TAB';

 

SEGMENT_NAME                                                                   PARTITION_NAME                 TABLESPACE_NAME

------------------- ----------- ------------------------------ ---------------

RAN_TAB                                                                     PART_1                         USER02

RAN_TAB                                                                          PART_2                         USER02

 

增加分区

SQL> alter table ran_tab add partition part_3 values less than (to_date('2007-01-01','yyyy-mm-dd'));

 

Table altered

 

删除分区

SQL> alter table ran_tab drop partition part_3;

 

Table altered

 

散列分区:对列进行hash算法的分区,将数据均匀的分布到各个分区

SQL> CREATE TABLE p_hash_emp

  2   ( empno int,

  3    ename varchar2(20)

  4    )

  5   PARTITION BY HASH (empno)

  6   ( partition part_1 tablespace users,

  7     partition part_2 tablespace user02

  8    )

  9  /

 

Table created

 

插入数据

SQL> insert into p_hash_emp values(1,'a');

SQL> insert into p_hash_emp values(2,'b');

SQL> insert into p_hash_emp values(3,'c');

SQL> insert into p_hash_emp values(4,'d');

SQL> insert into p_hash_emp values(5,'de');

 

查看

SQL> select * from p_hash_emp partition(part_1);

 

                                  EMPNO ENAME

--------------------------------------- --------------------

                                      2 b

                                      5 de

 

SQL> select * from p_hash_emp partition(part_2);

 

                                  EMPNO ENAME

--------------------------------------- --------------------

                                      1 a

                                      3 c

                                      4 d

添加分区

SQL> alter table p_hash_emp add partition part_3;

Table altered

 

 

列表分区:将离散的数据有效的部署到不同分区

SQL> create table region_emp(

  2                          deptno number,

  3                          dname  varchar2(10)

  4                          )

  5  partition by list(dname)

  6               (partition p1 values ('a'),

  7                partition p2 values ('b','c'),

  8                partition p3 values ('d','e')

  9                )

 10  /

 

Table created

 

 

SQL> insert into region_emp values(1,'a');

SQL> insert into region_emp values(2,'b');

SQL> insert into region_emp values(3,'e');

 

 

SQL> select * from region_emp partition(p1);

    DEPTNO DNAME

---------- ----------

         1 a

 

SQL> select * from region_emp partition(p2);

     DEPTNO DNAME

---------- ----------

         2 b

 

SQL> select * from region_emp partition(p3);

     DEPTNO DNAME

---------- ----------

         3 e

 

 

分区表上建立索引

 

对于分区表来说,每个表分区对应一个分区段,当在分区表上建立索引时既可以建立全局索引,也可以建立分区索引。如果建立全局索引,索引数据会存放到一个索引段中,如果建立分区索引,则索引数据会存放到几个索引分区段中去

 

全局索引 默认情况下载分区表上建立的索引索引全局索引,建立全局索引时也可以加参数global,当然默认就是这个值

SQL> create index ind_a on ran_tab(range_key_column);

Index created

 

SQL> create index ind_a on ran_tab(range_key_column) global;

Index created

两句话意思一样,只是前面省略默认参数

 

分区索引:建立分区索引时,索引数据存放到几个分区段中,分区索引是基于分区表建立的,不能基于普通表建立,并且分区个数与表的分区是完全对应的

SQL> create index ind_a on ran_tab(range_key_column) local;

Index created

 

查看分区索引

SQL> select partition_name,index_name from user_ind_partitions;

PARTITION_NAME                 INDEX_NAME

------------------------------ ------------------------------

PART_1                         IND_A

PART_2                         IND_A

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10678398/viewspace-700073/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10678398/viewspace-700073/

<think>好的,我现在需要帮用户介绍一下Oracle建立分区表的相关内容。首先,用户之前询问了关于Oracle双活架构下百万数据性能瓶颈的问题,现在转而询问分区表的建立,可能是想通过分区表来优化性能。因此,我应该确保回答内容能够解决用户可能的性能优化需求,同时覆盖分区表的基本概念、创建方法、使用场景以及最佳实践。 首先,我需要确定用户对分区表的了解程度。用户可能有一定的数据库基础,但作为介绍,应该从基础开始,逐步深入。需要包括分区表的作用、类型、创建步骤、管理以及使用场景和注意事项。 接下来,要考虑Oracle分区表的主要优势,比如提高查询性能、简化数据管理、增强可用性等。这些点需要明确列出,让用户明白为何要使用分区表。同时,要介绍常见的分区策略,如范围分区、列表分区、哈希分区、复合分区等,每种分区的适用场景和示例。 然后,创建分区表的SQL语法是关键部分,需要给出具体的示例,比如按时间范围分区,这样用户能够直观地看到如何操作。同时,要提到分区表的管理操作,比如添加分区、合并分区、删除分区等,这些是日常维护中常用的操作,用户可能会关心如何动态管理分区。 还要考虑分区表的使用场景,例如大数据量表、历史数据归档、并行处理需求等,这些能帮助用户判断自己的情况是否适合使用分区表。此外,注意事项也很重要,比如分区键的选择、分区数量的控制、索引策略等,避免用户在实际应用中出现问题。 用户可能的深层需求是优化查询性能和管理大量数据,因此在介绍时需要强调分区表如何提升查询效率,比如通过分区剪裁减少扫描的数据量。同时,可能还需要对比分区表和其他优化手段的区别,比如索引、物化视图等,但用户的问题集中在分区表,所以可以简要提及,不展开讨论。 需要确保回答结构清晰,分点说明,便于用户理解。使用示例代码时,要符合Oracle的语法规范,避免错误。此外,考虑到用户之前的问题涉及性能瓶颈,可能在分区表介绍时,可以适当关联到如何通过分区解决或缓解类似问题,比如减少I/O负载,提高并发处理能力等。 最后,总结分区表的优势和使用建议,帮助用户做出决策。确保语言简洁明了,技术细节准确,同时避免过于专业的术语,必要时进行解释,让不同层次的用户都能理解。</think>以下是对Oracle分区表的详细介绍,从**基础概念**到**实战应用**分层解析: --- ### 一、分区表的核心价值 1. **性能提升** - 通过**分区剪裁(Partition Pruning)** 减少数据扫描量 例如:`WHERE order_date >= '2023-01-01'` 直接定位到2023年分区 - 公式: $$ \text{查询时间} = \frac{\text{总数据量}}{\text{分区数量}} \times \text{单分区扫描效率} $$ 2. **管理便捷性** - 可独立对分区进行`ADD/DROP/TRUNCATE`操作 - 示例:删除旧数据只需`ALTER TABLE sales DROP PARTITION p2020;` 3. **高可用性** - 分区级备份恢复(如仅修复损坏的分区) - 支持分区级在线重定义 --- ### 二、主流分区类型详解 #### 1. 范围分区(RANGE) **适用场景**:时间序列数据(订单、日志等) ```sql CREATE TABLE sales ( order_id NUMBER, order_date DATE, amount NUMBER ) PARTITION BY RANGE (order_date) ( PARTITION p2020 VALUES LESS THAN (TO_DATE('2021-01-01','YYYY-MM-DD')), PARTITION p2021 VALUES LESS THAN (TO_DATE('2022-01-01','YYYY-MM-DD')), PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')), PARTITION p_max VALUES LESS THAN (MAXVALUE) ); ``` #### 2. 列表分区(LIST) **适用场景**:离散值分类(地区、状态码等) ```sql CREATE TABLE employees ( emp_id NUMBER, dept_code VARCHAR2(10) ) PARTITION BY LIST (dept_code) ( PARTITION p_east VALUES ('BJ','SH','TJ'), PARTITION p_west VALUES ('CD','XA','CQ'), PARTITION p_other VALUES (DEFAULT) ); ``` #### 3. 哈希分区(HASH) **适用场景**:均匀分布热点数据 ```sql CREATE TABLE user_logs ( log_id NUMBER, user_id NUMBER ) PARTITION BY HASH(user_id) PARTITIONS 4; -- 自动生成p0,p1,p2,p3分区 ``` #### 4. 复合分区(如RANGE-LIST) **适用场景**:多维数据管理 ```sql CREATE TABLE telecom_records ( call_time DATE, area_code VARCHAR2(4), duration NUMBER ) PARTITION BY RANGE (call_time) SUBPARTITION BY LIST (area_code) ( PARTITION p2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01','YYYY-MM-DD')) ( SUBPARTITION p2023q1_east VALUES ('021','010'), SUBPARTITION p2023q1_west VALUES ('028','029') ) ); ``` --- ### 三、关键管理操作 #### 1. 动态添加分区 ```sql -- 范围分区扩展 ALTER TABLE sales ADD PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01','YYYY-MM-DD')); -- 列表分区扩展 ALTER TABLE employees MODIFY PARTITION p_other ADD VALUES ('GZ','SZ'); ``` #### 2. 分区维护 ```sql -- 合并相邻分区 ALTER TABLE sales MERGE PARTITIONS p2020, p2021 INTO PARTITION p2020_2021; -- 分裂分区 ALTER TABLE sales SPLIT PARTITION p_max AT (TO_DATE('2024-01-01','YYYY-MM-DD')) INTO (PARTITION p2023, PARTITION p_max_new); ``` #### 3. 数据迁移 ```sql -- 交换分区(快速加载数据) ALTER TABLE sales EXCHANGE PARTITION p2023 WITH TABLE stage_sales_data; ``` --- ### 四、性能优化策略 1. **索引设计** - 全局索引(Global Index):跨分区查询高效,但维护成本高 - 本地索引(Local Index):与分区对齐,维护效率高 ```sql CREATE INDEX idx_sales_date ON sales(order_date) LOCAL; ``` 2. **分区键选择原则** - 高频查询条件中的列(如`WHERE order_date=...`) - 数据分布均匀的列 - 避免使用频繁更新的列 3. **并行查询加速** ```sql ALTER SESSION ENABLE PARALLEL DML; SELECT /*+ PARALLEL(sales, 8) */ * FROM sales WHERE order_date BETWEEN :start AND :end; ``` --- ### 五、典型应用场景 | 场景 | 推荐分区类型 | 优势体现 | |---------------------|-------------------|---------------------------| | 电商订单表 | RANGE(按日/月) | 快速清理历史订单 | | 日志分析系统 | INTERVAL(自动扩展)| 自动创建新分区 | | 多租户SaaS系统 | LIST(按租户ID) | 隔离不同客户数据 | | 实时交易系统 | HASH(用户ID) | 分散热点提升并发 | --- ### 六、注意事项 1. **分区数量控制** - 建议单个表不超过**1000个分区**(避免数据字典膨胀) - 可通过`COMPRESS`选项优化存储 2. **11g+新特性** - **Interval分区**:自动创建时间范围分区 ```sql CREATE TABLE sensor_data ( rec_time TIMESTAMP ) PARTITION BY RANGE (rec_time) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) -- 每月自动生成新分区 (PARTITION p_init VALUES LESS THAN (TIMESTAMP '2023-01-01 00:00:00')); ``` - **Reference分区**:子表继承父表分区策略 --- **总结**:Oracle分区表通过**数据物理分段**实现性能与管理效率的双重提升。实际应用中需根据数据特征选择合适的分区策略,结合索引、并行等特性构建完整的优化方案。建议从`DBMS_PART`包和`DBA_TAB_PARTITIONS`视图入手进行分区监控。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值