百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Oracle数据库分区表整理笔记

moboyou 2025-03-03 11:09 36 浏览

关键词

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(30) NOT NULL,
TEL VARCHAR2(15) NOT NULL,
EMAIL VARCHAR2(80),
STATUS CHAR(1) )
PARTITION BY RANGE (CUSTOMER_ID) (
PARTITION CUS_PART1
VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
PARTITION CUS_PART2
VALUES LESS THAN (200000) TABLESPACE CUS_TS02 );

1-2、按时间划分

CREATE TABLE ORDER_ACTIVITIES
 (
 ORDER_ID      NUMBER(7) NOT NULL,
     ORDER_DATE    DATE,
     TOTAL_AMOUNT NUMBER,
     CUSTOTMER_ID NUMBER(7),
     PAID           CHAR(1)
 )
  PARTITION BY RANGE (ORDER_DATE)
 (
   PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')),
   PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) ,
   PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY'))
 );

1-3 MAXVALUE

CREATE TABLE RangeTable
 (
   idd   INT PRIMARY KEY ,
   iNAME VARCHAR(10),
   grade INT
 )
 PARTITION  BY  RANGE (grade)
 (
       PARTITION  part1 VALUES  LESS  THEN (1000) ,
       PARTITION  part2 VALUES  LESS  THEN (MAXVALUE)
 );

2、哈希分区

对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

CREATE TABLE HASH_TABLE
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(
PARTITION PART01 TABLESPACE HASH_TS01,
PARTITION PART02 TABLESPACE HASH_TS02,
PARTITION PART03 TABLESPACE HASH_TS03
);

3、列表分区

列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。

create table graderecord  
(  
  sno varchar2(10),  
  sname varchar2(20),  
  dormitory varchar2(3),  
  grade int  
)  
partition by list(dormitory)  
(  
  partition d229 values('229'),  
  partition d228 values('228'),  
  partition d240 values('240')  
)  ;

以上根据宿舍来进行列表分区,插入与范围分区实验相同的数据,做查询如下:

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 RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
(
PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
(
SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
(
SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
)
);

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 range(transaction_date)
subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
(
partition part_01 values less than(to_date(‘2006-01-01','yyyy-mm-dd')),
partition part_02 values less than(to_date(‘2010-01-01','yyyy-mm-dd')),
partition part_03 values less than(maxvalue)
);

二、分区表的一些操作语句

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;
截断分区 截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。
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),
  partition part_2 values less than (10)
)

--创建局部前缀索引;分区键(id)作为索引定义的第一列
create index local_prefixed_index on local_index_example (id, name) local;

--创建局部非前缀索引;分区键未作为索引定义的第一列
create index local_nonprefixed_index on local_index_example (name, id) local;

什么时候该使用前缀索引?什么时候该使用非前缀索引?

对于该使用前缀还是非前缀索引,这完全取决于你的实际需求,你应该尽量从实际角度出发选择合适的索引方式以充分利用到其分区消除的特性。

如果查询首先访问索引的话,它能否实现分区消除完全取决于查询中使用的谓词(即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 values less than (5),
  partition part_2 values less than (10)
)

--创建按age进行范围分区的全局分区索引
create index global_index on global_index_example(age) global

partition by range (age) 
(
  partition index_part_1 values less than (20),
  partition index_part_2 values less than (maxvalue)
)

全局索引要求最高分区(即最后一个分区)必须有一个值为 maxvalue 的最大上限值,这样可以确保底层表的所有行都能放在这个索引中;

一般情况下,大多数分区操作(如删除一个旧分区)都会使全局索引无效,除非重建全局索引,否则无法使用。

相关推荐

黄道十二宫杀手密码51年后被破解,来自两位程序员和数学家合作

杨净边策发自凹非寺量子位报道|公众号QbitAI黄道十二宫杀手(ZodiacKiller)可能是世界上最知名的高智商连环杀手,52年来从未被抓获。他的事迹已被改编成了多部好莱坞电影。△...

深入剖析MediaCodec解码器的基本原理及使用「建议新手收藏」

一,MediaCodec工作原理MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMu...

Retrofit WebService 实践

前言作为Android开发,平时和后端聊得最多的除了喝酒就是接口。常用语:Restful和WebService,前者现在聊得多,后者以前聊得多。默认含义分别为:Restful:HTTP协议...

建议收藏!175部4K UHD版本经典高分电影洗版参考目录(2015之前)

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:1L789近两年很多经典高分老电影陆续开始重制成4KUHD版本,虽然我早已将这些电影的BD蓝光版收入,但纠结一番后还是花了不少时间将其全部...

2 个月的面试亲身经历告诉大家,如何进入 BAT 等大厂?

这篇文章主要是从项目来讲的,所以,从以下几个方面展开。怎么介绍项目?怎么介绍项目难点与亮点?你负责的模块?怎么让面试官满意?怎么介绍项目?我在刚刚开始面试的时候,也遇到了这个问题,也是我第一个思考的问...

详解Android官推Kotlin-First的图片加载库

前言Coil是一个非常年轻的图片加载库,在2020年10月22日才发布了1.0.0版本,但却受到了Android官方的推广,在AndroidDevelopersBackst...

webview 渲染机制:硬件加速方式渲染的Android Web

webview渲染是什么?webview渲染是用于展现web页面的控件;webview可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于webview模式进行二次开发的w...

因为我对Handler的了解,居然直接给我加了5K

1Handler是什么?android提供的线程切换工具类。主要的作用是通过handler实现从子线程切换回主线程进行ui刷新操作。1.1为什么Handler能实现线程切换?在创建Handler的...

「经典总结」一个View,从无到有会走的三个流程,你知道吗?

前言一个View,从无到有会走三个流程,也就是老生常谈的measure,layout,draw三流程我们都知道Android视图是由一层一层构成的层级结构,直白点说,就是父View包含子View而子V...

这些垃圾代码是谁写的?哦,原来小丑竟是我自己

程序员是最喜欢自嘲、自黑的群体之一,比如他们常常称自己是“码农”、“程序猿”,再比如他们的工作明明是写代码、修Bug,也有人调侃说:“明明我们是修代码、写Bug!”本文整理了一些程序员“修代码、写...

手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇

/1前言/平时我们要下载图片,要要一个一个点击下载是不是觉得很麻烦?那有没有更加简便的方法呢?答案是肯定的,这里我们以天堂网为例,批量下载天堂网的图片。/2项目准备工作/首先我们第一步我们要安装...

音视频开发需要你懂得 ffmpeg 开源库的编码原理

引言音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,vps,startcode以及基本的工作原理,...

「8年老 Android 开发」最全最新 Android 面试题系列全家桶(带答案)

下面跟大家分享的这些面试题都是互联网大厂真实流出的面试内容,每个问题都附带完整详细的答案,不像网上的那些资料三教九流有的甚至还没答案,这些面试题我也是经过日积月累才整理出来的精品资料。这些面试题主要是...

手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇

/1前言/上篇文章手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇我们谈及了天堂网站图片抓取的理论,这篇文章将针对上篇文章的未尽事宜进行完善,完成图片的批量抓取。/2图片网址解...

PHP 8.1.9 更新发布

CLI:修复了内置服务器通过PHP_CLI_server_WORKERS环境变量的潜在溢出。修正了GH-8952(不再可能有意关闭std句柄)。Core:修复了GH-8923的错误(Windows上的...