第一章:引起数据库性能的因素:
1、对于高度并发的系统,可以在数据库与用户之间用软件搭建一个中间层,其目的是构建一个缓冲池,对用户访问数据库前进行处理,这就是中间件服务。Oracle有自带的MTS技术。
2、hint(线索,示意的意思)这是oracle中的一个生成执行计划的机制,他能强制oracle根据我们选择的执行计划来访问数据,而不是根据数据库自己来决定,下面我们来看看一般的有什么样子的hint的用法:
http://blog.csdn.net/changyanmanman/article/details/7252215
3、外连接是一种昂贵的执行过程,一般情况下,左右外连接都不要用最好。
4、对于一些OLAP的系统,一般都是运行报表作业,执行的都是一些包含集合类函数或者分组语句的sql,吧优化器模式可以设置成all_rows比较合适;而对于一些分页式网站的数据库,因为不是同事显示所有信息,可以选择first_rows更好。
5、绑定变量和包:如果是OLAP的系统,一般不要绑定变量,因为他的一条语句一般不会重复执行太多次,对于包来说,一般用存储过程来代替,存储过程是经过编译才存放在数据库里的代码,这样会比用包的效率提高很多。
第二章:锁和阻塞:这个问题老生常谈了好久,还是再总结一遍吧。
1、并发和并行两个的意思在英语中是很不相关的,却是汉语给搞得糊涂了,并发(concurrency)指的是多个用户同时对数据进行修改操作;并行(parallel)指的是一件事分成很多小部分同时进行,最后将执行结果汇总。
2、关于v$lock这个视图,这是一个非常重要的视图。
3、TM锁,在这个锁上面没有阻塞和等待,他是一个表级共享锁,就是说每个用户可以以共享的方式(lmode为3)持有他,其实TM更像一个分段级锁,我们平时之所以叫他表级锁,是因为我们的表只有一个段,如果将表分为好几个段,每个段上都会加一个TM锁。如:建立一个分区表,我们给此表分区p1,p2.在p1上插入一条数据,这样oracle就在表t和p1分区上加了一条TM锁,但是p2上因为没有数据,所有不会加上锁,这样一来,对表t和分区p1不能进行DDL操作,但是可以对p2进行 DDL操作,如:truncate table
t; 是不可以的,alter table t truncate partition p1也是不可以的,但是alter table truncate partition p2 是完全可以的。这也正好验证了TM是一个段级的共享锁,他只能允许同级别或者更低级别的锁同时设置,但是拒绝更好级别的锁定请求(此事DDL操作需要一个更高级别的排他表级锁)
4、在oracle里面不会存在一个锁管理器,要是那样的话还得等待锁管理器分配锁或者释放锁,这样锁越多管理的开销越大,显然是很不合理的,在oracle数据库中,并不会对某个表或者某几行上加锁,锁是以数据块的一个属性存在的。也就是说每个数据块本身就存储着自己数据块中数据的信息这个地方叫ITL (interesed transaction list)凡是在这个数据块上有活动的事务,他的信息就会记录在这里面供后续的操作查询使用,以保证事务的一致性。
5、一看到TX锁,一般人会认为他是一个行级排他锁,但这个是不正确的,其实TX是一个事务锁,他无论处理了多少行,都只是这一个事务锁在起作用,在v¥lock视图中这个锁的id1,id2(这两个值也同时告诉了你,这些数据在回滚段中的位置,这样当另一个事务来读取,却发现别人在用不能读,他就同个这个TX锁的id到回滚段中找到备份的数据读取出来)的值是不会变化的。这个事务锁会在行级对数据产生影响,比如阻塞。在一个主键表中,我们更新一个主键值是,就会产生一个TX事务锁,他阻止其他人对这一行进行更新。
6、关于select··· for update:这个句子与select区别就是前者以排他的方式获得了需要修改的数据,并且保证在修改完成之前,其他用户无法对这些数据进行修改。
7、外键和索引:如果你的系统有主、外键引用关系,并且满足以下三个条件的任意一个,那么就应该考虑给外键字段创建索引,这样可以极大的提高性能:
*主表上有频繁的删除操作;
*主键上有频繁的修改操作;
*业务上经常出现主表和从表做关联查询的情况。
如果不进行创建索引,那么每次进行主表删除操作,都会进行从表的全表扫描,这样、如果有1000条删除操作,那就要执行1000次从表扫描,这样显然不行,最好的办法就是在从表的外键上建立索引,到时候直接关联索引查询即可。
第三章:latch和等待: