让Oracle跑得更快 - Oracle 10g性能分析与优化思路
引起性能问题的因素
10g以上:CBO(基于成本的优化),不要用hint过多干预
避免不必要的外连接:如 ... where t1.a=t2.b(+) and t2.c>100 这里t2应该是内连接
优化器模式:对于报表类选择all_rows,对于网站分页用first_rows
OLAP:系统瓶颈在磁盘IO上
数据的安全:Data Guard; RAC; Rman+归档; exp/imp
锁和阻塞
V$LOCK
TM:表级段锁(shared)
引起阻塞的其他情况:
select for update
外键没索引
Latch和等待
latch争用:select * from v$latchname where name like 'library cache%' 检查绑定变量的使用
数据块访问的争用:(类型:表、索引、索引根、文件头)
buffer busy waits
cache buffer chain
反向索引:导致index range scan无效
9i+ ASSM:自动管理“free lists”
优化器
10g:彻底抛弃了RBO,‘动态采样’,选择最优的执行计划
执行计划
Card值:期望返回的记录数(它怎么知道的?)
分析表:exec dbms_stats.gather_table_stats(user,'t',cascade=>value);
Hint
分析及动态采样 Lv0~10
并行执行
PX Deq Credit: send blkd 空闲等待事件
SQL Loader直接加载:sqlload USERID scott/tiger CONTROL-PART1.CTL DIRECT=TRUE
变量绑定
SQL_TRACE和10046事件
tkprof
10053事件
性能视图和性能参数
V$SQL
V$SQL_SHARED_CURSOR
v$session
V$sessstat
V$session_wait(原书这里大小写不一致)
性能报告
statspack -> 10g AWR
10gr2:ASH(活动会话历史,AWR的一部分)
引起性能问题的因素
10g以上:CBO(基于成本的优化),不要用hint过多干预
避免不必要的外连接:如 ... where t1.a=t2.b(+) and t2.c>100 这里t2应该是内连接
优化器模式:对于报表类选择all_rows,对于网站分页用first_rows
OLAP:系统瓶颈在磁盘IO上
数据的安全:Data Guard; RAC; Rman+归档; exp/imp
锁和阻塞
V$LOCK
TM:表级段锁(shared)
引起阻塞的其他情况:
select for update
外键没索引
Latch和等待
latch争用:select * from v$latchname where name like 'library cache%' 检查绑定变量的使用
数据块访问的争用:(类型:表、索引、索引根、文件头)
buffer busy waits
cache buffer chain
反向索引:导致index range scan无效
9i+ ASSM:自动管理“free lists”
优化器
10g:彻底抛弃了RBO,‘动态采样’,选择最优的执行计划
执行计划
Card值:期望返回的记录数(它怎么知道的?)
分析表:exec dbms_stats.gather_table_stats(user,'t',cascade=>value);
Hint
分析及动态采样 Lv0~10
并行执行
PX Deq Credit: send blkd 空闲等待事件
SQL Loader直接加载:sqlload USERID scott/tiger CONTROL-PART1.CTL DIRECT=TRUE
变量绑定
SQL_TRACE和10046事件
tkprof
10053事件
性能视图和性能参数
V$SQL
V$SQL_SHARED_CURSOR
v$session
V$sessstat
V$session_wait(原书这里大小写不一致)
性能报告
statspack -> 10g AWR
10gr2:ASH(活动会话历史,AWR的一部分)