oracle笔记整理11——性能调优之oracle等待事件与表关联

1. oracle等待事件

1) 分类

主要分为两大类:空闲(idle)等待事件和非空闲(non-idle)等待事件,在会话级别可以在视图V$SESSION_WAIT中查看当前等待的时间。

2) 空闲事件

空闲事件指oracle正等待某种工作,不用过多关注。
常见的空闲等待事件:dispatcher timer,pipe get,slave wait,
sql net message from/to client,sql net more data to client

3) 非空闲等待事件

常见的空闲等待事件:

a) db file scattered read:文件分散多块读取
这个事件表明用户进程正在一次I/O读多块数据到Buffer Cache中,等待直到I/O调用返回,通常显示与全表扫描(full table scan / FTS)相关或者IFFS (index fast full scan) 快速索引全扫描(把索引链切割成很多份,多块并行读取)的等待,当全表扫描时,基于性能的考虑,数据会多块读取分散(scattered)读入buffer cache,出现该事件并不一定就表示存在性能问题,但如果该事件的等待的时间太长,就要仔细查看了。

b) db file sequential read
单个数据块/索引块读取到连续的内存中时会发生,常见于存在索引的情况下,可能存在多表连接,表的连接顺序有问题,没有正确使用驱动表,或者存在不适合的索引,同样的,出现该事件并不一定就表示存在性能问题,但如果该事件的等待的时间太长,就要仔细查看了。

c) free buffer:释放缓冲区
表明系统正在等待内存中的可用空间,有可能是低效率的SQL语句、DBWR进程写缓存数据太慢(有可能存在并发操作,dbwr来不及写入大量的缓存数据块到数据文件,导致缓存空间无法及时释放 )、缓冲区太小。

2. 表关联

1) 连接方式

a) 内连接,A inner join B on 即等值连接。
b) 左外连接,A left (outer) join B on / a.id = b.id(+)
c) 右外连接,A right (outer) join b on / a.id(+) = b.id
d) 全外连接,A full (outer) join B

2) 表之间的连接

a) 排序,合并连接(sort merge join,SMJ)
两表连接时,对两表结果集进行order by排序,之后进行关联合并,数据读操作少,只访问一次表,但是排序操作开销太大。

b) 嵌套循环(nested loops,NL)
两表连接就相当于二重循环(进而产生了驱动表和被驱动表的概念),会产生大量的读操作,可以通过索引以及驱动表的选择来优化;可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,所以返回结果集的响应时间是最快的,当驱动表返回结果集较小且连接列上有索引时,性能最好。

c) 哈希连接(hash join,HJ)
oracle 引入的 hash 连接, 能够解决嵌套循环连接中大量随机读的问题, 同时解决了排序合并连接中排序代价过大的问题,驱动表返回结果集数据量较大时综合性能最好。大多数情况下,比smj和nl连接方式性能更好。

3) 驱动表(driving table)

又称为外层表(outer table),所以该表为小表(实际为应用查询的限制条件之后,返回较少数据集的表)。

4) 被探查表(probed table)

又称为内层表(inner table),从驱动表中得到具体一行数据之后,在被探查表中寻找符合连接条件的行,所以该表应为大表(实际上为返回较大row source的表)且相应的列上应该有索引。

你可能感兴趣的:(oracle,性能,表关联,等待事件)