oracle分区表插⼊数据_Oracle数据库分区表整理笔记
关键词
partition 分区
subpartition 辅助分区
已经存在的表没有⽅法可以直接转化为分区表。
分区索引
⼀、分区表类型
1、范围分区
1-1、按指定要求划分
假设有⼀个CUSTOMER表,表中有数据200000⾏,我们将此表通过CUSTOMER_ID进⾏分区,每个分区存储100000⾏,我们将每个
分区保存到单独的表空间中,这样数据⽂件就可以跨越多个物理磁盘。
CREATE TABLE CUSTOMER ( CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,FIRST_NAME VARCHAR2(30) NOT NULL,LAST_NAME VARCHAR2
1-2、按时间划分
CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID      NUMBER(7) NOT NULL,    ORDER_DATE    DATE,    TOTAL_AMOUNT NUMBER,    CUSTOTM 1-3 MAXVALUE
CREATE TABLE RangeTable (  idd  INT PRIMARY KEY ,  iNAME VARCHAR(10),  grade INT ) PARTITION  BY  RANGE (grade) (      PARTITION  part1
2、哈希分区
对于那些⽆法有效划分范围的表,可以使⽤hash分区,这样对于提⾼性能还是会有⼀定的帮助。hash分区会将表中的数据平均分配到你指
定的⼏个分区中,列所在分区是依据分区列的hash值⾃动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可
以⽀持多个依赖列。
CREATE TABLE HASH_TABLE(COL NUMBER(8),INF VARCHAR2(100))PARTITION BY HASH (COL)(PARTITION PART01 TABLESPACE HASH_TS01,PA
3、列表分区
列表分区明确指定了根据某字段的某个具体值进⾏分区,⽽不是像范围分区那样根据字段的值范围来划分的。
create table graderecord  (    sno varchar2(10),    sname varchar2(20),    dormitory varchar2(3),    grade int  )  partition by list(dormitory)  (    partition d229以上根据宿舍来进⾏列表分区,插⼊与范围分区实验相同的数据,做查询如下:
select * from graderecord partition(d229); select * from graderecord partition(d228);  select * from graderecord partition(d240);
d229分区所得数据如下:
d228分区所得数据如下:
d240分区所得数据如下:
4、组合分区
如果某表按照某列分区之后,仍然较⼤,或者是⼀些其它的需求,还可以通过分区内再建⼦分区的⽅式将分区再分区,即组合分区的⽅式。在10g中组合分区有两种:range-hash,range-list。注意顺序,根分区只能是range分区,⼦分区可以是hash分区或list分区。表⾸先按
某列进⾏范围分区,然后再按某列进⾏列表分区,分区之中的分区被称为⼦分区。
4-1、基于范围分区和列表分区
CREATE TABLE SALES(PRODUCT_ID VARCHAR2(5),SALES_DATE DATE,SALES_COST NUMBER(10),STATUS VARCHAR2(20))PARTITION BY RANG
4-2、基于范围分区和散列分区
create table dinya_test(transaction_id number primary key,item_id number(8) not null,item_description varchar2(300),transaction_date date)partition by ra
⼆、分区表的⼀些操作语句
1、查看分区情况
select * from user_tab_partitions where table_name ='tableName';
2、查看分区数据
select * from tablename partiton(p1);
3、合并分区
合并分区是将相邻的分区合并成⼀个分区,结果分区将采⽤较⾼分区的界限,值得注意的是,不能将分
区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:
ALTER TABLE TABLENAME MERGE PARTITIONS P1,P2 INTO PARTITION P2;
4、修改分区
添加:alter table tablename add partition p4 values less than(value);
删除:alter table tablename drop partiton p4;
截断分区 截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。
oracle数据库怎么查询表
alter table tablename truncate partiton p2;
5、拆分分区
拆分分区将⼀个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进⾏拆分
ALTER TABLE TABLENAME SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION
P21,PARTITION P22);
6、可移动分区
alter table tablename enable row movement;
三、分区索引
1、 Locally partitioned index(局部分区索引)
Ⅰ:局部前缀索引:以分区键作为索引定义的第⼀列
Ⅱ:局部⾮前缀索引:分区键没有作为索引定义的第⼀列
create table local_index_example( id number(2), name varchar2(50), sex varchar2(10))partition by range (id)(  partition part_1 values less than (5),  partit 什么时候该使⽤前缀索引?什么时候该使⽤⾮前缀索引?
对于该使⽤前缀还是⾮前缀索引,这完全取决于你的实际需求,你应该尽量从实际⾓度出发选择合适的索引⽅式以充分利⽤到其分区消除的特性。
如果查询⾸先访问索引的话,它能否实现分区消除完全取决于查询中使⽤的谓词(即Where筛选条件);
⽐如⽤上⾯的 local_index_example 表举例,现有两个查询:
①: select … from local_index_example where id = :id and name = :name;
②: select … from local_index_example where name = :name;
对于以上两个查询来说,如果查询第⼀步是⾛索引的话,则:
局部前缀索引 local_prefixed_index 只对 ① 有⽤;
局部⾮前缀索引 local_nonprefixed_index 则对 ① 和 ② 均有⽤;
如果你有多个类似 ① 和 ② 的查询的话,则可以考虑建⽴局部⾮前缀索引;如果平常多使⽤查询 ① 的话,则可以考虑建⽴局部前缀索引;
总之,重点是你要尽可能保证查询包含的谓词允许索引分区消除
***延伸阅读:绑定变量(bind variable)***
绑定变量是查询中的⼀个占位符,形如 :xxx 。
例如,要获取 emp 表中 empno 为 123 的记录,你可以执⾏如下两种查询:
①: select * from emp where empno = 123;
②: 先将绑定变量 :empno 的值设置为 123,再执⾏查询
select * from emp where empno = :empno;
第⼀种查询使⽤了 123 这样⼀个直接量(常量),如果有多个这样的查询的话,则每⼀个查询对数据库来说都是⼀个全新的查询,Oracle每次都会对查询进⾏解析、限定(命名解析)、安全性检查、优化等(简单地讲,就是每次执⾏时都要先编译);
第⼆种查询使⽤了 :empno 这样⼀个绑定变量,变量值在查询时动态指定,这个查询只会在第⼀次时编译,随后Oracle会把查询计划存储
在⼀个共享池中⽅便以后重⽤,如此当以后再传⼊不同的 empno 值进⾏查询时,Oracle会直接调⽤第⼀次解析好的这个执⾏计划进⾏执⾏,这样查询效率将⼤幅提升
Oracle只保证索引分区内部的唯⼀性,跨分区的唯⼀性⽆法保证。
如果你想使⽤局部索引实现唯⼀性约束的话,则必须让分区键实现唯⼀性约束(UNIQUE 或 PRIMARY KEY)
2、Globally partitioned index(全局分区索引)
与局部索引不同,全局索引只有⼀类,即全局前缀索引(prefixed global index),索引分区键必须作为索引定义的第⼀列,否则执⾏会报
错。
--创建⽰例表,按id进⾏范围分区create table global_index_example( id number(2), name varchar2(50), age number(2))partition by range (id)(  partition part_1 va 全局索引要求最⾼分区(即最后⼀个分区)必须有⼀个值为 maxvalue 的最⼤上限值,这样可以确保底层表的所有⾏都能放在这个索引中;
⼀般情况下,⼤多数分区操作(如删除⼀个旧分区)都会使全局索引⽆效,除⾮重建全局索引,否则⽆法使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。