背景

案件(13405_RI-再保结算查询导出太慢),造成性能慢的原因是执行以下sql时,每次执行平均需要消耗2秒,

画面上,点击一次导出按钮,就会发起数以百记的调用。

SQL执行代码段

  1. select * from t_policy_payment_writeoff where policysn = 'PB12345';

t_policy_payment_writeoff为视图,其代码为:

  1. create or replace view t_policy_payment_writeoff as
  2. select rownum as id, t."WRITEOFFAMOUT",t."POLICYSN"
  3. from (
  4. select sum(b.realamount) writeoffamout, b.custseq policysn
  5. --保费回写视图
  6. from ciod_bp.mm_writeoutstatus_to a, ciod_bp.mm_writeout_to b
  7. where a.id = b.id
  8. and a.datasource = 'RI'
  9. and a.status = '99'
  10. and a.writeouttype = '1' --回写成功的..
  11. group by b.custseq
  12. union all
  13. --分入转分出的业务,分出的账单找对应的分入账单的保费
  14. select max(cat_parent.acc_writeoffsum) writeoffamout, fin.policysn
  15. from ciod_ri.account_catalog cat_self,
  16. ciod_ri.account_catalog cat_parent,
  17. ciod_ri.ri_fac_cont_reins_fin fin
  18. where cat_self.premium_bill_no = cat_parent.bill_no
  19. and cat_parent.bill_no = fin.statement_no
  20. and cat_self.retrocession_flag = 'T'
  21. and cat_parent.acc_writeoffsum <> 0
  22. group by fin.policysn
  23. ) t
  24. ;

SQL执行计划为

  1. Plan hash value: 3741877562
  2. ------------------------------------------------------------------------------------------------------------------------
  3. | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  4. ------------------------------------------------------------------------------------------------------------------------
  5. | 0 | SELECT STATEMENT | | 458K| 64M| | 27972 (2)| 00:05:36 |
  6. |* 1 | VIEW | T_POLICY_PAYMENT_WRITEOFF | 458K| 64M| | 27972 (2)| 00:05:36 |
  7. | 2 | COUNT | | | | | | |
  8. | 3 | VIEW | | 458K| 59M| | 27972 (2)| 00:05:36 |
  9. | 4 | UNION-ALL | | | | | | |
  10. | 5 | HASH GROUP BY | | 458K| 24M| 59M| 23812 (2)| 00:04:46 |
  11. |* 6 | HASH JOIN | | 458K| 24M| 12M| 17447 (2)| 00:03:30 |
  12. |* 7 | TABLE ACCESS FULL | MM_WRITEOUTSTATUS_TO | 458K| 7159K| | 2938 (2)| 00:00:36 |
  13. | 8 | TABLE ACCESS FULL | MM_WRITEOUT_TO | 1241K| 48M| | 10757 (2)| 00:02:10 |
  14. | 9 | HASH GROUP BY | | 795 | 81090 | | 4161 (1)| 00:00:50 |
  15. |* 10 | HASH JOIN | | 795 | 81090 | | 4160 (1)| 00:00:50 |
  16. | 11 | NESTED LOOPS | | 795 | 38955 | | 3683 (1)| 00:00:45 |
  17. |* 12 | TABLE ACCESS FULL | ACCOUNT_CATALOG | 724 | 2896 | | 2234 (2)| 00:00:27 |
  18. |* 13 | TABLE ACCESS BY INDEX ROWID| ACCOUNT_CATALOG | 1 | 45 | | 2 (0)| 00:00:01 |
  19. |* 14 | INDEX UNIQUE SCAN | PK_ACCOUNT_CATALOG | 1 | | | 1 (0)| 00:00:01 |
  20. | 15 | TABLE ACCESS FULL | RI_FAC_CONT_REINS_FIN | 93390 | 4833K| | 475 (2)| 00:00:06 |
  21. ------------------------------------------------------------------------------------------------------------------------
  22. Predicate Information (identified by operation id):
  23. ---------------------------------------------------
  24. 1 - filter("POLICYSN"='PB12345')
  25. 6 - access("A"."ID"="B"."ID")
  26. 7 - filter("A"."WRITEOUTTYPE"='1' AND "A"."DATASOURCE"='RI' AND "A"."STATUS"='99')
  27. 10 - access("CAT_PARENT"."BILL_NO"="FIN"."STATEMENT_NO")
  28. 12 - filter("CAT_SELF"."PREMIUM_BILL_NO" IS NOT NULL AND "CAT_SELF"."RETROCESSION_FLAG"='T')
  29. 13 - filter("CAT_PARENT"."ACC_WRITEOFFSUM"<>0)
  30. 14 - access("CAT_SELF"."PREMIUM_BILL_NO"="CAT_PARENT"."BILL_NO")

分析

  1. 根据执行计划中,ID=7ID=15,MM_WRITEOUTSTATUS_TORI_FAC_CONT_REINS_FIN 是全表扫描方式去访问表。
  2. 谓词条件是 where policysn = 'PB12345';
  3. 然后我们可以在MM_WRITEOUTSTATUS_TO表的字段CUSTSEQ建立索引
  4. RI_FAC_CONT_REINS_FIN表的字段POLICYSN建立索引,使其能进行谓词推入,并进行索引访问。
  5. 但是视图t_policy_payment_writeoff rownum 字段,会阻止进行谓词推入,所以我们可以改写该视图。

优化

1)增加索引

  1. create index CIOD_BP.IDX_CUSTSEQ_1 on CIOD_BP.MM_WRITEOUT_TO (CUSTSEQ);
  2. create index ciod_ri.IDX_POLICYSN_1 on ciod_ri.RI_FAC_CONT_REINS_FIN (POLICYSN);

2)改写视图,去掉rownum as id 字段

  1. create or replace view t_policy_payment_writeoff as
  2. select t."WRITEOFFAMOUT",t."POLICYSN"
  3. from (
  4. select sum(b.realamount) writeoffamout, b.custseq policysn
  5. --保费回写视图
  6. from ciod_bp.mm_writeoutstatus_to a, ciod_bp.mm_writeout_to b
  7. where a.id = b.id
  8. and a.datasource = 'RI'
  9. and a.status = '99'
  10. and a.writeouttype = '1' --回写成功的..
  11. group by b.custseq
  12. union all
  13. --分入转分出的业务,分出的账单找对应的分入账单的保费
  14. select max(cat_parent.acc_writeoffsum) writeoffamout, fin.policysn
  15. from ciod_ri.account_catalog cat_self,
  16. ciod_ri.account_catalog cat_parent,
  17. ciod_ri.ri_fac_cont_reins_fin fin
  18. where cat_self.premium_bill_no = cat_parent.bill_no
  19. and cat_parent.bill_no = fin.statement_no
  20. and cat_self.retrocession_flag = 'T'
  21. and cat_parent.acc_writeoffsum <> 0
  22. group by fin.policysn
  23. ) t

3)原sql改成

  1. select rownum as id,b.* from t_policy_payment_writeoff b where policysn = 'PB12345';
  2. #执行计划
  3. ----------------------------------------------------------------------------------------------------------
  4. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  5. ----------------------------------------------------------------------------------------------------------
  6. | 0 | SELECT STATEMENT | | 2 | 270 | 2252 (2)| 00:00:28 |
  7. | 1 | VIEW | | 2 | 270 | 2252 (2)| 00:00:28 |
  8. | 2 | UNION-ALL | | | | | |
  9. | 3 | SORT GROUP BY NOSORT | | 1 | 57 | 11 (0)| 00:00:01 |
  10. |* 4 | TABLE ACCESS BY INDEX ROWID | MM_WRITEOUTSTATUS_TO | 1 | 16 | 3 (0)| 00:00:01 |
  11. | 5 | NESTED LOOPS | | 2 | 114 | 11 (0)| 00:00:01 |
  12. | 6 | TABLE ACCESS BY INDEX ROWID| MM_WRITEOUT_TO | 2 | 82 | 5 (0)| 00:00:01 |
  13. |* 7 | INDEX RANGE SCAN | IDX_CUSTSEQ_1 | 2 | | 3 (0)| 00:00:01 |
  14. |* 8 | INDEX RANGE SCAN | IDX_WRITEOUTSTATUS_1 | 1 | | 2 (0)| 00:00:01 |
  15. | 9 | SORT GROUP BY NOSORT | | 1 | 102 | 2241 (2)| 00:00:27 |
  16. |* 10 | HASH JOIN | | 1 | 102 | 2241 (2)| 00:00:27 |
  17. | 11 | NESTED LOOPS | | 2 | 196 | 7 (0)| 00:00:01 |
  18. | 12 | TABLE ACCESS BY INDEX ROWID| RI_FAC_CONT_REINS_FIN | 2 | 106 | 3 (0)| 00:00:01 |
  19. |* 13 | INDEX RANGE SCAN | IDX_POLICYSN_1 | 2 | | 1 (0)| 00:00:01 |
  20. |* 14 | TABLE ACCESS BY INDEX ROWID| ACCOUNT_CATALOG | 1 | 45 | 2 (0)| 00:00:01 |
  21. |* 15 | INDEX UNIQUE SCAN | PK_ACCOUNT_CATALOG | 1 | | 1 (0)| 00:00:01 |
  22. |* 16 | TABLE ACCESS FULL | ACCOUNT_CATALOG | 724 | 2896 | 2234 (2)| 00:00:27 |
  23. ----------------------------------------------------------------------------------------------------------
  24. Predicate Information (identified by operation id):
  25. ---------------------------------------------------
  26. 4 - filter("A"."WRITEOUTTYPE"='1' AND "A"."DATASOURCE"='RI' AND "A"."STATUS"='99')
  27. 7 - access("B"."CUSTSEQ"='PB12345')
  28. 8 - access("A"."ID"="B"."ID")
  29. 10 - access("CAT_SELF"."PREMIUM_BILL_NO"="CAT_PARENT"."BILL_NO")
  30. 13 - access("FIN"."POLICYSN"='PB12345')
  31. 14 - filter("CAT_PARENT"."ACC_WRITEOFFSUM"<>0)
  32. 15 - access("CAT_PARENT"."BILL_NO"="FIN"."STATEMENT_NO")
  33. 16 - filter("CAT_SELF"."PREMIUM_BILL_NO" IS NOT NULL AND "CAT_SELF"."RETROCESSION_FLAG"='T')

优化后

SQL运行时间降至:0.034s

rownum导致sql不能进行谓词推入的更多相关文章

  1. sparkSQL将谓词推入kudu引擎

    kudu之所以执行非常快速,可以用来替代HDFS和Hbase等,一个主要原因是,我们可以将普通SQL中的谓词推入kudu引擎,这样kudu查询数据会变的非常快: 将谓词评估推入Kudu引擎可以提高性能 ...

  2. 最新版SEMCMS_PHP_3.5 过滤不严导致sql注入

    一.漏洞分析 在分析过程中看到网上已经有人发现semcms V2.4存在过滤不严导致sql注入的漏洞,不知道咋还没改,而且最新版过滤的关键字更少了. 首先查看首页文件index.php的代码 < ...

  3. 【转】导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  4. 服务器重启可能会导致SQL Server中部分数据库变为single user mode

    今天检查公司生产服务器的SQL Server数据库,惊讶的发现有三个生产数据库变为了single user mode.奇怪的是没有任何人和程序执行过SQL语句将这三个数据库设置为single user ...

  5. Drupal V7.3.1 框架处理不当导致SQL注入

    这个漏洞本是2014年时候被人发现的,本着学习的目的,我来做个详细的分析.漏洞虽然很早了,新版的Drupal甚至已经改变了框架的组织方式.但是丝毫不影响对于漏洞的分析.这是一个经典的使用PDO,但是处 ...

  6. 导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  7. 修改Windows帐户密码,导致Sql Server 2000无法启动

    修改Windows帐户密码,导致Sql Server 2000无法启动. --现象以管理员或同等权限用户登录 Windows XP,建立 Sql Server 2000 数据库.之后,在修改此 Win ...

  8. 12.1.0.2自适应特性导致SQL性能下降

    背景介绍 在升级到12.1.0.2.0数据库版本后,在使用12c中引入的自适应特性默认配置的情况下,可能引起SQL性能的下降. 问题现象升级到12.1.0.2.0后,SQL语句性能可能出现下降. 影响 ...

  9. dedecms SESSION变量覆盖导致SQL注入漏洞修补方案

    dedecms的/plus/advancedsearch.php中,直接从$_SESSION[$sqlhash]获取值作为$query带入SQL查询,这个漏洞的利用前提是session.auto_st ...

随机推荐

  1. windows下 zookeeper dubbo 安装+配置+demo 详细图文教程

    Java集群优化——dubbo+zookeeper构建 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这 ...

  2. Mybatis的全局配置文件标签介绍(mybatis-config.xml)

    全局配置文件中本人只记录了常用的几个  typeHandlers, objectFactory,objectWrapperFactory, reflectorFactory, plugins, dat ...

  3. xml小练习

    挑选你熟悉省份,制作xml城市列表 ----- 必备城市基本信息 10个城市 --- 一定要有属性对城市列表 添加DTD约束 <?xml version="1.0" enco ...

  4. C# 判断文件和文件夹是否存在并创建

    C# 判断文件和文件夹是否存在并创建 using System; using System.Data; using System.Configuration; using System.Collect ...

  5. git免密码

    法1: git config --global credential.helper store 这样就自动储存密码 法2: 使用ssh访问(https:// 改成 ssh://)

  6. jdk 1.8下 java ArrayList 添加元素解析

    转载请注明http://www.cnblogs.com/majianming/p/8006452.html 有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实 ...

  7. AJPFX关于抽象方法和接口

    class Demo_Animal1{ public static void main(String[] args) {                Cat a = new Cat("加菲 ...

  8. LN : leetcode 70 Climbing Stairs

    lc 70 Climbing Stairs 70 Climbing Stairs You are climbing a stair case. It takes n steps to reach to ...

  9. Android开发——蓝牙

    ---恢复内容开始--- 前言 孤芳自赏,一揽芳华: 人情冷暖,自在人心: 登高远眺,望步止前: 喜笑言开,欺人骗己. 上篇文章介绍了基本的蓝牙使用,书写的demo也不是很完善,希望各位大神能够改正. ...

  10. java格式化sql

    在日志分析中,经常会对记录的sql进行分析,所以将一整行sql格式化,进行多行缩就显得很有必要,许多数据库客户端都提供sql的格式化功能,但复杂的多层嵌套sql往往格式化的l还不够友好,所以就自己造了 ...