1.前言
oralce的性能优化主要定位于三层:SQL层,会话层,以及系统层
sql层:
- 如果能从定位到sql,就不要从会话层面分析
工具执行计划,10053,10046....
会话层:
- 如果能定位到会话,就不要从系统层面分析
v$session,v$sesstat,v$session_wait,v$sql,v$lock,sql_trace
系统层
如果无法定位任何性能问题,从系统层面入手
AWR(staspack),os tools(top,iostat)
2.Oracle的锁
oracle的锁主要分为两类:
Enqueues ----队列类型的锁,通常和业务相关的
Latches -----系统资源方面的锁,比如内存结构,SQL解析
3.锁的原则
1.只有被修改时,行才会被锁定。
2.当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级
3.当某行被修改时,它将阻塞别人对它的修改。
4.当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改
5.读永远不会阻止写。
6.读不会阻塞写,但有唯一的一个例外,就是select...forupdate
7.写永远不会阻塞读。
8.当一行被修改后,Oracle通过回滚段提供给数据的一致性读。
4.锁的类型
Oracle所得类型有很多中,但是我们最常见的两种锁是TM和TX
TM表锁:发生在insert,update,delete以及select ..... for update操作时,目标是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。
TX锁 事务锁(行锁) 对于正在修改的数据,阻止其它会话进行修改
5.演示
这里有个update过程中的出现的锁
这里使用了v$lock这个视图进行查看的,
sid可以看成会话id,可以和v$sesssion关联
type表示锁的类型,这里就主要看TM和TX锁了,
block 0:表示未阻塞 其他 1: 表示阻塞其他线程了
request 请求获取的数据的状态 0表示锁, 1-6表示锁的状态
6.与v$lock相关的视图说明
视图名 | 描述 | 主要字段说明 |
v$session | 查询会话的信息和锁的信息。 | sid,serial#:表示会话信息。 program:表示会话的应用程序信息。 row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。 lockwait :该会话等待的锁的地址,与v$lock的kaddr对应. |
v$session_wait | 查询等待的会话信息 | sid:表示持有锁的会话信息。 Seconds_in_wait:表示等待持续的时间信息 Event:表示会话等待的事件,锁等于enqueue |
7.锁模式
锁模式 | 锁定的sql | 排斥的模式 | 允许的DML |
2 | lock table t in row share mode; | 6 | select/insert/update/delete/for update |
3 | lock table t in row exclusive mode; | 4,5,6 | select/insert/update/delete/for update |
4 | lock table t in share mode; | 3,5,6 | select |
5 | lock table t in share row exclusive mode; | 3,4,5,6 | select |
6 | lock table t in exclusive mode; | 2,3,4,5,6 | select |