为什么要创建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('','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('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
1 row inserted
SQL> insert into test_partion (p_day,words) values (to_date('','yyyyMMdd'),'');
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('','yyyyMMdd'),'');
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

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

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

  1. Oracle12c:创建主分区、子分区,实现自动分区插入效果

    单表自动单个分区字段使用方式,请参考:<Oracle12c:自动分区表> 两个分区字段时,必须一个主分区字段和一个子分区字段构成(以下代码测试是在oracle12.1版本): create ...

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

    环境为:Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 对象表为按天的自动分区表: PARTI ...

  3. VMWARE 虚拟机新增硬盘,格式化分区,并挂载

    VMWARE 虚拟机新增 硬盘 并挂载 一台虚拟机上安装ORACLE12c 需要分一块硬盘挂载数据文件 日志文件 以及归档文件 1. 关闭虚拟机 2. 编辑虚拟机设置 选择[编辑虚拟机设置]并打开,将 ...

  4. Oracle间隔(interval)分区

    (一)什么是间隔分区 间隔分区是Oracle 11.1引入的新功能,通过该功能,可以在输入相应分区的数据时自动创建相应的分区.在没有间隔分区技术之前,DBA通常会创建一个maxvalue分区以避免OR ...

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

    link:http://www.thxopen.com/linux/2014/03/30/Linux_parted.html 流程为:新建分区-->格式化分区-->挂载分区 首先弄明白分区 ...

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

    项目问题:有一张日志表,插入和查询为主,每天记录数据为200多万,大小为2G-4G之间.一开始开发人员使用delete语句手动删除,保留7天数据,经常造成阻塞和性能瓶颈.但是如果不删除数据随着表越来越 ...

  7. 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复

    1.虚拟机关机断电 2.添加硬盘 2.开机 3.fdisk -l查看刚才新添加的硬盘 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 2147483 ...

  8. Oracle12c中SQL性能优化(SQL TUNING)新特性之自动重优化(automatic reoptimization)

    Oracle12c中的自动重优化 Oracle12c中的自适应查询优化有一系列不同特点组成.像自适应计划(AdaptivePlans)功能可以在运行时修改执行计划,但并不允许计划中连接顺序的改变.自动 ...

  9. oracle 11g 分区表创建(自动按年、月、日分区)

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...

随机推荐

  1. 笔记:XML-解析文档-XPath 定位信息

    如果需要定位某个XML文档中的一段特定信息,那么通过遍历DOM 树的众多节点来进行行查找显得有些麻烦,XPath语言使得访问树节点变得很容易,例如,下面的XML文档结构: <?xml versi ...

  2. vue技术解析六之生命周期函数

  3. 基于hi-nginx的web开发(python篇)——使用jinja2模板引擎

    模板引擎的使用在web开发中是不可避免和必要的.hi.py框架使用jinja2作为模板引擎. 为了使用hi.py提供的jinja2引擎,首先需要引入它: from hi import hi,templ ...

  4. 关于JSP页面Property [ssid] not found on type [java.lang.String]错误的注意事项

    转发于:http://blog.csdn.net/w86440044/article/details/28277177

  5. 常见的链表排序(Java版)

    上篇博客中讲解了九大内部排序算法,部分算法还提供了代码实现,但是那些代码实现都是基于数组进行排序的,本篇博客就以链表排序实现几种常见的排序算法,以飨读者. 快速排序的链表实现 算法思想:对于一个链表, ...

  6. Python的几个小程序,其实我觉得可以称作初学时的基础算法

    昨天学习的,今天做一下整理,以前学过几天c,感觉什么都没有搞出来,有点泄气,看到Python后试试,从最基本的东西学起,希望不要辜负我的这一点热情. if语句的应用 n=1 while n<5: ...

  7. 如何在win10查看wifi密码

    tep1 找到wifi图标 step 2 右键点击打开网络共享中心 没有啦!!

  8. win10下NeuralStyle的tensorflow版实验

    ---恢复内容开始--- 首先配置win10下的tensorflow-gpu的运行环境,然后在github上将NeuralStyle拷贝下来,最后根据文档说明参数,运行文件,即可得到自己喜欢的styl ...

  9. python全栈学习--day9(函数初始)

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...

  10. 使用Java客户端操作elasticsearch

    Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...