SQL> select sum(nvl(GetBusinessZongE('BusinessApprove', BA.SerialNo), 0)) as BusinessSum,
sum(nvl(GetBusinessChangKou('BusinessApprove', BA.SerialNo), 0)) as ApproveSum
from Business_Approve BA
where 1 = 1
and not exists (select 'x'
from Business_Contract
where RelativeSerialNo = BA.SerialNo)
and BA.StatusFlag is null
and exists
(select 'x'
from Customer_Info
where (EMcCustomerID = '' or CustomerID = '20131119000089')
and
(
(BA.CustomerID = CustomerID and BA.BusinessType <> '1020040') or
(BA.ThirdPartyID2 = CustomerID and BA.BusinessType = '1020040')
)
)
and (BA.BusinessType like '1%' or BA.BusinessType like '2%')
and BA.BusinessType not in
('1110008040', '1110008041', '1110008042', '4010', '4020'); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
BUSINESSSUM APPROVESUM
----------- ----------
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 8kxqnmdm3qfk1, child number 0
-------------------------------------
select sum(nvl(GetBusinessZongE('BusinessApprove', BA.SerialNo), 0)) as
BusinessSum, sum(nvl(GetBusinessChangKou('BusinessApprove',
BA.SerialNo), 0)) as ApproveSum from Business_Approve BA where 1 = 1
and not exists (select 'x' from Business_Contract
where RelativeSerialNo = BA.SerialNo) and BA.StatusFlag is null
and exists (select 'x' from Customer_Info where
(EMcCustomerID = '' or CustomerID = '20131119000089') and
( (BA.CustomerID = CustomerID and BA.BusinessType <>
'1020040') or (BA.ThirdPartyID2 = CustomerID and
BA.BusinessType = '1020040') ) ) and (BA.BusinessType
like '1%' or BA.BusinessType like '2%') and BA.BusinessType not in
('1110008040', '1110008041', '1110008042', '4010', '4020')
Plan hash value: 1312284355
--------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:01.72 | 23998 | 23097 | | | |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:01.72 | 23998 | 23097 | | | |
|* 2 | FILTER | | 1 | | 0 |00:00:01.72 | 23998 | 23097 | | | |
|* 3 | HASH JOIN RIGHT ANTI | | 1 | 1457 | 139 |00:00:01.72 | 23849 | 23097 | 11M| 4048K| 13M (0)|
|* 4 | INDEX FAST FULL SCAN| PK_BC_RELATIVESERIALNO | 1 | 202K| 202K|00:00:00.06 | 744 | 0 | | | |
|* 5 | TABLE ACCESS FULL | BUSINESS_APPROVE | 1 | 145K| 160K|00:00:01.29 | 23105 | 23097 | | | |
|* 6 | INDEX UNIQUE SCAN | BIN$oTAOXbMjMHLgQwoCgBIwcg==$0 | 139 | 1 | 0 |00:00:00.01 | 149 | 0 | | | |
--------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter( IS NOT NULL)
3 - access("RELATIVESERIALNO"="BA"."SERIALNO")
4 - filter("RELATIVESERIALNO" IS NOT NULL)
5 - filter((("BA"."BUSINESSTYPE" LIKE '1%' OR "BA"."BUSINESSTYPE" LIKE '2%') AND "BA"."STATUSFLAG" IS NULL AND
"BA"."BUSINESSTYPE"<>'1110008040' AND "BA"."BUSINESSTYPE"<>'4010' AND "BA"."BUSINESSTYPE"<>'1110008042' AND "BA"."BUSINESSTYPE"<>'1110008041'
AND "BA"."BUSINESSTYPE"<>'4020'))
6 - access("CUSTOMERID"='20131119000089')
filter((("CUSTOMERID"=:B1 AND :B2<>'1020040') OR ("CUSTOMERID"=:B3 AND :B4='1020040')))
41 rows selected.
SQL> explain plan for select sum(nvl(GetBusinessZongE('BusinessApprove', BA.SerialNo), 0)) as BusinessSum,
sum(nvl(GetBusinessChangKou('BusinessApprove', BA.SerialNo), 0)) as ApproveSum
from Business_Approve BA
where 1 = 1
and not exists (select 'x'
from Business_Contract
where RelativeSerialNo = BA.SerialNo)
and BA.StatusFlag is null
and exists
(select 'x'
from Customer_Info
where (EMcCustomerID = '' or CustomerID = '20131119000089')
and
(
(BA.CustomerID = CustomerID and BA.BusinessType <> '1020040') or
(BA.ThirdPartyID2 = CustomerID and BA.BusinessType = '1020040')
)
)
and (BA.BusinessType like '1%' or BA.BusinessType like '2%')
and BA.BusinessType not in
('1110008040', '1110008041', '1110008042', '4010', '4020'); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Explained.
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1312284355
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 58 | | 8626 (1)| 00:01:44 |
| 1 | SORT AGGREGATE | | 1 | 58 | | | |
|* 2 | FILTER | | | | | | |
|* 3 | HASH JOIN RIGHT ANTI | | 1457 | 84506 | 4936K| 7169 (1)| 00:01:27 |
|* 4 | INDEX FAST FULL SCAN| PK_BC_RELATIVESERIALNO | 202K| 2565K| | 201 (1)| 00:00:03 |
|* 5 | TABLE ACCESS FULL | BUSINESS_APPROVE | 145K| 6403K| | 6334 (1)| 00:01:17 |
|* 6 | INDEX UNIQUE SCAN | BIN$oTAOXbMjMHLgQwoCgBIwcg==$0 | 1 | 16 | | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter( EXISTS (SELECT 0 FROM "CUSTOMER_INFO" "CUSTOMER_INFO" WHERE "CUSTOMERID"='20131119000089'
AND ("CUSTOMERID"=:B1 AND :B2<>'1020040' OR "CUSTOMERID"=:B3 AND :B4='1020040')))
3 - access("RELATIVESERIALNO"="BA"."SERIALNO")
4 - filter("RELATIVESERIALNO" IS NOT NULL)
5 - filter(("BA"."BUSINESSTYPE" LIKE '1%' OR "BA"."BUSINESSTYPE" LIKE '2%') AND "BA"."STATUSFLAG" IS
NULL AND "BA"."BUSINESSTYPE"<>'1110008040' AND "BA"."BUSINESSTYPE"<>'4010' AND
"BA"."BUSINESSTYPE"<>'1110008042' AND "BA"."BUSINESSTYPE"<>'1110008041' AND "BA"."BUSINESSTYPE"<>'4020')
6 - access("CUSTOMERID"='20131119000089')
filter("CUSTOMERID"=:B1 AND :B2<>'1020040' OR "CUSTOMERID"=:B3 AND :B4='1020040')
26 rows selected.
改写成;
select sum(nvl(GetBusinessZongE('BusinessApprove', BA.SerialNo), 0)) as BusinessSum,
sum(nvl(GetBusinessChangKou('BusinessApprove', BA.SerialNo), 0)) as ApproveSum
from Business_Approve BA
inner join (select CustomerID from Customer_Info
where (EMcCustomerID = '' or CustomerID = '20131119000089')
group by CustomerID) Customer_Info
on ((case when BA.BusinessType= '1020040' then BA.ThirdPartyID2 else BA.CustomerID end))=Customer_Info.CustomerID
where 1 = 1
and not exists (select 'x'
from Business_Contract
where RelativeSerialNo = BA.SerialNo)
and BA.StatusFlag is null
and (BA.BusinessType like '1%' or BA.BusinessType like '2%')
and BA.BusinessType not in
('1110008040', '1110008041', '1110008042', '4010', '4020');