其实一直都觉得咋们ERP查询 这一块挺慢的,不过这为我学习优化SQL提供了很好的实践机会。下面来记录下我的这次优化。其实这次SQL优化成功还要源自落落博客的一文章,让我找到了优化入口。

select a.APPROVALNO,a.QUALITYSTATENAME,a.ENTIREQUANTITY,c.printcount,a.billid,a.branchid,a.pk,a.billingdate,a.prodid prodid,a.prodno prodcode,a.prodname prodname,a.prodSPECIFICATION prodspec,a.MANUFACTURE manufacturer,a.busitypetext,a.PACKGEUNIT packunit,a.note,a.whseid,a.quantity,a.price,a.SETTLEMENTPRICE realprice,a.lotno,a.lotexpiredate,a.productdate,case when a.QUALITYSTATE = '1' then '合格' else '不合格' end acceptanceresult,a.amount,a.QUANTITYSUM QuantitySum,a.BIGPACKAGEQUANTITY packqty,qualitystate,a.grossprofit,CASE WHEN A.grossprofit = 0 THEN '0%' ELSE to_char(round(a.grossprofit/a.amount,4)*100,'FM9999990.99') ||'%' END grossprofitrate,e.relationtext RELATIONname,a.STOCKOUTTASKPK,a.SALEORDERDETPK,a.CHINESEDRUGYIELDLY,COSTACCOUNTING,SettlementPrice,ReturnQuantity,
trim(a.whsename) whsename,e.custid,e.custno,trim(e.custname) custname,c.staffid,c.staffname,e.territories,e.territoriestext,e.MAINOPID,e.MAINOPNAME,
e.BUSINESSID,e.BUSINESSMAN,e.BIGAREAMGRID,e.BIGAREAMGR,
e.executivedeptid,e.executivedept,e.medicalorgassistcode,f.purchaser,
e.is_publichospital,e.relation,e.relationtext,e.custtype,a.realgrossprofit,e.ownerareatextFrom tb_gos_sale_salestockoutdet ainner join tb_gos_sale_salestockoutSum c on a.billid = c.billid and a.branchid = c.branchidleft join vw_common_cust e on c.customerid=e.custid and c.branchid = e.branchidinner join vw_common_prod f on a.prodid = f.prodid and a.branchid = f.branchid
where a.billingdate between &begindate and &enddate
and (c.customerid=&CustId or &CustId is null)
and upper(a.billid) like '%' || upper(&BillId) || '%'
and c.deleteflag = 0
and (&BillerId is null or e.MAINOPID = &BillerId)
and (&BigAreaMgrId is null or &BigAreaMgrId = e.BIGAREAMGRID)
and (&BizManId is null or &BizManId = e.BUSINESSID)
and (&Relation is null or &Relation = e.relation)
and (&territories is null or &territories = e.territories)
and (a.busitypetext=&BusiType or &BusiType is null)
and e.custname like '%' || &CustName|| '%'
and (   &ArticulatedType =3 or (&ArticulatedType = 1 and e.isarticulated=1)    or (&ArticulatedType = 2 and e.isarticulated<>1)  );--------用PL/SQL查,时间范围是一个月,结果只显示一页,时间61.047stb_gos_sale_salestockoutdet  ---166 679行;
tb_gos_sale_salestockoutsum  --16 424行;
vw_common_cust   --851行;
vw_common_prod  --- 26 895行;
执行计划:已选择26472行。已用时间:  00: 03: 30.95执行计划
----------------------------------------------------------
Plan hash value: 957020064                                                                                                                                                                              -------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                             |   218 |   110K|   752   (1)| 00:00:10 |
|*  1 |  HASH JOIN                    |                             |   218 |   110K|   752   (1)| 00:00:10 |
|*  2 |   HASH JOIN                   |                             |   218 |   106K|   279   (2)| 00:00:04 |
|*  3 |    TABLE ACCESS BY INDEX ROWID| TB_GOS_SALE_SALESTOCKOUTDET |  1296 |   330K|     4   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IX_SALESTOCKOUTDET_DATE     |     1 |       |     3   (0)| 00:00:01 |
|*  5 |    HASH JOIN                  |                             |  2675 |   619K|   275   (2)| 00:00:04 |
|*  6 |     MAT_VIEW ACCESS FULL      | VW_COMMON_CUST              |    42 |  7602 |    34   (0)| 00:00:01 |
|*  7 |     TABLE ACCESS FULL         | TB_GOS_SALE_SALESTOCKOUTSUM | 16090 |   879K|   240   (1)| 00:00:03 |
|   8 |   MAT_VIEW ACCESS FULL        | VW_COMMON_PROD              | 26837 |   576K|   472   (1)| 00:00:06 |
-------------------------------------------------------------------------------------------------------------                                                                                           Predicate Information (identified by operation id):
---------------------------------------------------                                                                                                                                                     1 - access("A"."PRODID"="F"."PRODID" AND "A"."BRANCHID"="F"."BRANCHID")                                                                                                                              2 - access("A"."BILLID"="C"."BILLID" AND "A"."BRANCHID"="C"."BRANCHID")                                                                                                                              3 - filter(UPPER("A"."BILLID") LIKE '%%')                                                                                                                                                            4 - access(SYS_OP_DESCEND("BILLINGDATE")>=HEXTORAW('878FFAE0FEF8FEFAFF')  AND                                                                                                                        SYS_OP_DESCEND("BILLINGDATE")<=HEXTORAW('878FFAFEF8FEF8FF') )                                                                                                                             filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))>=TO_DATE(' 2012-05-01 00:00:00',                                                                                                          'syyyy-mm-dd hh24:mi:ss') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))<=TO_DATE(' 2012-05-31                                                                                       00:00:00', 'syyyy-mm-dd hh24:mi:ss'))                                                                                                                                                     5 - access("C"."BRANCHID"="E"."BRANCHID" AND "C"."CUSTOMERID"="E"."CUSTID")                                                                                                                          6 - filter("E"."CUSTNAME" LIKE '%%')                                                                                                                                                                 7 - filter("C"."DELETEFLAG"=0)                                                                                                                                                                       统计信息
----------------------------------------------------------                                                                                                                                              3009  recursive calls                                                                                                                                                                            0  db block gets                                                                                                                                                                              23729802  consistent gets                                                                                                                                                                            0  physical reads                                                                                                                                                                             0  redo size                                                                                                                                                                                  5572337  bytes sent via SQL*Net to client                                                                                                                                                           19764  bytes received via SQL*Net from client                                                                                                                                                     1766  SQL*Net roundtrips to/from client                                                                                                                                                          100  sorts (memory)                                                                                                                                                                             0  sorts (disk)                                                                                                                                                                               26472  rows processed                                                                                                                                                                             

从执行计划中看出 consistent gets很高。且先将TB_GOS_SALE_SALESTOCKOUTSUM 和vw_common_cust 做hash,得到结果后(大约2万数据)再跟 “过滤了一部分数据”的TB_GOS_SALE_SALESTOCKOUTDET做hash,最后和prod做hash 。

select count(1) from tb_gos_sale_salestockoutdet where billingdate between to_date('2012-5-1','yyyy-mm-dd') and to_date('2012-5-30','yyyy-mm-dd');----26472 行

源SQL加了一个限定条件 and c.billingdate between &begindate and &enddate    后执行计划变了。执行计划如下:

执行计划
----------------------------------------------------------
Plan hash value: 3638730693                                                                                                                                                                             ----------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                               |    27 | 14256 |   515   (1)| 00:00:07 |
|*  1 |  HASH JOIN                     |                               |    27 | 14256 |   515   (1)| 00:00:07 |
|*  2 |   HASH JOIN                    |                               |    27 | 13662 |    42   (3)| 00:00:01 |
|*  3 |    HASH JOIN                   |                               |   255 | 62475 |    38   (3)| 00:00:01 |
|*  4 |     MAT_VIEW ACCESS FULL       | VW_COMMON_CUST                |    21 |  3801 |    34   (0)| 00:00:01 |
|*  5 |     TABLE ACCESS BY INDEX ROWID| TB_GOS_SALE_SALESTOCKOUTSUM   |  3064 |   191K|     3   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN          | TB_SALESTOCKOUTSUM_DATEBILLID |     1 |       |     2   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS BY INDEX ROWID | TB_GOS_SALE_SALESTOCKOUTDET   |   324 | 84564 |     4   (0)| 00:00:01 |
|*  8 |     INDEX RANGE SCAN           | IX_SALESTOCKOUTDET_DATE       |     1 |       |     3   (0)| 00:00:01 |
|   9 |   MAT_VIEW ACCESS FULL         | VW_COMMON_PROD                | 26886 |   577K|   472   (1)| 00:00:06 |
----------------------------------------------------------------------------------------------------------------                                                                                        Predicate Information (identified by operation id):
---------------------------------------------------                                                                                                                                                     1 - access("A"."PRODID"="F"."PRODID" AND "A"."BRANCHID"="F"."BRANCHID")                                                                                                                              2 - access("A"."BILLID"="C"."BILLID" AND "A"."BRANCHID"="C"."BRANCHID")                                                                                                                              3 - access("C"."CUSTOMERID"="E"."CUSTID" AND "C"."BRANCHID"="E"."BRANCHID")                                                                                                                          4 - filter("E"."CUSTNAME" LIKE '%%' AND "E"."RELATION"=TO_NUMBER(NVL('',TO_CHAR("E"."RELATION"))))                                                                                                   5 - filter("C"."DELETEFLAG"=0)                                                                                                                                                                       6 - access(SYS_OP_DESCEND("BILLINGDATE")>=HEXTORAW('878FFAE0FEF8FEFAFF')  AND                                                                                                                        SYS_OP_DESCEND("BILLINGDATE")<=HEXTORAW('878FFAFEF8FEF8FF') )                                                                                                                             filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))>=TO_DATE(' 2012-05-01 00:00:00',                                                                                                          'syyyy-mm-dd hh24:mi:ss') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))<=TO_DATE(' 2012-05-31                                                                                       00:00:00', 'syyyy-mm-dd hh24:mi:ss'))                                                                                                                                                     7 - filter(UPPER("A"."BILLID") LIKE '%%' AND "A"."BUSITYPETEXT"=NVL('',"A"."BUSITYPETEXT"))                                                                                                          8 - access(SYS_OP_DESCEND("BILLINGDATE")>=HEXTORAW('878FFAE0FEF8FEFAFF')  AND                                                                                                                        SYS_OP_DESCEND("BILLINGDATE")<=HEXTORAW('878FFAFEF8FEF8FF') )                                                                                                                             filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))>=TO_DATE(' 2012-05-01 00:00:00',                                                                                                          'syyyy-mm-dd hh24:mi:ss') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))<=TO_DATE(' 2012-05-31                                                                                       00:00:00', 'syyyy-mm-dd hh24:mi:ss'))                                                                                                                                                     统计信息
----------------------------------------------------------                                                                                                                                              768  recursive calls                                                                                                                                                                            0  db block gets                                                                                                                                                                              2391720  consistent gets                                                                                                                                                                            0  physical reads                                                                                                                                                                             0  redo size                                                                                                                                                                                  5574104  bytes sent via SQL*Net to client                                                                                                                                                           19764  bytes received via SQL*Net from client                                                                                                                                                     1766  SQL*Net roundtrips to/from client                                                                                                                                                          9  sorts (memory)                                                                                                                                                                             0  sorts (disk)                                                                                                                                                                               26472  rows processed

最近将SQL改成如下,速度上来了。

select /*+ use_hash(f,a) leading(f)*/  a.APPROVALNO,a.QUALITYSTATENAME,a.ENTIREQUANTITY,c.printcount,a.billid,a.branchid,a.pk,a.billingdate,a.prodid prodid,a.prodno prodcode,a.prodname prodname,a.prodSPECIFICATION prodspec,a.MANUFACTURE manufacturer,a.busitypetext,a.PACKGEUNIT packunit,a.note,a.whseid,a.quantity,a.price,a.SETTLEMENTPRICE realprice,a.lotno,a.lotexpiredate,a.productdate,case when a.QUALITYSTATE = '1' then '合格' else '不合格' end acceptanceresult,a.amount,a.QUANTITYSUM QuantitySum,a.BIGPACKAGEQUANTITY packqty,qualitystate,a.grossprofit,CASE WHEN A.grossprofit = 0 THEN '0%' ELSE to_char(round(a.grossprofit/a.amount,4)*100,'FM9999990.99') ||'%' END grossprofitrate,e.relationtext RELATIONname,a.STOCKOUTTASKPK,a.SALEORDERDETPK,a.CHINESEDRUGYIELDLY,COSTACCOUNTING,SettlementPrice,ReturnQuantity,
trim(a.whsename) whsename,e.custid,e.custno,trim(e.custname) custname,c.staffid,c.staffname,e.territories,e.territoriestext,e.MAINOPID,e.MAINOPNAME,
e.BUSINESSID,e.BUSINESSMAN,e.BIGAREAMGRID,e.BIGAREAMGR,
e.executivedeptid,e.executivedept,e.medicalorgassistcode,f.purchaser,
e.is_publichospital,e.relation,e.relationtext,e.custtype,a.realgrossprofit,e.ownerareatextFrom tb_gos_sale_salestockoutdet ainner join tb_gos_sale_salestockoutSum c on a.billid = c.billid and a.branchid = c.branchidinner join vw_common_cust e on c.customerid=e.custid and c.branchid = e.branchidinner join vw_common_prod f on a.prodid = f.prodid and a.branchid = f.branchid
where a.billingdate between &begindate and &enddate
and c.billingdate between &begindate and &enddate
and (c.customerid=&CustId or &CustId is null)
and upper(a.billid) like '%' || upper(&BillId) || '%'
and c.deleteflag = 0
and (&BillerId is null or e.MAINOPID = &BillerId)
and (&BigAreaMgrId is null or &BigAreaMgrId = e.BIGAREAMGRID)
and (&BizManId is null or &BizManId = e.BUSINESSID)
and e.relation =nvl(&Relation,e.relation)
and (&territories is null or &territories = e.territories)
and a.busitypetext=nvl(&BusiType,a.busitypetext)
and e.custname like '%' || &CustName|| '%'
and (   &ArticulatedType =3 or (&ArticulatedType = 1 and e.isarticulated=1)    or (&ArticulatedType = 2 and e.isarticulated<>1)  );在正式库上执行 0.703s。执行计划
----------------------------------------------------------
Plan hash value: 926049473                                                                                                                                                                              ----------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                               |   312 |   160K|   515   (1)| 00:00:07 |
|*  1 |  HASH JOIN                     |                               |   312 |   160K|   515   (1)| 00:00:07 |
|*  2 |   MAT_VIEW ACCESS FULL         | VW_COMMON_CUST                |    21 |  3801 |    34   (0)| 00:00:01 |
|*  3 |   HASH JOIN                    |                               |   324 |   109K|   481   (2)| 00:00:06 |
|*  4 |    HASH JOIN                   |                               |   324 | 91692 |   477   (1)| 00:00:06 |
|   5 |     MAT_VIEW ACCESS FULL       | VW_COMMON_PROD                | 26837 |   576K|   472   (1)| 00:00:06 |
|*  6 |     TABLE ACCESS BY INDEX ROWID| TB_GOS_SALE_SALESTOCKOUTDET   |   324 | 84564 |     4   (0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN          | IX_SALESTOCKOUTDET_DATE       |     1 |       |     3   (0)| 00:00:01 |
|*  8 |    TABLE ACCESS BY INDEX ROWID | TB_GOS_SALE_SALESTOCKOUTSUM   |  3064 |   191K|     3   (0)| 00:00:01 |
|*  9 |     INDEX RANGE SCAN           | TB_SALESTOCKOUTSUM_DATEBILLID |     1 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------                                                                                        Predicate Information (identified by operation id):
---------------------------------------------------                                                                                                                                                     1 - access("C"."CUSTOMERID"="E"."CUSTID" AND "C"."BRANCHID"="E"."BRANCHID")                                                                                                                          2 - filter("E"."CUSTNAME" LIKE '%%' AND "E"."RELATION"=TO_NUMBER(NVL('',TO_CHAR("E"."RELATION"))))                                                                                                   3 - access("A"."BILLID"="C"."BILLID" AND "A"."BRANCHID"="C"."BRANCHID")                                                                                                                              4 - access("A"."PRODID"="F"."PRODID" AND "A"."BRANCHID"="F"."BRANCHID")                                                                                                                              6 - filter(UPPER("A"."BILLID") LIKE '%%' AND "A"."BUSITYPETEXT"=NVL('',"A"."BUSITYPETEXT"))                                                                                                          7 - access(SYS_OP_DESCEND("BILLINGDATE")>=HEXTORAW('878FFAE0FEF8FEFAFF')  AND                                                                                                                        SYS_OP_DESCEND("BILLINGDATE")<=HEXTORAW('878FFAFEF8FEF8FF') )                                                                                                                             filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))>=TO_DATE(' 2012-05-01 00:00:00',                                                                                                          'syyyy-mm-dd hh24:mi:ss') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))<=TO_DATE(' 2012-05-31                                                                                       00:00:00', 'syyyy-mm-dd hh24:mi:ss'))                                                                                                                                                     8 - filter("C"."DELETEFLAG"=0)                                                                                                                                                                       9 - access(SYS_OP_DESCEND("BILLINGDATE")>=HEXTORAW('878FFAE0FEF8FEFAFF')  AND                                                                                                                        SYS_OP_DESCEND("BILLINGDATE")<=HEXTORAW('878FFAFEF8FEF8FF') )                                                                                                                             filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))>=TO_DATE(' 2012-05-01 00:00:00',                                                                                                          'syyyy-mm-dd hh24:mi:ss') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("BILLINGDATE"))<=TO_DATE(' 2012-05-31                                                                                       00:00:00', 'syyyy-mm-dd hh24:mi:ss'))                                                                                                                                                     统计信息
----------------------------------------------------------                                                                                                                                              3269  recursive calls                                                                                                                                                                            0  db block gets                                                                                                                                                                              8204  consistent gets                                                                                                                                                                            0  physical reads                                                                                                                                                                             0  redo size                                                                                                                                                                                  5732814  bytes sent via SQL*Net to client                                                                                                                                                           19764  bytes received via SQL*Net from client                                                                                                                                                     1766  SQL*Net roundtrips to/from client                                                                                                                                                          130  sorts (memory)                                                                                                                                                                             0  sorts (disk)                                                                                                                                                                               26472  rows processed                                                                                                                                                                             

ERP 销售出库单查询---出库单明细 SQL优化相关推荐

  1. 金蝶云星空与金蝶云星空对接集成付款单查询连通付款单新增(付款单)

    数据源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制.多地点.多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台.K/3Clo ...

  2. mysql表单查询_MySQL表单集合查询

    表单查询 简单查询 SELECT语句 查询所有字段 指定所有字段:select 字段名1,字段名2,...from 表名; select * from 表名; 查询指定字段 select 字段名1,字 ...

  3. mysql跨库分页查询,“跨库分页”的四种方案

    方法一:全局视野法 (1)将order by time offset X limit Y,改写成order by time offset 0 limit X+Y (2)服务层对得到的N*(X+Y)条数 ...

  4. mysql 中文字符查询不出数据_jsp页面显示不出mysql中查询出的中文字符串,插入中文也不好使...

    用Eclipse编写的jsp页面,连接的是mysql数据库.英文和数字都能正常显示,中文就显示不了. 用户注册... 用Eclipse编写的jsp页面,连接的是mysql数据库.英文和数字都能正常显示 ...

  5. mysql表单查询_表单查询实例

    [TOC] ### 1.查找部门30中员工的详细信息. ``` select * from emp where deptno = 30; ``` ### 2.找出从事clerk工作的员工的编号.姓名. ...

  6. oracle查询属主下对象,SQL优化

    Oracle Index Merge 与 and_equal 的变迁 June 8, 2010 and_equal是Oracle支持的一种特定操作,可以将多个单列索引进行合并(Index Merge) ...

  7. 微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游

    分布式搜索引擎01 -- elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是 ...

  8. 小记一次海量数据实时查询域名库设计(下)

    二. WHOIS库设计 根据WHOIS数据查询业务场景.响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据 ...

  9. 利用窗口函数查询出各小组内排名第一的记录(MySQL)

    创建测试表: # 创建销售表sales: create table sales( year int, country varchar(20), product varchar(32), profit ...

最新文章

  1. cocos2d-iphone源码分析(2):Director
  2. BootLoader与Linux内核的参数传递
  3. android设备报警推送,Firebase推送通知未送达所有android设备
  4. Apache2.2.21安装图解
  5. MapReduce之Job工具类开发
  6. Andirod——网络连接(HttpURLConnection)
  7. python写透视挂_python opencv 透视变换
  8. 声学计算机软件,常用声学仿真软件汇总
  9. 什么是透明、匿名、高匿代理?详解!
  10. Google如何对图片搜索结果进行排名
  11. arduino超声波测距接线图详细_Arduino:超声波传感器+测距
  12. python 计算list中平均值_python里的list求平均值
  13. windows系统进程漫谈
  14. 中北大学工程硕士计算机技术,中北大学工程硕士专业排名
  15. 根据ID获取商品详情原数据(拼多多)
  16. 《为什么精英都是时间控》读书总结
  17. 人生旅程需要自己去把握
  18. Educational Codeforces Round 81 (Rated for Div. 2)
  19. 将jpg图片转换成yuv420(NV12)数据文件
  20. android 记住多个账号,Android实现记住账号密码功能

热门文章

  1. 似水流年,我的2018
  2. mysql常用查询语句
  3. 学习python,北京尚学堂,第91课到第120课的个人的总结
  4. XNA游戏开发之滚动背景
  5. 项目管理总结——如何处理项目突发事件
  6. java redis 限流_Redis——限流算法之滑动窗口、漏斗限流的原理及java实现
  7. HUAWEI(21)——华为网络基础+telnet
  8. 欲见未见:曦光未昕,静池林影,放酒当歌,
  9. 高级网络配置:bond网络,team网络以及网桥的搭建
  10. layui实现下拉多选列表(xm-select.js插件使用,后台添加或修改数据回显提交问题总结)