互联网服务数据库

DB2优化总结,与大家分享!

很多时候先开发,后优化,但很多时候,没有做优化工作
检查、测试、分析--找出性能瓶颈--寻找优化方案--评估优化方案--制定优化计划

检查环境配置--检查数据库设计--检查数据库索引--视图--检查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
参与10

9同行回答

hl305201130hl305201130软件开发工程师软件公司
谢谢分享显示全部
谢谢分享收起
互联网服务 · 2013-05-28
浏览888
freebilefreebile数据库运维工程师金融行业
回复 1# deadman 挺好,搞详细点会更好,辛苦了显示全部
回复 1# deadman

挺好,搞详细点会更好,辛苦了收起
金融其它 · 2013-05-23
浏览867
jason_homejason_home开发工程师allhigh
谢谢分享。显示全部
谢谢分享。收起
轨道交通 · 2013-05-23
浏览1002
Priest_LeonPriest_Leon系统架构师99无限
大师一般就这样的,呵呵显示全部
大师一般就这样的,呵呵收起
互联网服务 · 2013-01-15
浏览914
zhenfang_lizhenfang_li软件开发工程师华为
内容写的不错,就是太简练了。显示全部
内容写的不错,就是太简练了。收起
互联网服务 · 2012-09-25
浏览960
albeealbee系统工程师leibo
这个总结的真好 实用性强显示全部
这个总结的真好 实用性强收起
IT分销/经销 · 2010-07-21
浏览899
dashanli580dashanli580数据库架构师科蓝公司
楼主辛苦!!显示全部
楼主辛苦!!收起
IT其它 · 2010-07-17
浏览938
wwb1942wwb1942数据库管理员艾美仕市场咨询
认真学习~~显示全部
认真学习~~收起
金融其它 · 2010-07-15
浏览879
haoqingyunhaoqingyun数据库运维工程师CMBC
赞一个。显示全部
赞一个。收起
银行 · 2010-07-15
浏览885

提问者

deadman
软件开发工程师东软

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2010-07-14
  • 关注会员:1 人
  • 问题浏览:9723
  • 最近回答:2013-05-28
  • X社区推广