找回密码
 立即注册

QQ登录

只需一步,快速开始

估值系统 O32 案列整理

0
回复
2781
查看
[ 复制链接 ]

293

主题

6

回帖

4093

积分

管理员

积分
4093
问题案例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。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

293

主题

6

回帖

4093

积分

管理员

积分
4093
问题案例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。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

返回顶部