一.前言:

一开始分区表和位图索引怎么会挂钩呢?可能现实就是这么的不期而遇;比如说一张表的字段是年月日—‘yyyy-mm-dd’,重复率高吧,适合建位图索引吧,而且这张表数据量也不小,也适合转换成分区表吧!下面我来比较一下分区表和分区字段位图索引的性能!

二.实验

生产上的表结构以及索引:

create table LOT_WIN_RESULT_DETAIL
(
id INTEGER not null,
rpt_date DATE,
sys_game_level_code_id INTEGER,
game_desc VARCHAR2(50),
periods_no VARCHAR2(50),
start_tt VARCHAR2(10),
end_tt VARCHAR2(10),
ok_dtt VARCHAR2(10),
ok_ind CHAR(1),
open_code VARCHAR2(500),
remark VARCHAR2(50),
json_result VARCHAR2(4000),
getdata_dtt TIMESTAMP(6),
last_modfiy_user_id INTEGER,
last_modfiy_user_name VARCHAR2(50),
last_modfiy_dtt TIMESTAMP(6),
platform_ident VARCHAR2(45)
)
tablespace NB_TBS_YOBET
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 24M
next 1M
minextents 1
maxextents unlimited
);

-- Create/Recreate indexes
create bitmap index IX1_LOT_WIN_DTL on LOT_WIN_RESULT_DETAIL (PLATFORM_IDENT) tablespace NB_INX_TBS_YOBET
;
create index IX2_LOT_WIN_DTL on LOT_WIN_RESULT_DETAIL (SYS_GAME_LEVEL_CODE_ID, PERIODS_NO) tablespace NB_INX_TBS_YOBET
;
create bitmap index IX4_LOT_WIN_DTL on LOT_WIN_RESULT_DETAIL (RPT_DATE) tablespace NB_INX_TBS_YOBET
;
create index LX_LOT_WIN_RESULT_DETAIL_TIME on LOT_WIN_RESULT_DETAIL (GETDATA_DTT) tablespace NB_INX_TBS_YOBET
;
-- Create/Recreate primary, unique and foreign key constraints
alter table LOT_WIN_RESULT_DETAIL add constraint PK_LOT_WIN_RESULT_DETAIL primary key (ID) using index tablespace NB_TBS_YOBET
;

模拟建一张一模一样的分区表( LOT_WIN_RESULT_DETAIL_part),以rpt_date时间字段分区,且把数据量插入过来:

create table LOT_WIN_RESULT_DETAIL_part
(
id INTEGER not null,
rpt_date DATE,
sys_game_level_code_id INTEGER,
game_desc VARCHAR2(50),
periods_no VARCHAR2(50),
start_tt VARCHAR2(10),
end_tt VARCHAR2(10),
ok_dtt VARCHAR2(10),
ok_ind CHAR(1),
open_code VARCHAR2(500),
remark VARCHAR2(50),
json_result VARCHAR2(4000),
getdata_dtt TIMESTAMP(6),
last_modfiy_user_id INTEGER,
last_modfiy_user_name VARCHAR2(50),
last_modfiy_dtt TIMESTAMP(6),
platform_ident VARCHAR2(45)
)PARTITION BY RANGE(RPT_DATE) INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
(
PARTITION RPT_DATE_20191218 VALUES LESS THAN(TO_DATE('2019-12-19', 'YYYY-MM-DD'))
) tablespace NB_TBS_YOBET ;

create bitmap index IX1 on LOT_WIN_RESULT_DETAIL_part (PLATFORM_IDENT)
local tablespace NB_INX_TBS_YOBET
;
create index IX2 on LOT_WIN_RESULT_DETAIL_part (SYS_GAME_LEVEL_CODE_ID, PERIODS_NO)
local tablespace NB_INX_TBS_YOBET
;

create index LX3 on LOT_WIN_RESULT_DETAIL_part (GETDATA_DTT) lcoal tablespace NB_INX_TBS_YOBET
;
-- Create/Recreate primary, unique and foreign key constraints
alter table LOT_WIN_RESULT_DETAIL_part
add constraint PK_LOT_WIN_RESULT_DETAIL_p primary key (ID)
using index
tablespace NB_TBS_YOBET
;

insert into LOT_WIN_RESULT_DETAIL_part select * from LOT_WIN_RESULT_DETAIL;

数据库都是89万。

BEGIN
DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => 'RACTTFC',
TABNAME => 'LOT_WIN_RESULT_DETAIL_part',
CASCADE => TRUE);
END;
/

BEGIN
DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => 'RACTTFC',
TABNAME => 'LOT_WIN_RESULT_DETAIL_part',
CASCADE => TRUE);
END;
/

2.1 时间分区字段范围查询

语句如下:

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail a
where rpt_date >=
to_date('2019-12-23 00:00:00', 'yyyy-mm-dd HH24:mi:ss')
and rpt_date <=
to_date('2019-12-24 23:59:59', 'yyyy-mm-dd HH24:mi:ss')
and sys_game_level_code_id = 5827
and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

执行计划如下:

采用了bitmap 索引范围扫描,CPU成本3652;

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail_part a
where rpt_date >=
to_date('2019-12-23 00:00:00', 'yyyy-mm-dd HH24:mi:ss')
and rpt_date <=
to_date('2019-12-24 23:59:59', 'yyyy-mm-dd HH24:mi:ss')
and sys_game_level_code_id = 5827
and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

基于分区过略,且基数2881比2671大,最终消耗的成本1442比3652低的多,且最开始进行的分区表索引范围扫描成本105比非分区表的539 小的多。

2.2时间分区字段等值

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail a
where rpt_date =
to_date('2019-12-23', 'yyyy-mm-dd')
and sys_game_level_code_id = 5827

and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

单个值的查询的时候,bitmap没有进行范围扫描,进行了单个等值查询,通过索引范围扫描,然后再通过bimap索引转换成ROWID,最后通过又通过bitmap回表,CPU 耗费成本2515;

同理,换成分区表:

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail_part a
where rpt_date =
to_date('2019-12-23', 'yyyy-mm-dd')
and sys_game_level_code_id = 5827

and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

整个执行计划是走的单个分区,通过索引范围扫描,然后再通过bimap索引转换成ROWID,最后通过又通过bitmap回表,CPU 耗费成本763,远远小于2515,且单个的索引扫描51 远远小于上述的551索引范围扫描(这个是分区表利用本地索引的优势);

整个两次对比结果bitmap无论是在范围查询还是单个的等值查询都是完败。

2.3 分区表分区索引变成全局索引

drop index IX222;
create index IX222 on LOT_WIN_RESULT_DETAIL_part (SYS_GAME_LEVEL_CODE_ID, PERIODS_NO) tablespace NB_INX_TBS_YOBET;

BEGIN 
DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => 'RACTTFC', 
TABNAME => 'LOT_WIN_RESULT_DETAIL_part', 
CASCADE => TRUE); 
END; 
/

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail a
where rpt_date >=
to_date('2019-12-23 00:00:00', 'yyyy-mm-dd HH24:mi:ss')
and rpt_date <=
to_date('2019-12-24 23:59:59', 'yyyy-mm-dd HH24:mi:ss')
and sys_game_level_code_id = 5827
and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

分区范围内的全表扫描,并没有用到新建的哪个索引,CPU成本4587,远高于bitmap的3652;

单个值的查询:

select rpt_date,
periods_no,
open_code,
json_result,
remark,
ok_dtt as start_tt,
GAME_DESC,
rownums
from (select rpt_date,
periods_no,
a.open_code,
a.json_result,
a.remark,
a.ok_dtt,
a.GAME_DESC,
ROW_NUMBER() OVER(ORDER BY to_number(periods_no) desc) as rownums
from lot_win_result_detail_part a
where rpt_date =date'2019-12-23'
and sys_game_level_code_id = 5827
and ok_ind >= '1'
and PLATFORM_IDENT = 'af') a
where rownums <= 10
order by to_number(periods_no) desc;

同理一样的全局索引没有使用,2193和2515是一个数量级的,差距不是很明显。

三.结论

综上所述,bitmap 在进行等值与以及范围查询的时候,整个执行过程大致一样,但是,主要是分区表能够在分区范围内利用本地索引进行扫描(全局索引几乎是几个量级),非分区表没有这种优势;

索引在rang范围查询字段方面。建议使用分区加local 索引,会造成BITMAP INDEX RANGE SCAN并没有PARTITION RANGE ITERATOR 加local 索引高效。

Oracle分区表之分区范围扫描(PARTITION RANGE ITERATOR)与位图范围扫描(BITMAP INDEX RANGE SCAN)的更多相关文章

  1. 深入学习Oracle分区表及分区索引

    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Has ...

  2. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

  3. ORACLE分区表、分区索引详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...

  4. 【三思笔记】 全面学习Oracle分区表及分区索引

    [三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...

  5. 简单ORACLE分区表、分区索引

    前一段听说CSDN.COM里面很多好东西,同事建议看看合适自己也可以写一写,呵呵,今天第一次开通博客,随便写点东西,就以第一印象分区表简单写第一个吧. ORACLE对于分区表方式其实就是将表分段存储, ...

  6. 转:深入学习Oracle分区表及分区索引

    转自:http://database.ctocio.com.cn/tips/286/8104286.shtml 关于分区表和分区索引(About Partitioned Tables and Inde ...

  7. oracle分区表和分区索引概述

    ㈠ 分区表技术概述            ⑴ Range 分区            ① 例子                  create table t         (...列定义...)  ...

  8. Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态

    (一)问题: 最近在做Oracle数据清理,在对分区表进行数据清理时,采用的方法是drop partition,删除的过程中,没有遇到任何问题,大概过了10分钟,开发人员反馈部分分区表上的业务失败.具 ...

  9. oracle 分区表(子分区)收缩笔记

    思路1.首先移动子分区到别的表空间.2.收缩数据文件.3.再把子分区移回原表空间. ---------------------------------------------生成发送报告移动子分区语句 ...

随机推荐

  1. v-cloakd的应用场景和使用方法

    使用vue构建前端应用,加载应用后页面可能会出现闪烁: <div id="app" v-cloak> {{message}} </div> 例如上述场景,应 ...

  2. luoguP1541 乌龟棋 题解(NOIP2010)

    P1541 乌龟棋 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cma ...

  3. 淘汰赛制_NOI导刊2010提高(01)

    题目描述 淘汰赛制是一种极其残酷的比赛制度.2n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐.每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第 ...

  4. 常用Message Queue对比

    目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...

  5. Python 的PIL,可以解决ImportError The _imagingft C module is not installed

    删除PIL相关文件 mv PIL /tmp   pip install Pillow 安装Pillow后, 可能还会发生KeyError的错误, 检查项目源码后发现是 Image 模块的save函数中 ...

  6. rsync nfs 实时同步,结合实战

    目录 rsync nfs 实时同步,实战 一.部署rsync服务端(backup) 二.部署rsync客户端(nfs,web01) 三.部署web代码(web01) 四.NFS服务端部署(nfs) 五 ...

  7. linux文件管理--压缩打包

    目录 linux文件管理--压缩打包 1.压缩打包介绍 2.gzip压缩工具 3.zip压缩工具 注意: 4.tar压缩工具 5.tar生产案例实践 linux文件管理--压缩打包 1.压缩打包介绍 ...

  8. 运用pool进程池启动大量子进程

    # Pool进程池类 from multiprocessing import Pool import os import time import random def run(index): prin ...

  9. Delphi UTF编码 UTF8Encode、UTF8Decode、URLEncode、URLDecode

    一.URL简介    URL是网页的地址,比如 http://www.cnblogs.com.Web 浏览器通过 URL 从 web 服务器请求页面.    由于URL字符串常常会包含非ASCII字符 ...

  10. java SSLContext

    1. 什么是SSLSocket JDK文档指出,SSLSocket扩展Socket并提供使用SSL或TLS协议的安全套接字. 这种套接字是正常的流套接字,但是它们在基础网络传输协议(如TCP)上添加了 ...