[让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1
在线事务(OLTP)
在线分析(OLAP)
在Oracle数据库中,凡是分配了存储空间的,都称为段,所有段并不一定指的是表,也可能是表的一个分区,
还可能是索引、大对象(LOB),或者IOT(索引表),物化视图等。
第1章 引起数据库性能问题的因素
系统设计包含:
软件的设计;
--软件系统架构的设计;
--软件代码的编写;
数据库的设计;
--数据库的类型选择;
--根据数据库类型的所有数据库对象的设计;
硬件的设计。
--存储结构的设计;
--硬件的性能选择;
--冗余设计。
1.1 软件设计对数据库的影响
1.1.1 软件架构设计对数据库性能的影响
对于并发操作比较大的系统,在数据库之前建一个缓冲用户请求的中间件服务。
1.1.2 软件代码的编写对数据库性能的影响
通常指的是应用程序代码中对数据库操作的代码部分对数据库产生的影响。
具体来讲就是SQL语句或是PL/SQL包。
SQL语句造成的影响:
SQL语句本身在逻辑上就是效率低下的
SQL语句没有绑定变量
性能低下的SQL语句:
使用Hint、不合适的外连接,谓词的隐含转换,优化器的选择、多表关联、数据的访问方式
(索引还是全表扫描)以及表关联方式的选择(Hah Join,Nested Loops)
人为地在SQL代码中加入Hint来约束SQL的执行计划
SELECT /*+ index(t1 ind_t1) */ col1,col2 FROM t1 WHERE col1>..... AND col1<.....>
不必要的外连接操作
CREATE TABLE t1 AS SELECT ROWNUM a,ROWNUM+100 b FROM dba_users WHERE ROWNUM<10;
CREATE TABLE t2 AS SELECT DECODE(MOD(ROWNUM,2),0,ROWNUM) c,ROWNUM+1000 d FROM dba_users WHERE ROWNUM<10;
SELECT a,b,c,d FROM t1,t2 WHERE t1.a=t2.c(+);
SELECT a,b,c,d FROM t1,t2 WHERE t1.a=t2.c(+) AND t2.d>1000;
SELECT a,b,c,d FROM t1,t2 WHERE t1.a=t2.c AND t2.d>1000;
CBO下优化器模式的选择
通常对于一种功能单一的数据库来讲,在实例级设置一个优化器模式就可以了。
对于OLAP系统,可以把优化器模式设置成all_rows。
对于一些分页操作比较多的网站类数据库,设置成first_rows会更好一些。
--可以通过Hint的方式来讲优化模式转换成FIRST_ROWS
SELECT * FROM
(SELECT /*+ first_rows(10) */ a.*,ROWNUM rnum FROM
(SELECT /*+ first_rows(10) */ ID,NAME FROM t1 ORDER BY ID) a
WHERE ROWNUM<=10)
WHERE ROWNUM>=1;
没有绑定变量的SQL
对OLTP系统影响较大。
PL/SQL包
存储过程是经过成功编译后存放在数据库中的代码,执行起来的效率要比程序代码中PL/SQL包的效率高很多,
因为它不再需要做语法和语义的分析。
语法的分析:指的是数据库对代码进行检查,看它是否存在语法上的错误;
语义的分析:是查看语句执行的对象是否存在,比如需要操作的表、列等,以及是否有执行这些操作的权限。
1.2 数据库的设计
通常,可以把业务分为两类:
在线事务处理系统(OLTP)
强调数据库的内存效率,强调内存各种指标的命中率,强调绑定变量,强调并发操作。
在线分析系统(OLAP)或者DSS(决策支持系统)
强调数据分析,强调SQL执行时长,强调I/O,强调分区等。
1.2.1 OLTP数据库
1.用户并发数
2.数据库内存设计 内存数据库,比如Oracle的Times Ten
内存的设计通常是通过调整Oracle和内存相关的初始化参数来实现的。包括SGA的大小(Data Buffer、Shared Pool)、
PGA大小(排序区,Hash区等)。
OLTP系统是一个数据库变化非常频繁、SQL语句提交非常频繁的系统。
对于数据块来说,应尽可能让数据块保存在内存当中。
对于SQL来说,尽可能使用变量绑定技术来达到SQL的重用,减少物理I/O和重复的SQL解析,
能极大地改善数据块的性能。
方法:先给这些参数设定一个经验值,然后通过搭建测试环境对数据块进行测试,通过一些
性能报告(比如AWR或者Staspack报告)作为依据,不断地调整这