Oracle数据库优化的几个有用思路
AWR(Automatic Workload Repository)报告
Oracle10g之后,AWR报告取代了原先的Statspack报告成为一个主流性能分析报告。通常可以从OEM(Oracle Enterprise Manager Console)平台上生成查看AWR报告。在OEM中,使用图形化方法更加容易。这里讲一下手工生成AWR报告。
1. 创建一个awr的目录,进到awr目录
2. 使用oracle用户,sqlplus /nolog
3. SQL> conn / as sysdba
4. SQL> @?/rdbms/admin/awrrpt.sql
5. report_type: html
6. num_days: 1
7. 选择时间点
8. 确认报告名称
就会在awr目录下生成一个类似的awrrpt_1_1796_1813.html文件。
关于Oracle的锁问题
DML锁(data locks,数据锁)
表级锁(TM)
1、NULL、Select
2、SS(Row-S)行级共享锁,其他对象只能查询这些数据行、Select for update、Lock for update、Lock row share
3、SX(Row-X)行级排它锁,在提交前不允许做DML操作、Insert、Update、Delete、Lock row share
4、S(Share)共享锁、Create index、Lock share
5、SSX(S/Row-X)共享行级排它锁、Lock share row exclusive
6、X(Exclusive)排它锁、Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
事务(行级)锁(TX)
事务发起第一个修改时会得到TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。
事务(行级)锁(TX)
事务发起第一个修改时会得到TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。
DDL锁(dictionary locks,字典锁)
内部锁和闩(internal locks and latches)
分为共享锁(share lock,即S锁),排他锁(exclusive lock,即X锁)
假如子表的外键字段没有建立索引,则删除父表记录的时候,就会在子表上申请一个表级(TM)的共享锁,这个锁他不是一直持有的,当父记录已经被删除的时候,只能看到关于这个记录的行锁,根本看不到这个共享的表锁的。但是如果当删除父记录的会话被block的时候,却会发现它在等待申请一个SSX的锁。
如果不对子表外键建索引,在删除子表记录时,会将父表全表删除操作锁住,父表删除时又会获取子表的全表共享锁,使子表全表锁死。但父表可以对非子表对应行进行修改操作。
基于以上两点,一定要在外键上建索引。
补充:
行级锁,一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。行级锁之前需要先加表结构共享锁。
表级锁,一般是指表结构共享锁锁,是不可对该表执行DDL操作,但对DML操作都不限制。
行级锁之前需要先加表结构共享锁。
根据锁的类型分,共有6种
LMODE
1、NULL,可以某些情况下,如分布式数据库的查询会产生此锁。
2、SS,表结构共享锁
3、SX,表结构共享锁+被操作的记录的排它锁
4、S, 表结构共享锁+所有记录共享锁
5、SRX 表结构共享锁+所有记录排它锁
6、X 表结构排它锁+所有记录排它锁