转 xiewmang 新浪博客

本文主要介绍了Oracle数据货场中的三种优化:对分区的优化、维度优化和物化视图的优化,并给出了详细的优化代码,希望对您有所帮助。

我们在做数据库的项目时,对数据货场的优化,大约的原理只有两个:一是数据分块储藏,便于数据的转储和管教;二是其中处理,长进数据供给的速度。本文主要介绍了Oracle数据货场中的三种优化:对分区的优化、维度优化和物化视图的优化,基上面两个大约的原理,借助于数据货场的观念,罗列数据库的优化措施:
1.分区
在数据货场中,事实表,索引表,维度表分处于三个不同的表空间其中(在安排的时候,良好是安排到不同的磁盘上)。这么子做的起因即便便于并发垄断,其实数据货场和等闲的数据库之间未曾严厉的界限,重要还是安排上,当然oracle本身会为数据货场中的“事实表”生成“知识库”等垄断,保证更快的数据供给效率,其实能够借助于job和表面过程来调动存储过程告终。基于这个思路,本项目数据库中的索引将和事实表离别维护,当然这称不上分区()。恳挚的分区是指下面的内容。
分区即便partition/subpartition,对于事实表本身来说,以月为单位作partition挂载到不同表空间上。翔实的示例如下:

  1. create table T_LOGNODE_RECORD
  2. (
  3. ……
  4. CALLIN_HH NUMBER(2) not null,
  5. CALLIN_DD NUMBER(2) not null,
  6. CALLIN_MONTH NUMBER(2) not null,
  7. CALLIN_YEAR NUMBER(4) not null,
  8. MONTH_MOD NUMBER(1) not null
  9. )
  10. PARTITION BY LIST (MONTH_MOD)
  11. (
  12. PARTITION P0 VALUES (0) TABLESPACE TS0,
  13. PARTITION P1 VALUES (1) TABLESPACE TS1,
  14. PARTITION P2 VALUES (DEFAULT) TABLESPACE TS2
  15. );

上述的代码中以MONTH_MOD字段作为分区规范,将T_LOGNODE_RECORD分到三个不同的表空间(TS0,TS1,TS2)中,这里有一个技巧,MONTH_MOD = 月份mod3,这么子能够无须要人工的维护哪个月分入哪个分区。当然容易的以月作为分区尔后,对于我们目前的数据库来说还是远远不够的,因为即便是一个月的数据依旧是很宏伟的,那么必需我们做SUBPARTITION,做法的示例为:

  1. create table T_LOGNODE_RECORD
  2. (
  3. ……
  4. CALLIN_DD NUMBER(2) not null,
  5. MONTH_MOD NUMBER(1) not null
  6. )
  7. PARTITION BY RANGE(MONTH_MOD)
  8. SUBPARTITION BY LIST(CALLIN_DD)
  9. SUBPARTITION TEMPLATE
  10. (
  11. SUBPARTITION SUBP1 values (1),
  12. SUBPARTITION SUBP2 values (2),
  13. SUBPARTITION SUBP3 values (3)
  14. )
  15. (
  16. PARTITION P0 VALUES less than (1),
  17. PARTITION P1 VALUES less than (2),
  18. PARTITION P2 VALUES less than (3)
  19. );

分区措施有三种:RANGE(范围),LIST(列表分区),HASH(哈希分区),必需解释的HASH分区,是oracle调用内置的hash函数来告终对数据的平衡散布,保证分区内部的数据量雷同,因而只必需制订分区的数量即可。
对于复合分区来说。不是所有分区款式都能够嵌套的,oracle只扶持范围列表分区,范围哈希分区,尤其的范围分区能够扶持多个字段range by(field1,field2)。对于本项目管用到的分区措施,只有示例中给出的两种,至于分区的利益,请察看google,^_^。给出垄断的sql示例如下:

  1. select * from T_LOGNODE_RECORD partition(P0)
  2. update T_LOGNODE_RECORD partition(P0) t set……

insert语句未曾波及。当然上述的垄断能够像等闲的Sql语句一样,不指定分区也能够举行,但在查询的时候请尽量能确定分区和子分区subpartition,这么子会让查询的速度长进百倍。能够剔除指定的分区drop可能truncate, EXPORT和IMPORT分区中数据,然而当举行分区的剔除垄断的时候,会使大局的索引(index)实效,必需重兴发生。
2.维度
Dimension这个算是oracle的进阶功能了,在PLSQL Developer未曾措施找到这个对象(然而能够厉行语句来生成该对象,然而无法举行后期的维护),只能在Toad中有它的身影。它是阐明数据维度字段之间的大小联系。标兵的慷慨是下面的年月日了。

  1. create table DIM_TIME
  2. (
  3. D_YEAR VARCHAR2(4) not null,
  4. D_QUATER VARCHAR2(2) not null,
  5. D_MONTH VARCHAR2(2) not null,
  6. D_DAY DATE not null
  7. )
  8. CREATE DIMENSION DIM_TIME
  9. LEVEL YEAR IS (DIM_TIME.D_YEAR)
  10. LEVEL QUATER IS (DIM_TIME.D_QUATER)
  11. LEVEL MONTH IS (DIM_TIME.D_MONTH)
  12. LEVEL DAY IS (DIM_TIME.D_DAY)
  13. HIERARCHY Y_Q_M_D
  14. (
  15. DAY CHILD OF
  16. MONTH CHILD OF
  17. QUATER CHILD OF YEAR
  18. )
  19. HIERARCHY Y_M_D
  20. (
  21. DAY CHILD OF
  22. MONTH CHILD OF YEAR
  23. )

发生了两条继承联系Y_Q_M_D和Y_M_D。当DIM_TIME本身的普查,以及与其他表作联合查询然后汇总时,月的汇总数据积极以日汇总的数据为基础,这么子大大长进数据汇总的速度。
可感受一张表发生多个维度表,一个维度中能够有多个继承联系。维度极大程度上长进了数据汇总的速度,使我们这个项目标数据普查分析的利器。
3.  物化视图(快照)
物化视图MATERIALIZED VIEW。划算开心的是PLSQL Developer和Toad上同时具有了这个对象的存在(Toad上可能将这个称为快照snapshots),然而令人烦闷的事情发生了,在PLSQL Developer上写成的MATERIALIZED VIEW在Toad中无法分辨,看来还要两个都用能力够。
物化视图,望文生义具有视图的属性,它是发生在切实表的基础上,将切实表中的数据笼统揭示,甚至创立的措施都几乎一样。然而它成为物化,就意味着它是实体对象,从某种含义上将,它更像一个其中表,能够像表格一样直接查询其中的数据(甚至就在table列表中能够看到它),然而它不但仅是其中表,因为它能够波及原始表的数据,并且oracle能够积极将针对原始表的查询汇总语句直接重定向到物化视图上,来晋级查询的速度。

  1. CREATE MATERIALIZED VIEW MV_LOG_RECORD
  2. REFRESH FORCE
  3. ON DEMAND
  4. ENABLE QUERY REWRITE
  5. AS
  6. SELECT tcmy8.com. NODE_ID, Count(*) as Call_Times
  7. from T_LOGNODE_RECORD t
  8. GROUP BY t. T_LOGNODE_RECORD

上面的SQL语句就曾经在T_LOGNODE_RECORD表上发生一个物化视图。REFRESH的参数 FORCE表示迫使刷新,还能够抉择的参数有fast和complete两种,fast是最快的刷新措施,表示增量刷新(要做到增量刷新,定然在物化视图中包括单一性的标明的字符,如主键和rowid等,当然即便包括了也无须定能够做到迅速刷新,因为我们项目中未曾波及到要刷新的物化视图,在此就不多言了);complete表示全面的数据刷新,重新生成物化视图;force是抉择性的刷新,依据切实的情形来抉择是force还是complete。
ON DEMAND表示刷新引发的条件。上面的物化视图只有在用户发动查询哀求时,才会去刷新数据,即刻原始表中的数据取到物化视图的表中。还有一种措施即便 ON COMMIT,当用户垄断原始数据时,就刷新对应的物化视图,这种措施合乎对于及时性要求高的项目。万一必需做定时的刷新,即将用到下面的措施lr.lrheicha.com:
REFRESH FAST START WITH SYSDATE
NEXT SYSDATE + 1/48。
物化视图是能够横亘多个表的,也能够直接的查询物化试图,例如你能够:
Select * from MV_LOG_RECORD.

归纳
在上述的三种措施中,属于数据库功能优化的重要手段,当然还有许多能够做的细节的优化,例如尽量不要在你要查询的字段上面批准为空,尽量将联合查询的联系扼制为number型等等。
对了,万一做了维度表,做了物化试图,你去查询原始表的时候速度定然会添置么?答案是“不”,你要做的一个重要的事情,即便告诉oracle,它能够积极的优化查询,语句如下:

  1. ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
  2. ALTER SESSION SET QUERY_REWRITE_INTEGRITY=TRUSTED;

关于Oracle数据货场中三种优化的知识就介绍到这里了,希望能够带给您一些收获,谢谢!

转载于:https://www.cnblogs.com/fkissx/p/5765803.html

详解Oracle数据货场中三种优化:分区、维度和物化视图相关推荐

  1. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  2. html正方形边框,详解HTML设置边框的三种方式

    HTML设置边框的三种方式 border-width: 1px 2px 2px; border-style: solid dashed dotted; border-color:red green b ...

  3. python可以播放音乐吗_详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  4. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

  5. 详解mysql备份恢复的三种实现方式

    一.Mysql备份策略: 完整备份: 完整备份就是指对某一个时间点上的所有数据或应用进行的一个完整拷贝,对数据量大的,备份时间较长,当然数据在恢复的时候快. 增量备份: 备份自上一次备份(包括完整备份 ...

  6. java全局异常处理_详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  7. oracle重做日志详解,oracle数据文件、控制文件、重做日志文件详解

    什么是数据文件.控制文件.重做日志文件? 首先从Oracle的官方文档里摘录下面内容: The following sections explain the physical database str ...

  8. 详解C#实例化对象的三种方式及性能对比

    前言 做项目过程中有个需求要实例化两万个对象并添加到List 中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例 ...

  9. python学习音频-详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  10. 数学建模matlab 优化模型,数学建模实验中三种优化模型的分析

    1. 引言 在20世纪中期,数学建模 [1] 就在欧美国度首次被发现,而在中国的呈现稍晚些,但是大约在80年代初始咱们国家也就有了.它的核心即是创立数学模型 [2] ,使得问题获得最优化的解决.而数学 ...

最新文章

  1. cv2.fillConvexPoly填充多边形
  2. 既然安卓是开源的 为何华为要 鸿蒙,安卓靠开源、免费赢得了天下,现在华为鸿蒙也是开源免费的! - 区块网...
  3. 【Python小程序】必备软件系列之文字识别提取,前台再也不同担心纸质转电子文件啦~
  4. k8s Service之Headless Service
  5. 面试官问你“有什么问题问我吗?”,你该如何回答?
  6. modernizr.js的介绍和使用
  7. c语言 函数的参数传递示例_C-用户定义的函数示例,没有参数,没有返回类型...
  8. soap和web services
  9. HDU4681 String(dp)
  10. mysql in 临时表_什么时候会用到临时表?MySQL临时表的使用总结
  11. KVM通过qemu实现USB重定向
  12. 计算机科学有科研,计算机科学领域科研合著网演化分析
  13. 软考中级软件设计师易错点整理
  14. Java 首字母转大写,StringUtils.capitalize
  15. 多线程编写12306售票系统
  16. 迪拜“烧掉800亿”造了座烂尾岛,奇葩建筑惊呆网友:有钱人的世界,我不懂!
  17. 5.3 定积分的换元积分法和分部积分法
  18. Windows桌面下面任务栏无法点击(卡住)的解决办法
  19. [share]深入探讨PHP中的内存管理问题
  20. Linux 线程结束的善后处理

热门文章

  1. d2rq java,知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)...
  2. 【李宏毅机器学习】03:误差Error
  3. Presto数组函数
  4. java 获取及修改系统变量
  5. Nginx静态资源POST请求返回405状态
  6. JVM运行时的内存结构
  7. centos 6.2   为mysql5.6.10安装 HandlerSocket插件
  8. k8s的Pod状态和生命周期管理
  9. sqlserver 列出表字段和字段说明
  10. SQL语法--DML