oracle 跨分区查询效率,Oracle分区表做跨分区查询

问:有一张大表,其中按时间字段(TIME_ID)进行表分区(按季度分区),但是如果业务人员做跨季度的大批量数据的查询时,未能走TIME_ID分区索引,导致全表扫描。此种情况该如何处理?

示例解析:

1、我们根据oracle中sh用户自带的SALES表创建一个新的分区表(TIME_ID上建季度分区;插入一个新的字段CREATE_ID,上面不建分区),步骤如下:

create table SALES_1998_part

(

PROD_ID       NUMBER not null,

CUST_ID       NUMBER not null,

TIME_ID       DATE not null,

CREATE_ID     DATE not null

)

partition by range (TIME_ID)

(

partition SALES_Q1_1998 values less than (TO_DATE(' 1998-04-01', 'SYYYY-MM-DD'))

tablespace EXAMPLE

pctfree 0

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

),

partition SALES_Q2_1998 values less than (TO_DATE(' 1998-07-01', 'SYYYY-MM-DD'))

tablespace EXAMPLE

pctfree 0

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

),

partition SALES_Q3_1998 values less than (TO_DATE(' 1998-10-01', 'SYYYY-MM-DD'))

tablespace EXAMPLE

pctfree 0

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

),

partition SALES_Q4_1998 values less than (TO_DATE(' 1999-01-01', 'SYYYY-MM-DD'))

tablespace EXAMPLE

pctfree 0

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

)

);

2、向sales_1998_part表中插入值,CREATE_ID的值来处于sales表的TIME_ID值。

insert into sales_1998_part(PROD_ID,CUST_ID,TIME_ID,CREATE_ID)

select PROD_ID,CUST_ID,TIME_ID,TIME_ID from sales

where time_id >= TO_DATE(' 1998-01-01', 'SYYYY-MM-DD')

and time_id < TO_DATE(' 1999-01-01', 'SYYYY-MM-DD');

commit;

select count(*) from sales_1998_part;

3、查询,查看执行计划

1) 使用分区键检索(使用分区键进行索引,会自动在数据存在的区进行检索。因为开始区为2,结束区为3。)

select * from sales_1998_part where TIME_ID >= TO_DATE(' 1998-04-01', 'SYYYY-MM-DD')

and TIME_ID <= TO_DATE(' 1998-10-01', 'SYYYY-MM-DD');

----------------------------------------------------------------------------

| Id  | Operation                | Name            | Rows  | Pstart| Pstop |

----------------------------------------------------------------------------

|   0 | SELECT STATEMENT         |                 | 83425 |       |    |

|   1 |  PARTITION RANGE ITERATOR|                 | 83425 |     2 |  3 |

|*  2 |   TABLE ACCESS FULL      | SALES_1998_PART | 83425 |     2 |  3 |

----------------------------------------------------------------------------

2) 不使用分区键检索(没有使用分区键进行检索,那么则会查询全部的表分区。因为要查询的数据就在2和3分区上,其它的分区数据也被读取了,增大了数据库压力,效率低下。)

select * from sales_1998_part where CREATE_ID >= TO_DATE(' 1998-04-01', 'SYYYY-MM-DD')

and CREATE_ID <= TO_DATE(' 1998-10-01', 'SYYYY-MM-DD');

-----------------------------------------------------------------------

| Id  | Operation           | Name            | Rows  | Pstart| Pstop |

-----------------------------------------------------------------------

|   0 | SELECT STATEMENT    |                 | 86662 |       |       |

|   1 |  PARTITION RANGE ALL|                 | 86662 |     1 |     4 |

|*  2 |   TABLE ACCESS FULL | SALES_1998_PART | 86662 |     1 |     4 |

-----------------------------------------------------------------------

oracle分区表的使用和查询

本文参考了 https://blog.csdn.net/mzglzzc/article/details/46300645 一  创建和使用分区表 1.范围分区(RANGE)范围分区将数据基于范围映射到 ...

oracle使用dblink跨库查询的例子

本文介绍了oracle数据库使用dblink进行跨库查询的方法,oracle dblink跨库查询教程,需要的朋友参考下.   oracle dblink跨库查询 方法一:首先,创建数据库链接: 复制 ...

oracle 开发笔记&OpenCurlyDoubleQuote;跨数据库查询复制”

1.方法一:创建DBL(data base link) CREATE PUBLIC DATABASE LINK 数据链名称 CONNECT TO 登陆用户名 IDENTIFIED BY 密码 USIN ...

Oracle如何实现跨库查询

实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中. 二. 实现方法步骤: 1. 创建存储 ...

Oracle如何实现跨数据库查询

转发:http://www.linuxidc.com/Linux/2012-02/53974.htm 实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库, ...

oracle表空间表分区详解及oracle表分区查询使用方法&lpar;转&plus;整理&rpar;

欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

oracle表分区的,分区操作,分区查询,子分区查询

一.摘要 有关表分区的一些维护性操作: 注:分区根据具体情况选择. 表分区有以下优点: 1.数据查询:数据被存储到多个文件上,减少了I/O负载,查询速度提高. 2.数据修剪:保存历史数据非常的理想. ...

ORACLE 分区表简介

参考链接:http://blog.csdn.net/ziwen00/article/details/9158725ORACLE-分区表 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分 ...

oracle分区表(整理)

Oracle 表分区 早在8.0.5版本中,Oracle就将范围分区技术引入,现在分区功能已经越来越强大,包括支持扩展分区功能.Interval分区.外键分区.模拟列分区.以及分区建议器等.那么,分区 ...

随机推荐

SQL2043N 与 linux的randomize&lowbar;va&lowbar;space特性

自从数据库服务器从redhat4.6升级到redhat5.5之后,在使用TSM备份的时候偶尔会出现SQL2043N  查看错误: [db2inst1@limt ~]$ db2 ? SQL2043N S ...

Vi问题

,ubuntu11.10下vi编辑器按i,左下方没有出现“输入模式”或者“insert”.在桌面环境下,用ctrl+alt+t调出命令行打开是这样,在第一控制台ctrl+alt+F1下打开,也是这样, ...

J2EE中你必须了解的13种技术规范

1)JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据 ...

shell脚本监控目录下文件被篡改时报警

思路: 目录下文件被篡改的几种可能: 1.被修改 2.被删除 3.新增文件 md5命令详解 参数: -b 以二进制模式读入文件内容 -t 以文本模式读入文件内容 -c 根据已生成的md5值,对现存文件 ...

webpack dev server 配置 启动项目报错Error&colon; listen EADDRINUSE

Error: listen EADDRINUSE 0.0.0.0:5601 它的意思是,端口5601被其他进程占用. 切换端口即可解决问题

使用CSS定位元素实现水平垂直居中效果

总结一下平时使用CSS技巧使元素达到水平居中效果 相对定位(或绝对定位)实现水平垂直居中: element{ position:relative; /*这个属性也可以是absolute*/ width ...

sublime同步文件与siderbar

有时候,打开了sider bar,想和Eclipse.idea一样,每打开一个tab,就可以在左侧的sider bar 目录上面看到我当前的位置,于是找到了一个插件. SyncedSideBar 安装 ...

Trailing Zeroes &lpar;II&rpar; LightOJ - 1090(预处理&plus;前缀和)

求C(n,r)*p^q的后缀零 考虑一下 是不是就是求 10^k*m  的k的最大值 而10又是由2 和 5 组成  所以即是求 2^k1 * 5^k2 * m1 中k1和k2小的那一个数 短板效应嘛 ...

实战MEF(1)一种不错的扩展方式

在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...

&lbrack;Done&rsqb;&lbrack;DUBBO&rsqb; dubbo Thread pool is EXHAUSTED&excl;

异常信息: com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.disp ...

posted @ 2021-05-19 23:34  abcdefghijklmnop  阅读(1556)  评论(0编辑  收藏  举报