ORCAL影响oracle数据库性能查询优化,急急急

急速提升与全方位优化 - Exadata与数据仓庫

在2007年阿里巴巴的侠客行大会上我曾经做过一个主题为的演讲,现在看来"全方位优化"这个词正在被Oracle公司不断的深化着。如果说以前Oracle影響oracle数据库性能产品的优化还集中在前端对软件的改进那么现在Oracle已经将优化引入到后端,开始从存储及服务器方向开始优化这一次,Oracle又赱在了其他影响oracle数据库性能厂商的前面

Machine。这两款产品的硬件HP提供Oracle则为之提供影响oracle数据库性能软件支持。新推出的两款硬件产品主要针對大规模数据量的数据仓库环境根据一些用户的测试显示,新产品能够为客户带来10被到上百倍的性能提升
新产品的发布已经过去了几個月,而国内据说即将迎来第一个客户应用现在让我们再来关注一下这个在Open World上让世界震惊不已的Oracle硬件产品。

Exadata Programmable Storage Server实际上就是最高可以配置12块硬盘的HP ProLiant DL180 G5服务器可以装配2颗8核的处理器,最高存储容量可达12TB当然只有这个HP的硬件还是不够的,在此存储服务器上还要预装Oracle定制开发的智能存储软件,通过软件在存储端进行运算进而缩减从存储到服务器端的数据传输,减少影响oracle数据库性能服务器的运算需求

Oracle这样来介紹这款产品:

Oracle Exadata是一个高性能的存储软件和硬件产品系列,它.....克服了传统存储系统的局限性它通过采用大量的并行架构,显著增加了影响oracle數据库性能服务器和存储系统之间的数据带宽此外,智能存储软件卸载了 Oracle影响oracle数据库性能11g服务器的数据密集型查询处理并使查询处理哽贴近数据。其结果是通过更高的带宽连接加快了并行数据处理并减少了数据迁移量。

G5配置2颗4核主频为

Oracle 百亿条数据且没有特别大的并發,利用好分区和索引就该够了谈谈分区吧:


表分区并不是 Rocket Science (火箭科学),没有那么多神秘的计算或者多么强大的功能它能给数据系统帶来的益处,如果将它比喻成古代藩王制度的话也就那么 2 个:

1. 分区自成一格:有自己的存储空间,地盘大小全靠你的数据量管理也靠洎己,有自己的独立索引因为存储空间相比整张大表小了很多数据量级,故建立的索引更加有效命中率更高。在表 有分区的设计下偠处理的一个问题是,假如本区的数据损坏如何保证本区的完整性和安全性?就像藩王的兵部队在战争中作战兵力急剧减少,面临“亡藩”的危险该怎么办呢,我们之后再讲

分区并行处理:一个即将检索大量数据的查询,如果能被有效的切分成几个细小的查询那麼查询的速度就会被显著提高,这是不言而喻的其中的原因,就是利用多方计算资源分散压力这在概念上很好理解,但是在实际操作過程中我们还得多理解一点,就是硬盘驱动的多核化假如我们的数据都存放在一块硬盘上,那就不谈分区并行处理的优越性了再怎麼分区,一块硬盘就那么几个盘面的磁头在工作任务(查询数据)还是要排队。但如果我们把分区架构在不同的硬盘之上那么任务(查询数据)就可以由不同的硬盘上的磁头完成,并行实实在在的提高了查询速度只是单台机器,提供的CPU计算能力有限如何将查询分拆荿不同的磁盘寻址,会消耗总 CPU 资源造成压力,进而影响其他进程的工作效率因此分布式查询应运而生,即由多机分摊计算就像遇着陸国抗秦一样,本质上都是在分摊压力和提高效率假如都是由中央发配作战部队,地方早被收割完成自我独立了。

在上面的讲述中峩们谈到了单台计算机和多台计算机集群的分区。每种架构的实现方法各异但功能最终都是一样的,有效的实现分摊压力

在商业影响oracle數据库性能环境下,实现分区总有一定的套路

创建一个分区表大致的方法如下:先建立一个分区函数(partition function), 在建立分区表的时候,以分区字段莋为调用分区函数时用的分区参数这里有必要谈下分区函数用到的分区字段,此字段只允许依照分区字段的离散值来分区再建立分区 scheme(partition scheme), 按照某一个字段(比如时间字段,按照月份作分区)建立 scheme, 比如从 2010年 1月份开始建立到 2020年12月份的分区 schemescheme的作用就是将分区函数指定的分区值区間对应到不同的文件组 file group (文件组)上。这里很重要的一点是 file group 的配置

file group 的配置决定了分区的 2 个益处,是不是被有效利用起来了假如只有一塊硬盘,那么分再多的区除了能够完成分区的第一个使命外,第二个必杀技就被浪费了所以分区必须是基于多块硬盘或者 RAID 集群上的。其中的原因是基于容错冗余和并行查询

RAID 0 将不同的数据块分别存储于不同的磁盘上,提高读写速度但不安全。一旦其中一块磁盘故障脱機数据损失。

RAID 1 将数据复制出 2 个副本确保了安全性。但读写速度就慢下来了就像刚才战争中,军队需要编制一样多编制战斗力一样嘚军队,有效保证作战效率

RAID 5 数据块分布式存储,在其他磁盘上保存副本读写效率与安全性双赢。

file group 必须分配在这种存储架构上方能利鼡好分区的 2 个益处。当然如果你把分区都放在同一个file group 里面也不能尽显优势更好的打散数据分布,就应该将分区分到不同的 file group 里面具体的細节就不展开了,好多文章都会详细解释配置

讲到这里,我们可以看一下怎么将 1 个包含 2 亿条数据的表,直接 1 秒装载到另外一张表里头詓了一个未分区的表,本质上是一个大分区这个大分区在物理磁盘上就是一个地址。我们通过将这个地址交给另外一位分区的大表即完成了数据切换。如果表有分区一样的原理,一样的操作聚合完成的历史数据,装载到最终存储的归档表通过切换分区即可。

分區本质一样都是对大数据的分而治之,分区的目的是不同的 tablespace. 当然放在一个 tablespace 也是没问题的放于不同的 tablespace, 目的就是为了提高并行效率,也更加安全的保障了数据分区的冗余和容错即使数据在一个分区丢了,其他分区的数据依然有效

除了这些恰到好处的好处之外,还加上了茬线分区和分区压缩在线分区的概念,就是在分区还有 DML 的操作情况下继续分区;分区压缩就是对分区数据进行压缩,减少数据存储体積从而增加查询的速度。

《Designing Data-Intensive Applications》 一书中也给出了分区的介绍本书给出的参考书目有很多,所以分区实现的方法也讲解了大片的篇幅通讀下来,我主要想讲讲书中带给我的思考。因为这些书中提到的这些问题虽然没有给出确切的答案,但是引起我对分区架构问题的思索是很重要的。上面主讲的是商业影响oracle数据库性能的分区而在这本书中,除了对商业影响oracle数据库性能做了分区知识的总结 主要是专門讲解分布式的分区架构。总的来说分布式分区需要解决的问题有这些:

1. 不要让数据聚集在一台计算机上运行,要均衡分布比如按照時间分区,按月来分区那么一个月占一个区,假如查询是查最新的一个月性能就没什么提高,如果是查询最近6个月那么一个分一个朤是有效分摊服务器资源的。所以看具体应用场景假如有 10 台 node, 结果查询还是落在了其中一台计算机上,那么这种情况称为 skewed, 即数据倾斜这囼计算机被称为 Hot Spot. 第一大问题就是不要认为分区是提高性能的万能钥匙。分区策略是依据我们查询分析的判断条件而随时可能变化的。

2. 分區的路由在哪里计算以及如何计算:Java的 Object.hashCode() Ruby的 Object#hash 等函数都是可以将key转换成 Hash 的。但是在不同的进程中这些函数将同一个Key转换出来的 hash 值是可能不┅样的。因此不能用来做 分布式存储的 hash 函数所以应该采用更普适性的hash函数,比如 MD5, FowlerNoll-Vo函数hash 分区,存储的不是 key 值而是 给定的hash 值。这倒是很徝得思考的为什么不是key值,而是要计算出来的hash值

updated timestamp 分区扫描,就比任何一种单纯的分区策略好很多

4. 分布式分区的索引可以有分区:

4.1 local index: 可鉯在数据各分区下面建立索引。索引所包含的数据指针都是指向本分区的

4.2 global index: 可以建立一个完整的索引包含对每个分区数据的指针,但是按照term分配到不同的分区上当然global index 的优点很明显,就是可以免去 scatter/gather 的操作增加了分区命中率,但是也有缺点多字段的文档,在新建或者修改删除的时候,需要同时往很多global index 分区中更新索引片段

5.1. 如果新的节点增加了原先的平衡被打破,那么怎么建立新的分区平衡

5.2. 如果有新的分區要增加怎么安排新分区在集群中的分布?

5.3. 如果所有分区的数据量远远大于分区节点的数量,怎么安排

5.4. 如果有节点退出了原先的分區平衡被打破,怎么建立新的分区平衡

假如每个分区需要 3 个副本,总共有 4 个分区那复制集群架构所需要的机器数量是, 4 台 一台上的汾区, 将 其他 3 个分区的 2 个充当其副本

7. 分区路由:保证前端传入的数据,被正确发送到了应该去的那个分区

7.1 随机访问集群中的任意一台。如果碰巧这台有我们需要的数据那么直接给出答案。如果没有这台节点将请求转发给其他有我们需要数据的节点,让这台节点处理那么问题是,他们之间是怎么配置通信以达到相互识别的目的。

7.2 通过访问一层路由层 由路由层帮转发请求。这层有点类似于 hadoop 的 NameNode, 知晓烸个节点的数据分布通过各个子节点汇报数据元结构给namenode,namenode掌握了所有的节点元数据问题是 zookeeper 与 Hadoop 自带的 Name Node 之间是如何协同?

7.3 由client客户端直接记錄每台节点数据直接发送对应的请求到相应处理节点上。这里就是要hard code 每台节点的元数据


如果 Oracle 还不能满足你的性能要求,试试大数据分析平台

1. 按照数据分析的实时性,分为实时数据分析和离线数据分析

传统的实时数据分析通过精心设计的RDBMS集群可以完成,比如 EMC的 GreenPlum, SAP HANA但对於数秒内返回上亿行数据的分析结果,这时候就要引入Storm, Spark 等新型实时流处理技术了

而离线大数据分析,依然是Hadoop的强项

因为大量数据的转換,传统的ETL造成的开销太大因此采用kafka, Chukwa, Timetunnel这类工具,才能实现在每秒数百MB的数据采集操作将数据上载到Hadoop的分布式存储上,调用MapReduce 来处理同樣的,现在已经可以说由 Spark 替代了

2. 按照大数据的数据量分为内存级别,BI级别海量级别

内存级别就是分布式内存计算。总量不超过集群的總内存量可以是各种NoSQL, MongoDB, Redis, Memcached 的集群应用,也可以是Spark 集群的并行计算

BI级别,就是传统的数据仓库那个量但是比 NoSQL 这种只将数据存入内存的场景,数据显然多很多但是这类应该放入 传统的BI。

海量级别就是传统的BI无法处理的数据量了。一般的BI数据仓库TB级以上就算很大了。但是互联网企业中海量的意思,可能是PB也就是1024个BI数据仓库的规模。因此传统BI的工具比如 SSIS, Informatic, Data Stage, BO 等ETL, 报表工具就无法完成计算与存储了。此时hadooop 的HDFS 僦应运而生了。分布式存储意味着增加机器就能线性扩容。

3. 按照数据分析的算法复杂度:

简单的排序分析总数据量不大于内存,使用 Redis 僦能轻松完成了大规模的人脸识别,图形渲染自然是使用并行处理集群。流量统计推荐引擎,趋势分析用户行为分析,分布式索引等统计分析机器学习等问题,则可以使用 MapReduce 算法改写

还有一类 大数据OLAP分析,使用NoSQL, RDBMS并不是处理强项甚至使用Hive也是仅能解决数据量大小嘚问题,而不是彻底解决灵活维度分析的难点所以还是需要使用 Hadoop MapReduce开发程序,但是在这里Spark 的出现可以有效缓解以上“阵痛”。

只有熟悉叻整个大数据生态圈才会挑合适的工具来完成适合你业务场景的平台架构

《Oracle影响oracle数据库性能性能优化实践指南》PDF 评分:

《Oracle影响oracle数据库性能性能优化实践指南》

我要回帖

更多关于 影响oracle数据库性能 的文章

 

随机推荐