大数据应用 oracle大数据量表分区提示查询效率
沉沙 2018-09-28 来源 : 阅读 776 评论 0

摘要:本篇教程介绍了大数据应用 oracle大数据量表分区提示查询效率,希望阅读本篇文章以后大家有所收获,帮助大家对大数据云计算大数据应用的理解更加深入。

本篇教程介绍了大数据应用 oracle大数据量表分区提示查询效率,希望阅读本篇文章以后大家有所收获,帮助大家对大数据云计算大数据应用的理解更加深入。

<

现在有一张usertrack 日志记录表。每天会产生30万条数据。数据量大查询效率会非常慢
所以我考虑通过表分区来提示效率  逻辑上是一张表。但是分区后会按照分区条件将数据分在不同的物理文件
优点:
1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关,已经存在的表没有方法可以直接转化为分区表。
 
表分区主要分为 范围分区  列表分区  散列分区  组合范围散列分区  复合范围散列分区(这个大大的文章说的很详细://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html)
 
我的业务场景选择使用范围分区
因为分区表不能在已存在的表上创建 所以要备份数据删除原来的表 再重新创建这个表为分区表

--将数据备份到临时表
create table usertracktemp
as select * from  usertrack

 

--检查数据是否一致
select count(1) from usertracktemp
select count(1) from usertrack


--删除表
truncate table usertrack;  
drop table usertrack


--创建表同时创建分区
create table usertrack  
PARTITION BY RANGE(createtime)  
(  
 PARTITION  prot20151101 values LESS THAN (TO_DATE(‘2015-11-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20151201 values LESS THAN (TO_DATE(‘2015-12-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160201 values LESS THAN (TO_DATE(‘2016-02-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160301 values LESS THAN (TO_DATE(‘2016-03-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160401 values LESS THAN (TO_DATE(‘2016-04-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160501 values LESS THAN (TO_DATE(‘2016-05-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  protmaxt values less  THAN (maxvalue)
)  
as  
select  *
  from usertracktemp 

我可以明确数据在这个范围区间。。按每月来分区 所以是直接写死了。不能明确的话先创建分区表。 写个存储过程 时间分组。然后通过指针遍历 再在分区表上建立新的分区
常用的几个命令

 --查询指定分区的数据
select createtime from usertrack PARTITION(protmaxt)


--查询指定表下面的所有分区
select * from user_segments where segment_type=‘TABLE PARTITION‘ and segment_name=‘USERTRACK‘;

segment_name为表名 记得统一大写

--有maxvalue分区条件的时候创建分区语法
ALTER TABLE usertrackTest SPLIT PARTITION protmaxt AT (TO_DATE(‘2016-06-06 16:00:15‘,‘yyyy-mm-dd hh24:mi:ss‘)) INTO (PARTITION  part20160606, PARTITION protmaxt) UPDATE GLOBAL INDEXES


--没有maxvalue分区条件的时候
ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE(‘2003-06-01‘,‘YYYY-MM-DD‘)); 

这个时候我还要新建一个工作 每个月执行一次 创建新的分区。然后当前月产生的数据就插入到这个心的分区里面
新建一个每月执行一次的存储过程

create or replace procedure CreatePartition

as
--声明变量
 partitionName varchar(20);
 createSqlText varchar(300);
 partitionDate date;
begin
  partitionDate:=ADD_MONTHS(sysdate,1);
 partitionName:=‘part‘||to_char(partitionDate,‘yyyymmdd‘); 
 createSqlText:=‘ALTER TABLE usertrackTest SPLIT PARTITION protmaxt AT (TO_DATE(‘‘‘||to_char(partitionDate,‘yyyy-mm-dd hh24:mi:ss‘)||‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘)) INTO (PARTITION  ‘|| partitionName||‘, PARTITION protmaxt) UPDATE GLOBAL INDEXES‘;
  dbms_output.put_line(createSqlText);
 execute immediate createSqlText;
end;

新建一个工作

 
--查询工作select * from sys.user_jobs  
常用的时间间隔指令
1:每分钟执行
Interval => TRUNC(sysdate,‘mi‘) + 1/ (24*60)

Interval => sysdate+1/1440
2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)
3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,‘星期一‘))+1/24
4:每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),‘Q‘) + 1/24
6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,‘yyyy‘),6)+1/24
7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,‘yyyy‘),12)+1/24
性能测试
不加任何查询条件
使用了分区条件进行筛选

可以看出各项指标分区后的都优于没有分区的表    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据应用频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-IT技术咨询与就业发展一体化服务 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程