鼎力推荐
颠覆IT技术图书的传统写作方式,在妙趣横生的故事中学到Oracle核心知识与优化方法论,让你摆脱技术束缚,超越技术。
内容提要
在这本书里读者将会跟随作者一同对Oracle数据库的相关知识进行梳理,最终共同提炼出必须最先掌握的那部分知识,无论你是数据库开发、管理、优化、设计人员,还是从事Java、C的开发人员。接下来作者再将这部分知识中最实用的内容进一步提炼,浓缩出最精华的部分,分享给大家。这是二八现象的一次经典应用。
这部分知识就是Oracle的物理体系结构、逻辑体系结构、表、索引以及表连接五大部分。通过阅读这些章节,读者将会在最短时间内以一种有史以来最轻松的方式,完成对Oracle数据库的整体认识,不仅能在工作中解决常规问题,还能具备一定的设计和调优能力。相信通过这些章节的学习,会给读者的Oracle学习带来极大的收获。
然而,作者最希望看到的是:让读者的收获,不止Oracle。
为达到此目的,作者精心将全书分成了上下两篇,刚才所描述的具体知识点体现在全书的上篇,而在下篇中,读者将通过各种精彩故事、生动案例,体会到该如何学习和如何思考,在意识的天空抛开束缚,无拘无束、尽情飞翔。
在这里,读者也许会有疑问,前面说的有史以来最轻松的方式是一种什么样的方式呢?还请亲爱的读者自己去揭晓谜底吧。
作者简介
梁敬彬,网名wabjtam123,任ITPUB版主、ITPUB社区专家、福建富士通公司数据库专家。参与编写过《剑破冰山——Oracle开发艺术》、《DBA手记2》等技术书籍,多年从事电信相关行业工作,负责系统架构设计、优化、培训等工作,有着丰富的数据库管理、设计、开发、培训经验和电信行业经验。
梁敬弘,清华大学计算机系博士毕业,在计算机领域和金融领域皆有建树,拥有多项计算机相关核心专利技术的同时还拥有金融行业的CFP等高级认证。现就职于华夏银行总行。
名人推荐
作者在书中反复传达的核心观点是:Oracle数据库看似艰深的原理实际上和生活中的基本常识并无二致。理解了这一层意思,就能够克服对于这门技艺的畏惧之心,此后的学习自然就能够顺风顺水。诚然如此,我也经常和朋友们说,对于Oracle的很多艰深算法,如果由我们去深思熟虑,其结果都必然大致相同。类似HASH原理,布隆过滤等算法,理解了你就只觉得巧妙而不觉艰深。现在梁老师就为我们寻找了一系列源于生活、循序渐进的学习路线,如果你能够细心领会,就会觉得这一门技艺实在是趣味横生。
——Oracle ACE总监、云和恩墨创始人、ACOUG创始人盖国强(eygle)
曾经有Oracle的初学者问我,怎么开始学习Oracle?那时候我的答案很简单:“去下载Oracle的在线文档,包括DatabaseConcept、Administrator’sGuide,然后开始学着做实验。”诚然,对学习技术而言,在线文档是一个不可多得的利器,但是,对于一个刚刚开始接触Oracle的人来说oracle建表语句,要从枯燥的英文文档中去学习和理解Oracle的技术体系,也许有点勉为其难。就算是市面上众多的Oracle技术书籍,多数也是堆砌满了技术细节,随时可能吓跑初学者。
好在,现在梁敬彬先生通过自己在日常工作和培训中的磨练,把自己对Oracle技术的感悟,通过一个一个的小故事,浅显而又形象地展现了出来。对于初学者来说,可以慢慢地在一个个小故事中去了解Oracle数据库。读完这本书,你也许会恍然大悟:“哦,原来Oracle是这样子的。”
——罗海雄(rollingpig)ITPUB Oracle管理版资深版主
岂曰无衣,与子同袍。此书必为IT行业带来一股清新之风,打造出IT书籍的一段传奇佳话,成就一部永不过时的经典力作!我相信,此书将为广大读者开启惊喜之心扉,让读者飞翔在思想的天空、遨游在方法论的海洋、采摘到技术的累累硕果,相信收获远不止Oracle!
——福富软件公司副董事长、总经理杨林
我在ITPUB认识梁敬彬先生始,就拜读他当时参与的大作《剑破冰山——Oracle开发艺术》,直至今天,这本书里的部分内容在行业里还发挥着重要影响力。从事数据库事业多年,读过无数的技术书,有洋洋万言的,有短小精悍的,但大多写得正儿八经,有距离感,还有点冷。梁敬彬先生的新书,用生动的故事形式叙述复杂技术,开创数据库技术书籍故事化的写作先河。梁先生技术功底和文字功底同样深厚,更重要的是具有作为讲师那种缜密、体系化的思维方式,以及对读者心思的透视力,因此成书脉络清晰,里面还不断穿插许多人生哲理,技术前瞻,让人获益良多。这本书非常适合入行者和在行业里谋求上升的同仁阅读,动人的文笔可以让你一口气读完这本书,而且完全没有读其它技术书籍时那种头晕脑胀,昏昏入睡的感觉。这是一本值得向行业推介的优秀技术书籍。
——中国数据库社区ITPUB创始人黄志洪(tigerfish)
多年前作为DBA时我曾经总结过,到底是什么后天原因能导致人和人之间的学习结果发生重大差异,其中有一点就是思维方式。于是我尝试在思维方式方面去影响身边的一些人,最后这些人在各自的领域也都获得了成功,而在此之前他们却是默默无闻。思维方式可以由长期的训练而固化下来,但若是无人在身边影响你,那么最好就是你自己有意识的发生改变。敬彬此书就是用诙谐幽默的语言生动地引导大家在意识层面发生改变,然后逐步转化为行动上的改变,按此坚持几年下来,相信每个人都能迈上自己新的台阶,这的确早已超越oracle的范畴,对我们诸多方面都有益处。
——支付宝平台数据部资深总监冯春培(biti_rainy)
敬彬兄这本书有着与市场上其他Oracle书籍与众不同的特点,他通过一个个精彩的小故事,串起Oracle的核心知识和优化方法论,并时刻强调学习和工作的意识oracle建表语句,如何不被技术束缚,如何跳出技术,意识和方法真的很重要。相信读完本书,你的收获,绝对不止Oracle!
——ITPUB Oracle开发版资深版主,《剑破冰山——Oracle开发艺术》副主编丁俊(dingjun123)
通读本书,如醍醐灌顶,豁然开朗,本书从实战出发,出发于技术,而超脱于意识,回味无穷,作者拥有多年的Oracle应用和体系架构设计的经验,付出了不亚于任何人的努力,总结出众多独到的经验,不失为一本好书,为学习和使用Oracle的技术人员带来诸多益处。
——福富软件公司运营总监傅祥文
由梁敬彬、梁敬弘兄弟合作的《收获,不止Oracle》一书问世了。这对学习和从事数据库相关事务的业内人员来说,是一件幸事。读一本技术方面的书,或修一门课程、听一个讲座,大凡可能有三方面的收获:掌握相关的知识,提高解决问题的能力,激发学习、探讨有关问题的兴趣和热情。这些可能的收获不在一个层面上,后两者更为可贵。梁敬彬梁敬弘兄弟的这本书恰恰给读者提供了这样的机会。当然,要有真收获,还要有真努力。
梁敬弘曾是我的学生,不仅学业专精,围棋也下得很不错,是一个真诚而聪明的小伙子,跟他的哥哥相比,内向一些。梁敬彬与弟弟相比更善于沟通和表达,是一个数据库方面的专家,也是一个很好的教师。在此,预祝本书的出版获得成功,同时也祝兄弟二人在事业上不断取得新的成就。
——清华大学计算机系教授黄连生
我们选取了《收获,不止Oracle》中的一些章节,希望对大家有些参考。
精彩章节
1、Oracle体系结构图:
图片来自网络
①Oracle由实例和数据库组成,上半部的直角方框为实例instance,下半部的圆角方框为数据库databases。
②实例是由一个开辟的内存区SGA(SystemGlobalArea)和一系列后台进程组成的,其中SGA最主要被划分为共享池(sharedpool)、数据缓冲区(dbcache)和日志缓冲区(logbuffer)三类。后台进程包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等系列进程。
③数据库是由数据文件、参数文件、日志文件、控制文件、归档文件等系列文件组成的,其中归档日志最终可能会被转移到新的存储介质中,用于备份恢复使用。
④PGA(ProgramGlobalArea)区,这也是一块开辟出来的内存区,和SGA最明显的区别在于,PGA不是共享内存,是私有不共享的,S理解为共享的首字母。用户对数据库发起的无论查询还是更新的任何操作,都是在PGA先预处理,然后接下来才进入实例区域,由SGA和系列后台进程共同完成用户发去的请求。
PGA起到的具体作用,也就是前面说的预处理,是什么呢?主要有三点:第一,保存用户的连接信息,如会话属性、绑定变量等;第二,保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内;第三,当发起的指令需要排序的时候,PGA正是这个排序区,如果在内存中可以放下这个排序的尺寸,就在内存PGA区内完成,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成。
⑤用户的请求发起经历的顺序一般如下:1区->2区->3区;或者1区->2区。
后台进程介绍:
PMON:进程监视器,当其他进程出错时进行处理
SMON:系统监视器,重点工作在于instancerecovery除此之外,还有清理临时表空间、回滚段表空间和合并空闲空间
LCKn:仅适用于RAC数据库,最多可有10个进程,用于实力间的封锁
RECO:用于分布式数据库的恢复
CKPT:用于触发DBWR从数据缓冲区写出数据到磁盘
DBWR:负责将数据缓冲区中的数据写出到磁盘文件中
LGWR:负责将日志缓冲区的日志数据写出到REDO文件中
ARCH:负责磁盘日志文件的归档,转存到其他存储介质中
2、Oracle逻辑结构:
表空间(tablespace):系统表空间、回滚段表空间、临时表空间、用户表空间。
段(segment)、区(extent)
块(block):数据块的组成
①数据块头:包含标准内容和可变内容
②表目录区:数据所在的表信息
③行目录区:存放插入的行的地址
④可用空间区:块中的空余空间
⑤行数据区:存储具体的行信息或索引信息
1)、在建表空间时需要预先规划好表空间的大小,如果段的扩展导致表空间不够而需要表空间去扩大,那么开销是很大的,但如果预先分配过多空间,也是一种浪费,因此我们需要根据实际应用去平衡。
2)、delete操作是无法释放空间的,即没办法回收block块,在delete之后只是block中无数据,可block依然存在,在后续的insert时将填充delete的空block,因此普通的堆表无法满足有序插入有序读出(不适用orderby)。
3、Oracle表分类
1)、普通堆表
不足:
表更新有日志开销
表delete操作不能释放空间
表记录太大检索较慢
索引回表读开销很大
有序插入难有序读出
2)、全局临时表
分类:基于session、基于事务
优点:高效删除记录,退出session或commit结束事务,记录就删除;不同会话独立,避免锁竞争,利于并行
3)、分区表
分类:range分区(范围分区),list分区(列表分区),hash分区(散列分区),组合分区
分区表的特性:
① 高效的分区消除
②强大的分区操作:分区truncate消除数据比较快速,并不同于delete,可释放空间;分区数据转移;分区切割想分就分,可将某个分区切割成多个分区,以达到增加分区数量的目的;分区合并想合就合;分区的增删非常简单
③分区索引类型:全局索引;局部索引
④分区表相关陷阱:对分区进行truncate操作之后,全局索引失效,局部索引正常,为了避免全局索引失效,在对分区进行删除、转移、切割、合并、增加等操作时,可在命令后加“updateglobalindexes”关键字;有索引效率反而更低;无法应用分区条件
4)、索引组织表:在createtable的语句之后增加organizationindex关键字
优点:不需要回表查询主键之外的列,性能更高
缺点:更新操作代价较高
4、索引
1)、创建索引有哪些操作
①建索引先排序:将需要建索引的列和rowid取出排好序放在内存中
②列值入块成索引:依次将内存中的顺序存放的列的值和对应的rowid存进Oracle空闲的Block块中,形成索引块
③填满一块接一块:当块1被填满时,会接着填到其他空闲块,如块2,此时会有另外一件重要的事情发生,会产生一个茎块B1用来管理块1和块2
④ 同级两块则会产生上层块来管理下级块,直到root根节点
2)、索引结构的三大特点
① 索引高度较低
② 索引存储列值及能定位到行数据在数据表中的位置的rowid
③ 索引本身有序
3)、应用索引三大特性进行查询优化
①索引高度较低的妙用:由于索引结构导致高度较低,因此在表数据量相差甚远的情况下,运用索引,查询速度会相差无几,都会比较快,此种情况仅限于查询结果比较少的情况,如果需要返回表中的绝大部分数据,那用索引反而会更慢,不如全表扫描,原因是索引也是快,如果一个索引3层,100万数据,那么就需要300万次IO,因此性能会下降
②分区索引的设计误区:如果在分区表中查询时不能使用到分区条件,那么建立分区索引是根据分区个数创建的,如果查询没有使用分区条件,就会去所有索引块中查找,那么此时的索引高度将变得极高,IO次数变多,性能下降
③count(*)优化:索引不能存储空值,索引列必须设置成不能为空,可以用whereobjectisnotnull解决;当表中字段很少,比如只有一个字段,那此时使用索引会比全表扫描更慢,因为索引中存储了字段以外的rowid数据,总体来说比原表数据更大了
④sum/avg优化:允许为空的列仍然不能使用索引
⑤max/min优化:能使用允许为空的列的索引;执行计划只有两次逻辑读,这是因为索引的结构导致的结果,max只要去最右边的最后一列查询,min则去最左边第一列查询即可,因为索引是有序的;selectmin(object_id),max(object_id)fromt不能使用索引,因为object_id列属性允许为空,selectmin(object_id),max(object_id)fromtwhereobject_idisnotnull可以使用索引,但是INDEXFASTFULLSCAN类型索引,selectmax,minfrom(selectmax(object_id)maxfromt)a,(selectmin(object_id)minfromt)b能使用索引,并是INDEXFULLSCAN(MIN/MAX)类型索引,逻辑读比第二种少了非常多
⑥索引回表与优化:应尽量不要使用select*fromt,这样会导致全表扫描操作;善用联合索引,联合索引字段不宜超过3个;(聚合因子:表和索引两者的列的排序相似度),如果表的插入顺序和索引列的顺序基本一致,那么从索引回表查找数据块将会更容易,这就是聚合因子底对查询优化的帮助
⑦orderby排序优化:在orderby列上加索引,能有效提升查询效率
⑧distinct优化:索引能消除distinct触发的排序,提升效率
⑨索引全扫描和快速全扫描:INDEXFULLSCAN和INDEXFASTFULLSCAN在如count(*)和sum这种不需要排序的查询时使用快速全扫描,而在涉及排序语句时,就要权衡利弊了,也许使用全速全扫描,也许使用非快速扫描,由oracle优化器计算出成本值决定
⑩union合并优化:在使用union时索引是不能消除排序的,因为这是两个结果集的筛选
限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688