问:有一张大表,其中按时间字段(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分区表做跨分区查询的更多相关文章

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

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

  2. oracle分区表的使用和查询

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

  3. oracle使用dblink跨库查询的例子

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

  4. oracle 开发笔记“跨数据库查询复制”

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

  5. Oracle如何实现跨库查询

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

  6. Oracle如何实现跨数据库查询

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

  7. oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)

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

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

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

  9. ORACLE 分区表简介

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

随机推荐

  1. java 类从哪个jar包加载的

    <%@page contentType="text/html; charset=GBK"%><%@page import="java.security. ...

  2. 去掉VC2010 编辑器里出现的红色波浪线

    在VC2010中浏览代码的时候就大片的红线看着不舒服 其实不关VS的事,原因在于visual assist.   在VAssistX菜单栏->Visual Assist X Options-&g ...

  3. 阿里云ubuntu搭建SVN服务器

    系统:Ubuntu 14.04 64位 新手注意:连接到服务器之后,默认会在用户文件夹位置“~”,使用cd /命令可以回到根目录.SVN搭在公共的位置比较稳妥. 1.通过apt-get安装subver ...

  4. UpdatePanel中执行js

    在UpdatePanel中,直接使用Page.ClientScript.RegisterStartupScript的方式执行javascript,会导致无法执行.原因可能是因为RegisterStar ...

  5. 强大的数据恢复软件--EasyRecovery专业版

    EasyRecovery 是世界著名数据恢复公司 Ontrack 的技术杰作,它是一个威力非常强大的硬盘数据恢复工具.能够帮你恢复丢失的数据以及重建文件系统.EasyRecovery不会向你的原始驱动 ...

  6. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  7. 基于AngularJS/Ionic框架开发的性能优化

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  8. HTML5+J2EE实现文件异步上传

    P.S. HTML5经过了W3C的8年努力,终于正式推广了.这次升级最大的就是升级了XMLHTTPRequest,让它变成了XMLHTTPRequest Level II(这有啥奇怪的?).这个对象现 ...

  9. 3月3日[Go_deep]Populating Next Right Pointers in Each Node

    原题:Populating Next Right Pointers in Each Node 简单的链表二叉树增加Next节点信息,没什么坑.不过还是WA了两次,还是有点菜,继续做,另外leetcod ...

  10. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...