很多时候先开发,后优化,但很多时候,没有做优化工作
检查、测试、分析--找出性能瓶颈--寻找优化方案--评估优化方案--制定优化计划
检查环境配置--检查数据库设计--检查数据库索引--视图--检查SQL(静态、动态)--检查应用程序代码(页面、代码)--第三方工具新技术--更改程序数据库设计
2:8
80%的工作只能产生20%的效果;
80%的性能问题由20%的代码引起;
20%的sql占用了80%的资源;
木桶原理:
误区:
1、没有找到瓶颈;
2、只进行软优化、不进行硬优化;
3、没有经过sql优化就进行更改程序数据库设计;
4、未考虑使用第三方工具、新技术进行优化;
监视开关:
db2 update monitor switches using lock ON sort ON bufferpool ON uow ON table ON statement ON
==数据库信息
db2 get db cfg for db_irs
-Lock timeout (sec) (LOCKTIMEOUT) = -1 超时时间
db2 update db cfg for db_irs using LOCKTIMEOUT 15
==数据库信息
db2 get snapshot for database on db_irs
-Lock list memory in use (Bytes)= 576 锁列表内存
-Database files closed = 0 关闭文件数 MAXFILOP
-Total sorts = 1 排序开销:Sort overflows/Total sorts <0.003
-Sort overflows = 0
==表信息
db2 get snapshot for tables on db_irs
-Rows Read= 98857 正在读取行
-Overflows= 0 溢出
db2 list tablespaces show detail
-Extent size (pages) = 32 表空间设置
-Prefetch size (pages) = 96
-Number of containers = 3
SQL 优化:
大小写
WHERE子句的执行顺序: 从后到前;
-逐表,关系
FROM子句的执行顺序: 从后到前;
-关系表在后;
(所以如果有大、小表做子表关联查询,把小表放在后台语句先执行查询,再查大表,如果能过滤大量数据查询放在后面,先查询)
JOIN连接执行的顺序: 从后到前;
索引:唯一索引、聚集索引(数据的存储顺序,如oracle的rowid)、索引、复合索引(一定要使用主索引,否则无效)
-索引可以提高查询的效率,但会降低操作的效率
-使用:经常在where、order或group by子句中出现的列
-不使用:重复多、NULL
在WHERE中尽量不要使用 OR ,!= , in , like
尽量不要使用SELECT * 语句,使用明确列名;
尽量不要在WHERE中包含子查询
尽量少用子查询,用JOIN代替
子查询中,尽量用EXISTS替代IN、用NOT EXISTS替代NOT IN
避免不同类型值的比较 (如id是int型,但在where id=’4’,这种方式,会让索引无效 )
使用存储过程和视图(系统预编译的,是静态的)
用EXISTS替代IN、用NOT EXISTS替代NOT IN;
避免在索引列上使用计算:WHERE SAL*12>25000;
用IN来替代OR: WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20
避免在索引列上使用IS NULL和IS NOT NULL;
总是使用索引的第一个列;
用UNION-ALL替代UNION;
SQL优化的顺序:
-检查SQL或存储过程的语法,考虑其写法是否还有可优化内容
-检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写
-检查、优化 索引的使用
死锁的优化:
1. 等待锁:
-查找修改产生死锁的逻辑;
A准备修改甲表(锁上甲表),然后查询乙表,B准备修改乙表(锁上乙表),然后查询甲表,这样就产生A等待B释放乙表,而B等待A释放甲表,这样就等待下去,产生死锁
2. 队列锁: 消减队列
-调整配置(LOCKTIMEOUT)
-增强硬件处理速度
-优化系统占用资源时间()
-减少用户数
3. 混合锁:
结构:拆分、分区表、读写分离;
锁信息:
db2 get snapshot for locks on db_irs
db2 list applications for db db_irs show detail
db2 list applications
GET MONITOR SWITCHES--查看当前会话的监控设置
GET DBM MONITOR SWITCHES--查看DBM 配置
db2 select * from table(snapshot_lock('db_irs',-1)) as locktable
收起