oracle分区技术提高查询效率

概述:

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

下面介绍如何使用分区增加查询效率

range分区:就是区域分区

CREATE TABLE SALE
(
    PRODUCT_ID VARCHAR2(5),
    SALE_COUNT NUMBER(10,2)
)
PARTITION BY RANGE (SALE_COUNT)
(
    PARTITION P1 VALUES LESS THAN (1000) TABLESPACE CUS_TS01,
    PARTITION P2 VALUES LESS THAN (2000) TABLESPACE CUS_TS02
)

查看分区语法:

  select * from user_tab_partitions;  --查询所有分区情况,可以接条件where table_name=‘sale‘查看分区表结构

  select * from sale partition(p1);  --查询某表的某一分区数据

分区后,新增数据的SALE_COUNT字段如果小于1000就存储到P1分区中,如果1000到2000存储到P2分区中。

但是这时如果我们新增的一条数据的SALE_COUNT字段值大于2000,将无法存储到表中。

我们可以扩展分区,语法如下:

  alter table sale add partition p4 values less than(maxvalue); --大于2000的都会存到此分区中,当然也可以增加更多的分区

同时可以删除分区,语法如下:

  alter table sale drop partition p4; --注意:删除分区会把分区内已有的数据同时删除

但还存在一个问题,如果现在update分区p1中的SALE_COUNT值为1500,是不会成功的,需要在update前增加以下语句:

  alter table sale enable row movement; --使其row能移动

这样再update就可以成功了

分区索引

分区之后虽然可以提高查询的效率,但也仅仅是提高了数据的范围,所以我们在有必要的情况下,需要建立分区索引,从而进一步提高效率。

分区索引大体上分为两大类,一类叫做local,一类叫做global。

local:在每个分区上建立索引(一般采用这种方式)

global:一种在全局上建立索引,这种方式分不分区都一样,一般不使用

下面进行语法演示:

注意:分区上建立的索引一定是分区字段

create index idx_count on sale(sale_count) local;--建立分区索引,在sale表的每个分区都建立了索引

select * from user_ind_partitions;--查询所有分区索引情况

全局索引global写法就是把上面的local替换成global,但不会使用

有些时候,如果你分区分为0~1000,1000~2000,这时如果说0~1500这个范围内的数据会被频繁查询,1500之后查询很少,那么就可以使用这种自定义的全局索引方式对0~1500建立索引,之后的设置maxvalue即可,语法与分区语法相似

global自定义全局索引方式(前缀索引):

create index idxname on table(field) global

  partition by range(field) 

  (

    partition p1 values less than(value),  .......

    partition pN values less than(maxvalue)

  );

其他分区介绍

1.hash分区

hash分区实现均匀的负载值分配,增加hash分区可以重新分布数据,简单理解就是分区直接平均分配

CREATE TABLE SALE
(
    PRODUCT_ID VARCHAR2(5),
    SALE_COUNT NUMBER(10,2)
)
PARTITION BY HASH (PRODUCT_ID)
(
    PARTITION P1,
    PARTITION P2
)

2.list分区

该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

CREATE  TABLE  ListTable
(
    id    INT  PRIMARY  KEY ,
    name  VARCHAR (20),
    area  VARCHAR (10)
)
PARTITION  BY  LIST (area)
(
    PARTITION  part1 VALUES (‘guangdong‘,‘beijing‘) TABLESPACE  Part1_tb,
    PARTITION  part2 VALUES (‘shanghai‘,‘nanjing‘)  TABLESPACE  Part2_tb
);

3.复合分区(用的不多)

create table student(
    sno number,
    sname varchar2(10)
)
partition by range (sno)
subpartition by hash (sname)
subpartitions 4
(
    partition p1 values less than(1000),
    partition p2 values less than(2000),
    partition p3 values less than(maxvalue)
);

复合分区首先大体上分为三个分区p1,p2,p3,然后每一个分区内部再进行hash分区,分为4份

查询子分区的语句:select * from user_tab_subpartitions where table_name=‘student‘;

4.间隔分区(工作中常用)

是一种分区自动化的分区,可以指定时间间隔进行分区,这是oracle11g的新特性,实际工作中很常用。实际上是由range分区引申的,最终实现了range分区的自动化

create table interval_sale
(sid int,sdate timestamp)
partition by range(sdate)
interval (numtoyminterval(1,‘MONTH‘))
(
partition p1 values less than (TIMESTAMP ‘2017-11-12 00:00:00.00‘)
)

指定时间之前建立一个分区,之后每隔一个月建立一个分区

问题:如果我们drop掉了表,那么这个表的分区还存在吗?

答案是存在的,oracle提供了很强大的数据恢复功能,有一个类似回收站的机制,删除表后,分区以特殊的形式仍然存在user_tab_partitions中,使用purge recyclebin语法后,会清空回收站,使用flashback table 表名 to before drop语句可以恢复删除的表。

时间: 2024-10-17 10:07:54

oracle分区技术提高查询效率的相关文章

oracle提高查询效率的34条方法

注:本文来源:远方的守望者  <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是

数据库建索引提高查询效率

1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个未索引的表t1.t2.t3,分别只包含列c1.c2.c3,每个表分别含有1000行数据组成,指为1-1000的数值,查找对应值相等行的查询如下所示. SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3 此查询结果应该为1000行,每行包含3个相

Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回的文档打分都为1.0并没有提高查询效率,因此查资料发现可以用Filter实现跳过打分,其中又以 FieldCacheTermsFilter为最佳,其缓存机制给查询的速度提升极为明显.后面有空的时候给出完整实现,这两天略忙. 核心代码: Query query = new TermQuery(new

在一个千万级的数据库查寻中,如何提高查询效率?

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面:  a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

柯南君 :Oracle 分区技术 之 如何支撑大数据操作?

前段时间,看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于<大批量数据处理技术的演讲>视频,感觉受益良多,结合多年的知识积累,柯南君给大家分享一下: 交流内容: 一.Oracle的分区技术 (一)分区技术内容 1. 什么是分区? 分区就是将一个非常大的table或者index 按照某一列的值,分解为更小的,易于管理的逻辑片段---分区.将表或者索引分区不会影响SQL语句以及DML(见备注)语句,就和使用非分区表一样,每个分区拥有自己的segment(见备注),因为,DDL(

“六神”——技术提高开发效率的一个方案

这个方案并不是我在系统设计方面的最早一次尝试.但它在提高开发效率方面,是效果最为显著的一个方案. 简介 "六神"框架提供了一套简单而通用的.从Web层到数据库操作(增加单个数据.删除单个数据.修改单个数据.查询单个数据.查分页列表.查不分页列表,六个操作,因此名为"六神")的基础组件.并且,它为复杂的数据库操作留下了扩展点. 在当时的技术背景下,这套框架使用Struts2.0+Spring+myBatis来实现.但是它的设计思路是可以适用于其它技术的. 在应用了这套

我对oracle分区技术的学习

分区技术纷繁复杂,从11g以后有更多的分区方式,但是在考虑使用分区之前要想好是否需要历史数据清理. 比如罗敏的<品悟性能优化>书中P138那个案例.如果使用命名方式分区,那么以后清理历史数据无法根据分区特性进行清理,原因在于可能同一个名字的分区中包含好几年的数据. Oracle 分区表简单而言就是将一张大表按一定规则分为物理上的很多小表,而逻辑上仍然维持为一张大表.对应用是透明的. 分区索引分为以下几种情况 ·        表和索引都不分区 ·        表分区,索引没分区 ·     

关于oracle分区技术--初了解

一.  分区类型 1. 范围分区(Range Partitioning) 适用于  连续/按时间排序的数据 2. 散列分区(Hash Partitioning) 适用于  不连续/数据记录固定的数据 3. 组合分区 Range-Hash Range-List 4. 列表分区 List Partitioning 适用于对不连续域的数据分区 更准确的控制数据的分区存储 适用于 位置类数据 二.  分区表的维护 准备工作 [email protected]>create tablespace sale