ERP 销售出库单查询---出库单明细 SQL优化
其实一直都觉得咋们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优化相关推荐
- 金蝶云星空与金蝶云星空对接集成付款单查询连通付款单新增(付款单)
数据源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制.多地点.多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台.K/3Clo ...
- mysql表单查询_MySQL表单集合查询
表单查询 简单查询 SELECT语句 查询所有字段 指定所有字段:select 字段名1,字段名2,...from 表名; select * from 表名; 查询指定字段 select 字段名1,字 ...
- mysql跨库分页查询,“跨库分页”的四种方案
方法一:全局视野法 (1)将order by time offset X limit Y,改写成order by time offset 0 limit X+Y (2)服务层对得到的N*(X+Y)条数 ...
- mysql 中文字符查询不出数据_jsp页面显示不出mysql中查询出的中文字符串,插入中文也不好使...
用Eclipse编写的jsp页面,连接的是mysql数据库.英文和数字都能正常显示,中文就显示不了. 用户注册... 用Eclipse编写的jsp页面,连接的是mysql数据库.英文和数字都能正常显示 ...
- mysql表单查询_表单查询实例
[TOC] ### 1.查找部门30中员工的详细信息. ``` select * from emp where deptno = 30; ``` ### 2.找出从事clerk工作的员工的编号.姓名. ...
- oracle查询属主下对象,SQL优化
Oracle Index Merge 与 and_equal 的变迁 June 8, 2010 and_equal是Oracle支持的一种特定操作,可以将多个单列索引进行合并(Index Merge) ...
- 微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游
分布式搜索引擎01 -- elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是 ...
- 小记一次海量数据实时查询域名库设计(下)
二. WHOIS库设计 根据WHOIS数据查询业务场景.响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据 ...
- 利用窗口函数查询出各小组内排名第一的记录(MySQL)
创建测试表: # 创建销售表sales: create table sales( year int, country varchar(20), product varchar(32), profit ...
最新文章
- cocos2d-iphone源码分析(2):Director
- BootLoader与Linux内核的参数传递
- android设备报警推送,Firebase推送通知未送达所有android设备
- Apache2.2.21安装图解
- MapReduce之Job工具类开发
- Andirod——网络连接(HttpURLConnection)
- python写透视挂_python opencv 透视变换
- 声学计算机软件,常用声学仿真软件汇总
- 什么是透明、匿名、高匿代理?详解!
- Google如何对图片搜索结果进行排名
- arduino超声波测距接线图详细_Arduino:超声波传感器+测距
- python 计算list中平均值_python里的list求平均值
- windows系统进程漫谈
- 中北大学工程硕士计算机技术,中北大学工程硕士专业排名
- 根据ID获取商品详情原数据(拼多多)
- 《为什么精英都是时间控》读书总结
- 人生旅程需要自己去把握
- Educational Codeforces Round 81 (Rated for Div. 2)
- 将jpg图片转换成yuv420(NV12)数据文件
- android 记住多个账号,Android实现记住账号密码功能