为了回馈我们默默关注的粉丝朋友们,我们特地联合电子工业出版社给大家免费赠送最新版《收获,不止Oracle》图书5本,具体参与方式见文末。
鼎力推荐
颠覆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的在线文档,包括Database Concept、Administrator’s Guide,然后开始学着做实验。”诚然,对学习技术而言,在线文档是一个不可多得的利器,但是,对于一个刚刚开始接触Oracle的人来说,要从枯燥的英文文档中去学习和理解Oracle的技术体系,也许有点勉为其难。 就算是市面上众多的Oracle技术书籍,多数也是堆砌满了技术细节,随时可能吓跑初学者。
好在,现在梁敬彬先生通过自己在日常工作和培训中的磨练,把自己对Oracle技术的感悟,通过一个一个的小故事,浅显而又形象地展现了出来。对于初学者来说,可以慢慢地在一个个小故事中去了解Oracle数据库。读完这本书,你也许会恍然大悟:“哦,原来Oracle是这样子的。”
——罗海雄(rollingpig)ITPUB Oracle管理版资深版主
岂曰无衣,与子同袍。此书必为IT行业带来一股清新之风,打造出IT书籍的一段传奇佳话,成就一部永不过时的经典力作!我相信,此书将为广大读者开启惊喜之心扉,让读者飞翔在思想的天空、遨游在方法论的海洋、采摘到技术的累累硕果,相信收获远不止Oracle!
——福富软件公司副董事长、总经理杨林
我在ITPUB认识梁敬彬先生始,就拜读他当时参与的大作《剑破冰山——Oracle开发艺术》,直至今天,这本书里的部分内容在行业里还发挥着重要影响力。从事数据库事业多年,读过无数的技术书,有洋洋万言的,有短小精悍的,但大多写得正儿八经,有距离感,还有点冷。梁敬彬先生的新书,用生动的故事形式叙述复杂技术,开创数据库技术书籍故事化的写作先河。梁先生技术功底和文字功底同样深厚,更重要的是具有作为讲师那种缜密、体系化的思维方式,以及对读者心思的透视力,因此成书脉络清晰,里面还不断穿插许多人生哲理,技术前瞻,让人获益良多。这本书非常适合入行者和在行业里谋求上升的同仁阅读,动人的文笔可以让你一口气读完这本书,而且完全没有读其它技术书籍时那种头晕脑胀,昏昏入睡的感觉。这是一本值得向行业推介的优秀技术书籍。
——中国数据库社区ITPUB创始人黄志洪(tigerfish)
多年前作为DBA时我曾经总结过,到底是什么后天原因能导致人和人之间的学习结果发生重大差异,其中有一点就是思维方式。于是我尝试在思维方式方面去影响身边的一些人,最后这些人在各自的领域也都获得了成功,而在此之前他们却是默默无闻。思维方式可以由长期的训练而固化下来,但若是无人在身边影响你,那么最好就是你自己有意识的发生改变。敬彬此书就是用诙谐幽默的语言生动地引导大家在意识层面发生改变,然后逐步转化为行动上的改变,按此坚持几年下来,相信每个人都能迈上自己新的台阶,这的确早已超越oracle的范畴,对我们诸多方面都有益处。
——支付宝平台数据部资深总监冯春培 (biti_rainy)
敬彬兄这本书有着与市场上其他Oracle书籍与众不同的特点,他通过一个个精彩的小故事,串起Oracle的核心知识和优化方法论,并时刻强调学习和工作的意识,如何不被技术束缚,如何跳出技术,意识和方法真的很重要。相信读完本书,你的收获,绝对不止Oracle!
——ITPUB Oracle开发版资深版主,《剑破冰山——Oracle开发艺术》副主编 丁俊(dingjun123)
通读本书,如醍醐灌顶,豁然开朗,本书从实战出发,出发于技术,而超脱于意识,回味无穷,作者拥有多年的Oracle应用和体系架构设计的经验,付出了不亚于任何人的努力,总结出众多独到的经验,不失为一本好书,为学习和使用Oracle的技术人员带来诸多益处。
——福富软件公司运营总监傅祥文
由梁敬彬、梁敬弘兄弟合作的《收获,不止Oracle》一书问世了。这对学习和从事数据库相关事务的业内人员来说,是一件幸事。读一本技术方面的书,或修一门课程、听一个讲座,大凡可能有三方面的收获:掌握相关的知识,提高解决问题的能力,激发学习、探讨有关问题的兴趣和热情。这些可能的收获不在一个层面上,后两者更为可贵。梁敬彬梁敬弘兄弟的这本书恰恰给读者提供了这样的机会。当然,要有真收获,还要有真努力。
梁敬弘曾是我的学生,不仅学业专精,围棋也下得很不错,是一个真诚而聪明的小伙子,跟他的哥哥相比,内向一些。梁敬彬与弟弟相比更善于沟通和表达,是一个数据库方面的专家,也是一个很好的教师。在此,预祝本书的出版获得成功,同时也祝兄弟二人在事业上不断取得新的成就。
——清华大学计算机系教授黄连生
我们选取了《收获,不止Oracle》中的一些章节,希望对大家有些参考。
精彩章节
1、Oracle体系结构图:
图片来自网络
① Oracle由实例和数据库组成,上半部的直角方框为实例instance,下半部的圆角方框为数据库databases。
② 实例是由一个开辟的内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA最主要被划分为共享池(shared pool)、数据缓冲区(db cache)和日志缓冲区(log buffer)三类。后台进程包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等系列进程。
③ 数据库是由数据文件、参数文件、日志文件、控制文件、归档文件等系列文件组成的,其中归档日志最终可能会被转移到新的存储介质中,用于备份恢复使用。
④ PGA(Program Global Area)区,这也是一块开辟出来的内存区,和SGA最明显的区别在于,PGA不是共享内存,是私有不共享的,S理解为共享的首字母。用户对数据库发起的无论查询还是更新的任何操作,都是在PGA先预处理,然后接下来才进入实例区域,由SGA和系列后台进程共同完成用户发去的请求。
PGA起到的具体作用,也就是前面说的预处理,是什么呢?主要有三点:第一,保存用户的连接信息,如会话属性、绑定变量等;第二,保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内;第三,当发起的指令需要排序的时候,PGA正是这个排序区,如果在内存中可以放下这个排序的尺寸,就在内存PGA区内完成,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成。
⑤ 用户的请求发起经历的顺序一般如下:1区 -> 2区 -> 3区;或者1区 -> 2区。
后台进程介绍:
PMON:进程监视器,当其他进程出错时进行处理
SMON:系统监视器,重点工作在于instance recovery 除此之外,还有清理临时表空间、回滚段表空间和合并空闲空间
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,因此普通的堆表无法满足有序插入有序读出(不适用 order by)。
3、Oracle表分类
1)、普通堆表
不足:
表更新有日志开销
表delete操作不能释放空间
表记录太大检索较慢
索引回表读开销很大
有序插入难有序读出
2)、全局临时表
分类:基于session、基于事务
优点:高效删除记录,退出session或commit结束事务,记录就删除;不同会话独立,避免锁竞争,利于并行
3)、分区表
分类:range分区(范围分区),list分区(列表分区),hash分区(散列分区),组合分区
分区表的特性:
① 高效的分区消除
② 强大的分区操作:分区truncate消除数据比较快速,并不同于delete,可释放空间;分区数据转移;分区切割想分就分,可将某个分区切割成多个分区,以达到增加分区数量的目的;分区合并想合就合;分区的增删非常简单
③ 分区索引类型:全局索引;局部索引
④ 分区表相关陷阱:对分区进行truncate操作之后,全局索引失效,局部索引正常,为了避免全局索引失效,在对分区进行删除、转移、切割、合并、增加等操作时,可在命令后加“update global indexes”关键字;有索引效率反而更低;无法应用分区条件
4)、索引组织表:在create table的语句之后增加 organization index 关键字
优点:不需要回表查询主键之外的列,性能更高
缺点:更新操作代价较高
4、索引
1)、创建索引有哪些操作
① 建索引先排序:将需要建索引的列和rowid取出排好序放在内存中
② 列值入块成索引:依次将内存中的顺序存放的列的值和对应的rowid存进Oracle空闲的Block块中,形成索引块
③ 填满一块接一块:当块1被填满时,会接着填到其他空闲块,如块2,此时会有另外一件重要的事情发生,会产生一个茎块B1用来管理块1和块2
④ 同级两块则会产生上层块来管理下级块,直到root根节点
2)、索引结构的三大特点
① 索引高度较低
② 索引存储列值及能定位到行数据在数据表中的位置的rowid
③ 索引本身有序
3)、应用索引三大特性进行查询优化
① 索引高度较低的妙用:由于索引结构导致高度较低,因此在表数据量相差甚远的情况下,运用索引,查询速度会相差无 几,都会比较快,此种情况仅限于查询结果比较少的情况,如果需要返回表中的绝大部分数据,那用索引反而会更慢,不如全表扫描,原因是索引也是快,如果一个索引3层,100万数据,那么就需要300万次IO,因此性能会下降
② 分区索引的设计误区:如果在分区表中查询时不能使用到分区条件,那么建立分区索引是根据分区个数创建的,如果查询没有使用分区条件,就会去所有索引块中查找,那么此时的索引高度将变得极高,IO次数变多,性能下降
③ count(*) 优化:索引不能存储空值,索引列必须设置成不能为空,可以用 where object is not null 解决;当表中字段很少,比如只有一个字段,那此时使用索引会比全表扫描更慢,因为索引中存储了字段以外的rowid数据,总体来说比原表 数据更大了
④ sum/avg 优化:允许为空的列仍然不能使用索引
⑤ max/min 优化:能使用允许为空的列的索引;执行计划只有两次逻辑读,这是因为索引的结构导致的结果,max只要去最右边的最后一列查询,min则去最左边第一列查询即可,因为索引是有序的;select min(object_id),max(object_id) from t 不能使用索引,因为object_id列属性允许为空,select min(object_id),max(object_id) from t where object_id is not null可以使用索引,但是 INDEX FAST FULL SCAN 类型索引,select max,min from(select max(object_id) max from t) a, (select min(object_id) min from t) b 能使用索引,并是 INDEX FULL SCAN(MIN/MAX)类型索引,逻辑读比第二种少了非常多
⑥ 索引回表与优化:应尽量不要使用 select * from t,这样会导致全表扫描操作;善用联合索引,联合索引字段不宜超过3个;(聚合因子:表和索引两者的列的排序相似度),如果表的插入顺序和索引列的顺序基本一致,那么从索引回表查找数据块将会更容易,这就是聚合因子底对查询优化的帮助
⑦ order by 排序优化:在 order by 列上加索引,能有效提升查询效率
⑧ distinct 优化:索引能消除 distinct 触发的排序,提升效率
⑨ 索引全扫描和快速全扫描:INDEX FULL SCAN 和 INDEX FAST FULL SCAN 在如count(*) 和 sum 这种不需要排序的查询时使用快速全扫描,而在涉及排序语句时,就要权衡利弊了,也许使用全速全扫描,也许使用非快速扫描,由oracle优化器计算出成本值决定
⑩ union 合并优化:在使用union时索引是不能消除排序的,因为这是两个结果集的筛选
4)、不得不说的主外键设计
① 外键上的索引与性能:外键上建索引能对连接查询有很大的性能提升
② 外键索引与锁的避免:在外键上建立索引不但能提升查询性能,还能有效避免锁竞争
③ oracle支持级联删除,需慎用
5)、联合索引
① 在等值查询情况下,组合索引的列无论哪一列在前,性能都一样
② 组合索引的列,当一列是范围查询,一列是等值查询的情况下,等值查询列在前,范围查询列在后,这样的索引才能提高性能
分析:因为索引有序,当两个查询列都为等值时,遍历索引块的次数一样,当一列为范围时,如果该列在前那么遍历将不会那么容易停下,相反,等值列在前时,将很快停止遍历,也即是遍历列更少,当然会更快
③ 设计需考虑单列的查询:如果单列的查询列和联合索引的前置列一样,那单列可以不建索引,直接利用联合索引来进行检索数据
6)、数据更新会受到索引影响,因此在需要插入数据时,应该先使索引失效,在数据插入完成之后,重新创建索引
7)、创建索引的过程会引发大量排序和锁竞争
8)、可以通过监控索引来蚌段索引是否被使用过,从而删除根本用不到的索加监控命令:alter index 索引名 monitoring usage;撤销命令:alter index 索引名 nomonitoring usage
9)、位图索引
① 位图索引在进行count(*)统计操作时性能比B树索引快近100倍,并且位图索引可以保存空值
② 位图索引的适用场景需要满足以下两个条件:位图索引列大量重复
10)、函数索引:create index idx_upper_obj_name on t(upper(object_name))
5、表的连接:嵌套循环、哈希连接、排序合并
1)、在嵌套循环连接中,驱动表返回多少条记录,被驱动表就返回多少记录
2)、在hash连接中,驱动表和被驱动表都只会访问0次或1次
3)、排序合并连接和hash连接一样,两张表都只会访问0次或1次,合并连接根本就没有驱动和被驱动的概念
4)、嵌套循环连接要特别注意驱动表的排序,小的结果集先访问,大的结果集后访问,才能保证被驱动表的访问次数降到最低,从而提升性能
5)、嵌套循环连接和hash连接有驱动顺序,驱动表的顺序不同将影响表连接的性能,而排序合并连接没有驱动的概念,无论那张表在前都无妨
6)、嵌套循环连接和hash连接不需要排序,而排序合并则需要排序,在取字段时,尽可能少的取字段,排序需要消耗内存
7)、hash连接不支持不等值连接 "<>"、">" 和 "<" 的连接方式,也不支持like的连接方式;排序合并连接不支持"<>"的连接条件,也不支持like的连接,但支持 ">" 之类的连接条件;嵌套循环无限制
8)、最适合嵌套循环连接的场景
① 两表关联返回的记录不多,几遍两张表的记录奇大无比,也是非常迅速的
② 遇到一些不等值查询导致哈希和排序合并连接被限制使用时,不得不使用嵌套循环连接
*****连接查询优化*****:驱动表的限制条件所在列加索引;被驱动表的连接条件所在列加索引
9)、哈希连接与索引
① 索引的连接条件起不到快速检索的作用,但是限制条件列如果有合适的索引,可以快速检索少量记录,还是可以提升性能的
② 哈希连接需要在PGA中的HASH_AREA_SIZE中完成,因此增大HASH_AREA_SIZE也是优化哈希连接的一种有效途径,一般在内存自动管理的情况下只要加大PGA区大小即可
10)、排序合并与索引:排序合并连接上的连接条件虽然没有检索的作用,却有清除排序的作用
原文:https://blog.csdn.net/eric520zenobia/article/details/80922035
彩蛋来啦
为了回馈我们默默关注的粉丝朋友们,我们特地联合电子工业出版社给大家免费赠送《收获,不止Oracle》5本。
参与方式:
1. 留言最美:在本公众号下方留言,可以分享自己的工作经验,也可以谈谈工作中遇到的一些坑,与大家共勉,我们将选出最为真诚的一条留言作者赠与图书;
2. 留言集赞数最多:在本公众号下方留言,留言点赞数排名前四名将分别获得图书一本;
本次活动公平真实,每个微信号最多可获得一本图书,4.13日将在本公众号发布获奖名单,欢迎大家的参与!
近期热文
2019最受欢迎数据库:MySQL居首PostgreSQL第二Oracle位列第八
点击“阅读原文”立即购买此书!
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
2018DTCC , 数据库大会PPT
2018DTC,2018 DTC 大会 PPT
ENMOBK,《Oracle性能优化与诊断案例》
DBALIFE ,“DBA 的一天”海报
DBA04 ,DBA 手记4 电子书
122ARCH ,Oracle 12.2体系结构图
2018OOW ,Oracle OpenWorld 资料
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂