业务人员报告说不能登录系统,业务几乎停顿.
听到这个消息首先登录主机执行如下命令
[/@zzld03]#sar -u 1 10 HP-UX zzld03 B.11.23 U ia64 04/16/13 10:32:25 %usr %sys %wio %idle 10:32:26 63 1 26 10 10:32:27 53 1 23 23 10:32:28 49 3 33 16 10:32:29 43 1 39 18 10:32:30 39 1 34 26 10:32:31 35 0 40 24 10:32:32 41 1 37 21 10:32:33 43 1 42 15 10:32:34 40 4 40 15 10:32:35 57 11 27 5 Average 46 2 34 17
发现cpu消耗很高
执行top命令检查
从上面的top命令的监控情况来看pid=9362的进程消耗了95.55%的cpu
select s.sid,s.username,s.event,s.wait_time,s.state,s.seconds_in_wait,p.PROGRAM,s.MACHINE from v$session s,v$process p where p.spid=9362 and s.PADDR=p.ADDR
根据进程9362找到的语句如下:
select tt.indi_id as indi_id,
tt.folk_code as folk_code,
tt.urban_type as urban_type,
e.mt_pers_type as pers_type,
tt.pers_type as pers_type_detail,
tt.culture_code as culture_code,
tt.housereg_type as housereg_type,
tt.job_sta_code as job_sta_code,
tt.city_code as city_code,
tt.occu_grade_code as occu_grade_code,
tt.indi_sta as indi_sta,
tt.kindred_code as kindred_code,
tt.insr_code as insr_code,
tt.name as name,
decode(tt.sex, '1', '男', '0', '女', '未知') as sex,
to_char(tt.birthday, 'yyyy-mm-dd') as birthday,
tt.idcard as idcard,
tt.native as native,
to_char(tt.job_date, 'yyyy-mm-dd') as job_date,
tt.retire_date as retire_date,
tt.telephone as telephone,
tt.address as address,
tt.post_code as post_code,
tt.marri_sta as marri_sta,
tt.pre_job_years as pre_job_years,
tt.all_job_years as all_job_years,
tt.host_indi_id as host_indi_id,
tt.nothing_flag as nothing_flag,
tt.speical_pers_flag as speical_pers_flag,
tt.remark as remark,
d.folk_name as folk_name,
e.pers_name as pers_name,
f.culture_name as culture_name,
g.housereg_name as housereg_name,
h.job_sta_name as job_sta_name,
i.city_name as city_name,
i.city_class as city_class,
j.occu_grade_name as occu_grade_name,
k.indi_sta_name as indi_sta_name,
l.kindred_name as kindred_name,
tt.insr_detail_code as insr_detail_code,
tt.corp_id as corp_id,
to_char(tt.begin_date, 'yyyy-mm-dd') as begin_date,
to_char(tt.end_date, 'yyyy-mm-dd') as end_date,
tt.indi_join_sta as indi_join_sta,
tt.occu_code as occu_code,
tt.freeze_sta as freeze_sta,
tt.posi_code as posi_code,
tt.hire_type as hire_type,
tt.work_type as work_type,
nvl(tt.official_code, '00') as official_code,
tt.special_code as special_code,
tt.indi_ins_no as indi_ins_no,
tt.total_salary as total_salary,
tt.indi_join_flag as indi_join_flag,
m.occupation_name as occupation_name,
n.position_name as position_name,
o.hire_name as hire_name,
p.work_type_name as work_type_name,
q.special_name as special_name,
tt.corp_name as corp_name,
tt.corp_code as corp_code,
tt.corp_type_code as corp_type_code,
tt.corp_type_name as corp_type_name,
tt.center_id as center_id,
tt.veteran_benefit_name as veteran_benefit,
decode(tt.official_code,
'0',
'一般干部',
'1',
'副厅以上',
'2',
'副厅以下',
t.official_name) as official_name,
u.center_name as center_name,
nvl(v.last_balance, 0) as last_balance
from (select /*+rule*/
a.indi_id,
a.folk_code,
a.urban_type,
a.pers_type,
a.culture_code,
a.housereg_type,
a.job_sta_code,
a.city_code,
a.occu_grade_code,
a.indi_sta,
a.kindred_code,
a.insr_code,
a.name,
a.sex,
a.birthday,
a.idcard,
a.native,
a.job_date,
a.retire_date,
a.telephone,
a.address,
a.post_code,
a.marri_sta,
a.pre_job_years,
a.all_job_years,
a.host_indi_id,
a.nothing_flag,
a.speical_pers_flag,
decode(a.city_code,
null,
a.remark,
(select city.city_name
From bs_city city
where city.city_code = a.city_code)) remark,
(select bct.corp_type_name
From bs_corp_type bct
where bct.corp_type_code = s.corp_type_code
and bct.center_id = s.center_id) corp_type_name,
b.insr_detail_code,
b.corp_id,
b.begin_date,
b.end_date,
b.indi_join_sta,
c.occu_code,
decode(decode(nvl(p.freeze_sta, '0'),
'0',
nvl(b.freeze_sta, '0'),
'1',
'9'),
'0',
'基金未冻结',
'1',
'基金已冻结',
'9',
'单位已冻结') as freeze_sta,
c.posi_code,
c.hire_type,
c.work_type,
nvl(x.veteran_benefit_name, '非优抚对象') as veteran_benefit_name,
decode(a.pers_type, '3', nvl(c.office_grade, '0'), c.official_code) as official_code,
c.special_code,
c.indi_ins_no,
c.total_salary,
c.indi_join_flag,
s.corp_name,
s.corp_code,
s.corp_type_code,
s.center_id
from bs_corp s,
bs_pres_insur b,
bs_corp_insure p,
bs_corp_pres c,
bs_veteran_benefit x,
bs_insured a
where (a.idcard = '430204850922611' or
a.idcard = '430204198509226110')
and a.indi_id = b.indi_id
and a.veteran_benefit_type = x.veteran_benefit_type(+)
and decode(b.insr_detail_code,
'12',
'2',
'21',
'2',
'17',
'2',
b.insr_detail_code) =
DECODE(a.Sex || '~' || a.Pers_Type || '~' || C.INDI_JOIN_FLAG || '~' || '2',
'0~1~1~7',
'2',
'0~2~1~7',
'2',
'2')
and decode(p.insr_detail_code,
'12',
'2',
'21',
'2',
'17',
'2',
p.insr_detail_code) =
DECODE(a.Sex || '~' || a.Pers_Type || '~' || C.INDI_JOIN_FLAG || '~' || '2',
'0~1~1~7',
'2',
'0~2~1~7',
'2',
'2')
and s.corp_id = c.corp_id
and s.corp_id = p.corp_id
and b.insr_detail_code = p.insr_detail_code
and b.indi_id = c.indi_id
and b.corp_id = s.corp_id) tt,
bs_folk d,
bs_person_type e,
bs_culture_stac f,
bs_housereg_type g,
bs_job_stac h,
bs_city i,
bs_occupation_grade j,
bs_pers_status k,
bs_kindred l,
bs_occupation m,
bs_position n,
bs_hired_type o,
bs_work_type p,
bs_special q,
bs_official t,
bs_center u,
bs_mdi_indi_acc v
where tt.folk_code = d.folk_code(+)
and tt.pers_type = e.pers_type(+)
and tt.center_id = e.center_id(+)
and tt.culture_code = f.culture_code(+)
and tt.housereg_type = g.housereg_type(+)
and tt.job_sta_code = h.job_sta_code(+)
and tt.city_code = i.city_code(+)
and tt.occu_grade_code = j.occu_grade_code(+)
and tt.indi_sta = k.indi_sta(+)
and tt.kindred_code = l.kindred_code(+)
and tt.occu_code = m.occu_code(+)
and tt.posi_code = n.posi_code(+)
and tt.hire_type = o.hire_type(+)
and tt.work_type = p.work_type(+)
and tt.special_code = q.special_code(+)
and tt.official_code = t.official_code(+)
and tt.indi_id = v.indi_id(+)
and 1 = v.acco_sta(+)
and tt.center_id = u.center_id
and tt.center_id in ('430300')
后通过查看该语句的执行计划,发现没有选择合适的索引造成的,而没有选择合适的索引是因为在查询中使用了/*+rule */提示,将该提示去掉后,语句执行正常cpu的利用率也恢复正常,应用也恢复正常.
这就是典刑的一条sql语句拖垮整个系统的案例.