金融it 发表于 2017-10-19 15:56:24

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]
查看完整版本: O32 案列整理