O32 案列整理
问题案例6:问题分类:性能-数据库-sql语句【客户及环境】: XX生产环境,中间件asar,操作系统Linux【程序版本信息】: PF_20160429D_18【事件编号】: SJ201703210488【问题现象】: 【报表查询】--【新股申购中签查询】--【配号查询】查询所有配号信息查询非常慢,2915条数据查询需要38秒左右【问题排查】: 前台显示查询需要38秒,取出sql后在PL/SQL中执行也是差不多的耗时,应该是SQL的问题,对sql进行分析。Select marketno, gddm,vc_asset_relative_code, vc_stock_name,vc_inter_code, en_price, cjbh, cjsl,l_date from (select c.*, f.vc_asset_relative_codevc_stock_name, f.en_yesterday_close_price en_price, --申购价格 f.vc_inter_code, --申购代码 f.vc_asset_relative_code --证券代码from (select a.cjrq l_date, '1'marketno, a.gddm, a.zqdm || 'SS'zqdm, a.cjbh, --起始配号 a.cjsl --配号数量 fromthisshangjsipogh a, tstockinfo h wherea.zqdm = h.vc_report_code andh.c_market_no = '1' andh.c_stock_type = 'c' union selectto_char(fxfsrq, 'yyyymmdd')l_date, '2'marketno, b.fxgddm gddm, b.fxzqdm || 'SZ'zqdm, b.fxwtgs cjbh, b.fxqrgs cjsl fromTHISSHENJSFX b whereb.fxywlb = 'A2') c, tstockinfo d, tstockinfo f, tstockinfo m, (select distinct (a.vc_stockholder_id) fromtentruststockholder a wherea.c_market_no in ('1', '2') and (select count(*)fromTOPFUNDRIGHT where TOPFUNDRIGHT.l_fund_id=a.l_fund_idand TOPFUNDRIGHT.c_layer='1' and TOPFUNDRIGHT.l_operator_no=1000 and instr(TOPFUNDRIGHT.vc_rights, '1')>0 ) > 0) e where c.zqdm =d.vc_inter_code --申购代码 andd.vc_match_relative2_code = f.vc_inter_code andf.vc_asset_relative_code = m.vc_inter_code andc.gddm = e.vc_stockholder_id)where 1 = 1分析方法是将sql进行解体进行查询,将所有 select后from前的内容换成“*”,删除所有的where条件,然后得到精简版的sql:Select *from(select * from (select *from thisshangjsipogha, tstockinfo h union select * from THISSHENJSFX b) c, tstockinfo d, tstockinfo f, tstockinfo m, (select * from tentruststockholder a ) e)找到最内一级的sql为上述标黄部分,找到原始sql进行查询,发现速度很慢,然后查询相关逻辑发现有一个UNION关键字。语句的意思是将两张结果集合并去重后作为一张数据表,但实际上sql中存在默认的值,且不可能一致,所以此处去重功能没有必要,所以此处应该使用UNIONALL。
页:
[1]