重温《收获不止Oracle》

原创
2020/02/07 21:34
阅读数 257

闲在家里,正好重新查缺补漏

第一章:方法论:

第二章:物理体系。回滚段与SCN对读一致性的意义、LGWR只能单进程、频率归档日志会引起数据写入效率下降、Oralce的启动顺序(读参数文件、控制文件、数据文件)

第三章:逻辑体系。段、区、块的概念重新回顾,正好看到行迁移的介绍,然后查网上资料理清了行连接(Chain)、行迁移(Migrate)和行移动(Movement)的区别。 其中Movement主要用于数据闪回、分表列修改、数据块整理,是很有用的特性。如果程序代码中没有暂存Rowid用于业务处理,则可以持续打开Movement。

第四章:表设计。分区表介绍,里边也描述了全局索引失效的注意事项。全局临时表用于简单的计算过程是OK的,而且Redo的量能减少(insert语句也能吗?)。但如果过程比较复杂,最好还是手工管理这种中间表;因为中间库可直接Drop,也可根据业务动态创建多个,互不干扰,还方便事后追查计算过程是否有错。

第五章:索引。Oracle的优化器有时还是不够智能,需要写代码的人提供更精确的意图。如:select min(a), max(a) from t 要换成select ( select min(a) from t, select max(a) from t ) from dual的写法才能更减少逻辑读(虽然CPU的Cost可能变高)。又如书中把所有ID设置成只有20、21后的测试:id >= 20 and id <= 21与id in( 20, 21 ) 的Cost也是不相同的,应该是范围取数的“与”运行代价要大于等值取数。等值查询列在前,范围查询列在后的组合索引效率更高。

还重新看了位图索引,据说这在数据重复度高、更新少的数据方面比较好用。看起来这和列式数据库的原理是一样的嘛,联想到档案汇总统计,如果创建相关的“快照表”,然后在快照表上创建位图索引,是不是就要以达到效果了?这肯定比把所有的统计条件都事先查一轮要节省性能,因为绝大部分的计算结果其实是没人看的呢。

第六章:表连接。执行计划的阅读是从上到下,缩进最深的的开始(象Python?)具体的序号ID不代表顺序。如果最终检索出少量数据,适用于Nested Loops Join,其他才是Hash Join或Merge Sort Join(减少字段可以大幅减少排序所需要的空间)。Nested Loops Join与Hash Join都有驱动表的概念,(驱动表返回多少数据,被驱动表就访问多少次,其中就是代码中的双重循环,就看放谁在外面)

第七、八章:由于有了这1年多的运维经历,再看书中的各种案例也顿时觉得亲切了。排查问题主要是不要轻信任何东西,特别线上的东西经常面临“先搞定,以后再优化”,然后就没有然后了,一直等到系统出现性能问题。书的的办法可以分成几类:代码有没有问题(有无必要、有无写错)、数据有没有必要(能否减小、能否缓存)、性能是否充分运用上了(有无空闲机器)

第九章:提问的智慧。所有的新人其实都应该学会如何提问。

第十章:方法论。碰到问题,先了解现场环境(诊断)。然后了解需求:表面需求、约束条件、真实需求。最后设计:给出改进手段,由于是线上系统,还要给出对应的操作时间、风险策略。
文中特意提到意识和技能,往往新手Dev/DBA只有技能,而管理人员却只有意识,要想真的能快速解决问题,得2方面都强。

第十一章:规范。新人的成长需要过程,就算是老手也会有失误的时候,这时就需要把常见问题、套路(意识)给固化下来,维持一个基本的操作水准。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部