Oracle12c:自动分区表

  • 为什么要创建oracle分区表?

一般情况下,如果不分区,则每次查询的对象都是一整张表,如果采用了表分区,那么可以根据具体的分区字段当作条件来避免扫描整张表,减少IO的扫描以提高表的查询速度。

  • 新建(按照日期自动分区)分区表
SQL> create table test_partion(
  2  pk_id number(38) generated as identity (start with 1 increment by 1),
  3  P_day date,
  4  words varchar2(200),
  5  constraint pk_test_partition_id primary key (pk_id)
  6  )
  7  partition by range(P_day)
  8  interval (numtodsinterval(1,‘day‘))
  9  (
 10  partition part_20170622 values less than (to_date(‘20170622‘,‘yyyyMMdd‘))
 11  );
Table created
  • 尝试插入数据,之后查看动态分区表的分区个数:
SQL> select * from test_partion ;
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- ------
SQL> insert into test_partion (p_day,words) values (to_date(‘20170622‘,‘yyyyMMdd‘),‘00001‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘00002‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘00003‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170624‘,‘yyyyMMdd‘),‘00004‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘00005‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170625‘,‘yyyyMMdd‘),‘00006‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170626‘,‘yyyyMMdd‘),‘00006‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170627‘,‘yyyyMMdd‘),‘00006‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170628‘,‘yyyyMMdd‘),‘00006‘);
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date(‘20170629‘,‘yyyyMMdd‘),‘00006‘);
1 row inserted
SQL> select table_name,partition_name,high_value from user_tab_partitions where table_name=‘TEST_PARTION‘;
TABLE_NAME      PARTITION_NAME   HIGH_VALUE
--------------- ---------------- --------------------------------------------------------------------------------
TEST_PARTION    PART_20170622    TO_DATE(‘ 2017-06-22 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2252        TO_DATE(‘ 2017-06-23 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2253        TO_DATE(‘ 2017-06-24 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2254        TO_DATE(‘ 2017-06-25 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2255        TO_DATE(‘ 2017-06-26 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2256        TO_DATE(‘ 2017-06-27 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2257        TO_DATE(‘ 2017-06-28 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2258        TO_DATE(‘ 2017-06-29 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2259        TO_DATE(‘ 2017-06-30 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
9 rows selected

从上边表中我们基本可以看出,除了分区PART_20170622是我们动态创建的分区外,其他SYS_*分区都是动态创建的。

  • 接下来查看每个分区表的数据分区情况:
SQL> select * from test_partion partition(PART_20170622);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------

SQL> select * from test_partion partition(SYS_P2252);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------
                                      1 2017/6/22   00001

SQL> select * from test_partion partition(SYS_P2253);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------
                                      2 2017/6/23   00002
                                      3 2017/6/23   00003
                                      5 2017/6/23   00005

SQL> select * from test_partion partition(SYS_P2254);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- -------
                                      4 2017/6/24   00004

SQL> select * from test_partion partition(SYS_P2255);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- -------
                                      6 2017/6/25   00006

SQL> select * from test_partion partition(SYS_P2256);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- -------
                                      7 2017/6/26   00006

SQL> select * from test_partion partition(SYS_P2257);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- -------
                                      8 2017/6/27   00006

SQL> select * from test_partion partition(SYS_P2258);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- -------
                                      9 2017/6/28   00006

SQL> select * from test_partion partition(SYS_P2259);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- ------
                                     10 2017/6/29   00006
  • 分区操作:

1)删除某个分区表中的数据

SQL> delete from test_partion partition(SYS_P2259);
1 row deleted

SQL> select * from test_partion partition(SYS_P2259);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- ------

2)删除某个分区

SQL> alter table test_partion drop partition SYS_P2259;
Table altered

删除分区之后,查看表分区情况。

SQL> select table_name,partition_name,high_value from user_tab_partitions where table_name=‘TEST_PARTION‘;
TABLE_NAME      PARTITION_NAME   HIGH_VALUE
--------------- ---------------- --------------------------------------------------------------------------------
TEST_PARTION    PART_20170622    TO_DATE(‘ 2017-06-22 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2252        TO_DATE(‘ 2017-06-23 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2253        TO_DATE(‘ 2017-06-24 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2254        TO_DATE(‘ 2017-06-25 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2255        TO_DATE(‘ 2017-06-26 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2256        TO_DATE(‘ 2017-06-27 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2257        TO_DATE(‘ 2017-06-28 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION    SYS_P2258        TO_DATE(‘ 2017-06-29 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
8 rows selected

注:drop partition时,该分区内存储的数据也将同时删除,你的本意是希望删除掉指定的分区但保留数据,你应该使用merge partition,执行该语句会导致glocal索引的失效需要重建全局索引

3)合并分区

相邻的分区可以通过命令merge partition合并为一个分区,同时分区中的数据也将会被合并到同一个分区中。

新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。

参考:http://www.cnblogs.com/wangfg/p/5286519.html

SQL> alter table test_partion merge partitions SYS_P2253,SYS_P2254 into partition  SYS_P2253_to_P2254;
Table altered

SQL> select table_name,partition_name,high_value from user_tab_partitions where table_name=‘TEST_PARTION‘;
TABLE_NAME                                                                       PARTITION_NAME                                                                   HIGH_VALUE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
TEST_PARTION                                                                     PART_20170622                                                                    TO_DATE(‘ 2017-06-22 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2252                                                                        TO_DATE(‘ 2017-06-23 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2253_TO_P2254                                                               TO_DATE(‘ 2017-06-25 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2255                                                                        TO_DATE(‘ 2017-06-26 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2256                                                                        TO_DATE(‘ 2017-06-27 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2257                                                                        TO_DATE(‘ 2017-06-28 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2258                                                                        TO_DATE(‘ 2017-06-29 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
7 rows selected

SQL> select * from test_partion partition(SYS_P2253_TO_P2254);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------------------------------------------------------------------------------
                                      2 2017/6/23   00002
                                      3 2017/6/23   00003
                                      5 2017/6/23   00005
                                      4 2017/6/24   00004

SQL> insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘06665‘);
insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘06665‘)
ORA-01502: 索引 "NETPLAN_ONLINE_APPUSER.PK_TEST_PARTITION_ID" 或这类索引的分区处于不可用状态

SQL> alter index PK_TEST_PARTITION_ID rebuild;
Index altered

SQL> insert into test_partion (p_day,words) values (to_date(‘20170623‘,‘yyyyMMdd‘),‘06665‘);
1 row inserted

SQL> insert into test_partion (p_day,words) values (to_date(‘20170624‘,‘yyyyMMdd‘),‘06665‘);
1 row inserted

SQL> select * from test_partion partition(SYS_P2253_TO_P2254);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------------------------------------------------------------------------------
                                      2 2017/6/23   00002
                                      3 2017/6/23   00003
                                      5 2017/6/23   00005
                                      4 2017/6/24   00004
                                     12 2017/6/23   06665
                                     13 2017/6/24   06665
6 rows selected

4)分区重命名

SQL>
SQL> alter table test_partion rename partition SYS_P2253_to_P2254 TO SYS_P2253_to_P2254___;
Table altered

SQL> insert into test_partion (p_day,words) values (to_date(‘20170624‘,‘yyyyMMdd‘),‘76665‘);
1 row inserted

SQL> select table_name,partition_name,high_value from user_tab_partitions where table_name=‘TEST_PARTION‘;
TABLE_NAME                                                                       PARTITION_NAME                                                                   HIGH_VALUE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
TEST_PARTION                                                                     PART_20170622                                                                    TO_DATE(‘ 2017-06-22 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2252                                                                        TO_DATE(‘ 2017-06-23 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2253_TO_P2254___                                                            TO_DATE(‘ 2017-06-25 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2255                                                                        TO_DATE(‘ 2017-06-26 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2256                                                                        TO_DATE(‘ 2017-06-27 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2257                                                                        TO_DATE(‘ 2017-06-28 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
TEST_PARTION                                                                     SYS_P2258                                                                        TO_DATE(‘ 2017-06-29 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
7 rows selected

SQL> insert into test_partion (p_day,words) values (to_date(‘20170624‘,‘yyyyMMdd‘),‘76665‘);
1 row inserted

SQL> select * from test_partion partition(SYS_P2253_TO_P2254___);
                                  PK_ID P_DAY       WORDS
--------------------------------------- ----------- --------------------------------------------------------------------------------
                                      2 2017/6/23   00002
                                      3 2017/6/23   00003
                                      5 2017/6/23   00005
                                      4 2017/6/24   00004
                                     12 2017/6/23   06665
                                     13 2017/6/24   06665
                                     14 2017/6/24   76665
                                     15 2017/6/24   76665
8 rows selected

因为这里是动态分区,所以就不介绍怎么添加分区。

时间: 2024-11-05 21:35:34

Oracle12c:自动分区表的相关文章

Timestamp 与 Date 变量绑定与Oracle的自动分区

好久没有更新博客了,其实是工作中遇到的很多问题在Google上都能找到答案,也就没有记录下来的必要了.今天主要想聊一下在实际的系统中遇到的Oracle数据库的问题,希望对大家有一点点帮助就好. 我首先描述一下我所遇到的场景:我们的数据库用的是Oracle 11g,我想大家立马就对它的自动分区(Interval)有了基本的认识了,这是一个非常棒的功能,免除了在建表时弄一大堆建Range分区的代码,也免除了以后对数据库进行分区扩充的麻烦.当然利用JOB也是可以完成分区扩展的,但是既然Oracle提供

ORA-14300: 分区关键字映射到超出允许的最大分区数的分区

环境为:Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 对象表为按天的自动分区表: PARTITION BY RANGE ("START_TIME") INTERVAL (NUMTODSINTERVAL(1,'DAY')) 原因为:当START_TIME的值为NULL时,然后向分区对象表插入数据,数据库不知道将该条记录插入到哪个分区,导致报错. 解决方法:需要给START_TIME

mysql5.6错误代码

版本5.6  MySQL 5.6参考手册  /  错误,错误代码和常见问题  /服务器错误代码和消息 B.3服务器错误代码和消息 当服务器返回错误时,MySQL程序可以访问多种类型的错误信息.例如, mysql客户端程序使用以下格式显示错误: shell> SELECT * FROM no_such_table; ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist 显示的信息包含三种信息: 数字错误代码(1146).这个数字是

Mysql错误编码和解释表

Mysql错误编码和解释表1.错误消息的组成 一共由三部分组成 mysql数字错误代码,这个数字的mysql的特定值,不可以移植到其它数据库系统. 一个五位长度的sqlstate值,这些值取自ANSI SQL和ODBC,并且更加标准化.并不是所有的MySQL错误号都具有相应的SQLSTATE值.在这些情况下,使用'HY000' (一般错误). 错误的消息描述 2.一些额外的说明 如果需要错误检查,请使用错误代码,而不是错误消息. 如果数据库管理员更改语言设置,则会影响错误消息的语言. 错误代码在

oracle分区表按时间自动创建

表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表. 根据年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))根据月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))根据天: INTERVAL(NUMT

ubuntu server下建立分区表/分区/格式化/自动挂载(转)

link:http://www.thxopen.com/linux/2014/03/30/Linux_parted.html 流程为:新建分区-->格式化分区-->挂载分区 首先弄明白分区的定义,我在网上找到MBR和GPT分区的介绍: MBR分区(主引导记录)表: 支持最大卷:2T (T; terabytes,1TB=1024GB) 分区的设限:最多4个主分区或3个主分区加一个扩展分区. GPT分区(GUID分区表)表: 支持最大卷:18EB,(E:exabytes,1EB=1024TB) 每

创建分区表(按照年份分区,自动新增分区)

创建分区表AAA,通过字段创建时间的年份来分区,分区表自动根据插入的数据新增对应的分区,不过此处自动创建的分区名称为系统创建的,如:SYS_24. CREATE TABLE AAA ( ID NUMBER(8), CREATETIME DATE, VALUE NUMBER(8) ) PARTITION BY RANGE(CREATETIME) INTERVAL(NUMTOYMINTERVAL(1,'YEAR')) ( PARTITION P2014 VALUES LESS THAN(TO_DAT

sqlserver分区表实践:对时间分区表自动进行管理

项目问题:有一张日志表,插入和查询为主,每天记录数据为200多万,大小为2G-4G之间.一开始开发人员使用delete语句手动删除,保留7天数据,经常造成阻塞和性能瓶颈.但是如果不删除数据随着表越来越大,查询效率很低,由于应用有超时设置,经常出现timeout. 优化思路:采用分区表来实现日志表的自动随时间窗口滚动,即每天新增明天分区,并将7天前数据归档至日志表.以8月份为例子,当日日期为8号,流程如下图: 具体步骤: 1.建立32个文件组,32个数据库文件,对应于每月31天,每月对31个文件进

oracle 11g 分区表创建(自动按年分区)

前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不过得在创建表时就设置好分区. 如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了. 一.为什么要分区(Partition) 1.一般一张表超过2G的大小,ORACLE是推荐使用分区表的. 2.11g 中的分区表新特性:Partition