|
dingjun123 发表于 2013-5-6 17:37 ![]()
大家尽情举例dblink操作的优化啊,我补充补充,
兔哥,我这有条sql 真不知道怎么优化了,用了dblink之后就很慢了
原sql:
select *
from (select rownum num, temp.*
from (select a.fid,
a.codenum,
a.parentcode,
a.remittername,
a.remitAccount,
a.receiveaddress,
a.accountname,
a.openbank,
a.accountno,
a.claimamount,
a.reachamountdate,
a.remitmethod,
b.type remittype,
c.category amountscategory,
a.belregion,
a.claimstate,
a.turnamountstate,
a.claimtime,
a.turnamounttime,
d.deptname remitdepart,
a.remitaccountdate,
a.writeoffstate,
a.statementsencode,
a.transportinvoice,
a.alreadyamount,
a.unuseamount,
a.remark,
f.empname addperson,
a.addtime,
g.empname updateperson,
a.totamount,
h.empname claimman,
a.status,
a.fundCompany,
a.recBelong,
k.principal,
a.updateTime,
a.repealState,
a.remitdepart remitDeptCode,
a.claimType,
s.sname as supplier,
a.payAppForm,
cus.fname_l2 as customer,
a.supplier as supplierCode,
a.customer as customerCode,
a.transactionId,
i.opendate as recipIssu,
j.empname as recipIssuName,
i.deposityno as recipIssuCode,
a.collectiontype as collectiontype,
y.deptname as playdeptName,
a.playdeptname as playdeptNameCode
from t_claim_remittancerecord a
left join t_pay_remittype b
on a.remittype = b.fid
left join t_pay_fundtype c
on c.fid = a.amountscategory
left join t_org_department d
on a.remitdepart = d.finasyscode
left join t_org_department y
on a.playdeptname = y.finasyscode
and y.status = 1
left join t_org_employee f
on f.empcode = a.addperson
left join t_org_department k
on f.deptid = k.id
left join t_org_employee g
on g.empcode = a.updateperson
left join t_org_employee h
on h.empcode = a.claimman
left join t_bd_customer cus
on cus.fnumber = a.customer
left join V_LMS_SUPPLIER s
on s.snumber = a.supplier
left join t_deposit_printer i
on i.codenum = a.codenum
left join t_org_employee j
on i.createuser = j.empcode
WHERE 1 = 1
and a.writeOffState like '%未核销%'
and a.reachAmountDate between to_date('2014-01-01','yyyy-mm-dd') and to_date('2014-04-01','yyyy-mm-dd')
and a.repealstate != 1
order by addTime desc, codeNum) temp) t WHERE t.num<=50 and t.num>0
Plan hash value: 3345438767
--------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 27687 | 99M| | 23407 (1)| 00:04:41 |
|* 1 | VIEW | | 27687 | 99M| | 23407 (1)| 00:04:41 |
| 2 | COUNT | | | | | | |
| 3 | VIEW | | 27687 | 99M| | 23407 (1)| 00:04:41 |
| 4 | SORT ORDER BY | | 27687 | 20M| 21M| 23407 (1)| 00:04:41 |
|* 5 | HASH JOIN RIGHT OUTER | | 27687 | 20M| | 18829 (1)| 00:03:46 |
| 6 | TABLE ACCESS FULL | T_BD_CUSTOMER | 27281 | 1012K| | 1847 (1)| 00:00:23 |
|* 7 | HASH JOIN RIGHT OUTER | | 27628 | 19M| | 16980 (1)| 00:03:24 |
|* 8 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 11447 | 413K| | 137 (1)| 00:00:02 |
|* 9 | HASH JOIN RIGHT OUTER | | 27628 | 18M| | 16842 (1)| 00:03:23 |
|* 10 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 10843 | 423K| | 137 (1)| 00:00:02 |
|* 11 | HASH JOIN RIGHT OUTER | | 27628 | 17M| | 16704 (1)| 00:03:21 |
| 12 | VIEW | index$_join$_028 | 1516 | 80348 | | 28 (4)| 00:00:01 |
|* 13 | HASH JOIN | | | | | | |
|* 14 | HASH JOIN | | | | | | |
|* 15 | INDEX RANGE SCAN | IDX_T_BD_FUSEDSTATUS | 1516 | 80348 | | 2 (0)| 00:00:01 |
| 16 | INDEX FAST FULL SCAN | IDX_BD_SUPPLIER_NUM | 1516 | 80348 | | 6 (0)| 00:00:01 |
|* 17 | INDEX FAST FULL SCAN | IX_SUPPNAME | 1516 | 80348 | | 23 (0)| 00:00:01 |
|* 18 | HASH JOIN RIGHT OUTER | | 27628 | 16M| | 16675 (1)| 00:03:21 |
| 19 | TABLE ACCESS FULL | T_PAY_REMITTYPE | 8 | 168 | | 3 (0)| 00:00:01 |
|* 20 | HASH JOIN RIGHT OUTER | | 27628 | 15M| | 16671 (1)| 00:03:21 |
| 21 | TABLE ACCESS FULL | T_PAY_FUNDTYPE | 33 | 1023 | | 3 (0)| 00:00:01 |
|* 22 | HASH JOIN RIGHT OUTER | | 27628 | 14M| | 16668 (1)| 00:03:21 |
| 23 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 16422 | 176K| | 137 (1)| 00:00:02 |
|* 24 | HASH JOIN RIGHT OUTER | | 27628 | 14M| 5048K| 16530 (1)| 00:03:19 |
| 25 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 3317K| | 892 (1)| 00:00:11 |
|* 26 | HASH JOIN RIGHT OUTER | | 27628 | 13M| 4328K| 14680 (1)| 00:02:57 |
| 27 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 2596K| | 892 (1)| 00:00:11 |
|* 28 | HASH JOIN RIGHT OUTER | | 27628 | 13M| 4328K| 12889 (1)| 00:02:35 |
| 29 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 2596K| | 892 (1)| 00:00:11 |
| 30 | NESTED LOOPS OUTER | | 27628 | 13M| | 11121 (1)| 00:02:14 |
|* 31 | HASH JOIN RIGHT OUTER | | 27628 | 12M| | 11120 (1)| 00:02:14 |
| 32 | TABLE ACCESS FULL | T_DEPOSIT_PRINTER | 420 | 28980 | | 5 (0)| 00:00:01 |
|* 33 | TABLE ACCESS BY INDEX ROWID| T_CLAIM_REMITTANCERECORD | 27628 | 10M| | 11114 (1)| 00:02:14 |
|* 34 | INDEX SKIP SCAN | IDX_REMIT_COMP4 | 27714 | | | 5402 (1)| 00:01:05 |
| 35 | TABLE ACCESS BY INDEX ROWID | T_ORG_EMPLOYEE | 1 | 18 | | 1 (0)| 00:00:01 |
|* 36 | INDEX UNIQUE SCAN | UK_EMPLOYEE_EMPCODE | 1 | | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T"."NUM">0 AND "T"."NUM"<=50)
5 - access("CUS"."FNUMBER"(+)=SYS_OP_C2C("A"."CUSTOMER"))
7 - access("A"."REMITDEPART"="D"."FINASYSCODE"(+))
8 - filter("D"."FINASYSCODE"(+) IS NOT NULL)
9 - access("A"."PLAYDEPTNAME"="Y"."FINASYSCODE"(+))
10 - filter("Y"."FINASYSCODE"(+) IS NOT NULL AND "Y"."STATUS"(+)=1)
11 - access("FNUMBER"(+)=SYS_OP_C2C("A"."SUPPLIER"))
13 - access(ROWID=ROWID)
14 - access(ROWID=ROWID)
15 - access("FUSEDSTATUS"=1)
17 - filter("FUSEDSTATUS"=1)
18 - access("A"."REMITTYPE"="B"."FID"(+))
20 - access("C"."FID"(+)="A"."AMOUNTSCATEGORY")
22 - access("F"."DEPTID"="K"."ID"(+))
24 - access("F"."EMPCODE"(+)="A"."ADDPERSON")
26 - access("G"."EMPCODE"(+)="A"."UPDATEPERSON")
28 - access("H"."EMPCODE"(+)="A"."CLAIMMAN")
31 - access("I"."CODENUM"(+)="A"."CODENUM")
33 - filter("A"."REPEALSTATE"<>1)
34 - access("A"."REACHAMOUNTDATE">=TIMESTAMP' 2014-01-01 00:00:00' AND "A"."REACHAMOUNTDATE"<=TIMESTAMP' 2014-04-01
00:00:00')
filter("A"."REACHAMOUNTDATE">=TIMESTAMP' 2014-01-01 00:00:00' AND "A"."WRITEOFFSTATE" LIKE '%未核销%' AND
"A"."REACHAMOUNTDATE"<=TIMESTAMP' 2014-04-01 00:00:00' AND "A"."WRITEOFFSTATE" IS NOT NULL)
36 - access("I"."CREATEUSER"="J"."EMPCODE"(+))
迁移后的sql:
select *
from (select rownum num, temp.*
from (select a.fid,
a.codenum,
a.parentcode,
a.remittername,
a.remitAccount,
a.receiveaddress,
a.accountname,
a.openbank,
a.accountno,
a.claimamount,
a.reachamountdate,
a.remitmethod,
b.type remittype,
c.category amountscategory,
a.belregion,
a.claimstate,
a.turnamountstate,
a.claimtime,
a.turnamounttime,
d.deptname remitdepart,
a.remitaccountdate,
a.writeoffstate,
a.statementsencode,
a.transportinvoice,
a.alreadyamount,
a.unuseamount,
a.remark,
f.empname addperson,
a.addtime,
g.empname updateperson,
a.totamount,
h.empname claimman,
a.status,
a.fundCompany,
a.recBelong,
k.principal,
a.updateTime,
a.repealState,
a.remitdepart remitDeptCode,
a.claimType,
s.sname as supplier,
a.payAppForm,
cus.fname_l2 as customer,
a.supplier as supplierCode,
a.customer as customerCode,
a.transactionId,
i.opendate as recipIssu,
j.empname as recipIssuName,
i.deposityno as recipIssuCode,
a.collectiontype as collectiontype,
y.deptname as playdeptName,
a.playdeptname as playdeptNameCode
from t_claim_remittancerecord a
left join t_pay_remittype b
on a.remittype = b.fid
left join t_pay_fundtype c
on c.fid = a.amountscategory
left join t_org_department d
on a.remitdepart = d.finasyscode
left join t_org_department y
on a.playdeptname = y.finasyscode
and y.status = 1
left join t_org_employee f
on f.empcode = a.addperson
left join t_org_department k
on f.deptid = k.id
left join t_org_employee g
on g.empcode = a.updateperson
left join t_org_employee h
on h.empcode = a.claimman
left join t_bd_customer@dipfin cus
on cus.fnumber = a.customer
left join V_LMS_SUPPLIER@difpin s
on s.snumber = a.supplier
left join t_deposit_printer i
on i.codenum = a.codenum
left join t_org_employee j
on i.createuser = j.empcode
WHERE 1 = 1
and a.writeOffState like '%未核销%'
and a.reachAmountDate between to_date('2014-01-01','yyyy-mm-dd') and to_date('2014-04-01','yyyy-mm-dd')
and a.repealstate != 1
order by addTime desc, codeNum) temp) t WHERE t.num<=50 and t.num>0
Plan hash value: 3877825334
--------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Inst |IN-OUT|
--------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 27687 | 99M| | 38384 (1)| 00:07:41 | | |
|* 1 | VIEW | | 27687 | 99M| | 38384 (1)| 00:07:41 | | |
| 2 | COUNT | | | | | | | | |
| 3 | VIEW | | 27687 | 99M| | 38384 (1)| 00:07:41 | | |
| 4 | SORT ORDER BY | | 27687 | 87M| 108M| 38384 (1)| 00:07:41 | | |
| 5 | NESTED LOOPS OUTER | | 27687 | 87M| | 19309 (1)| 00:03:52 | | |
|* 6 | HASH JOIN RIGHT OUTER | | 27687 | 86M| | 19308 (1)| 00:03:52 | | |
| 7 | TABLE ACCESS FULL | T_DEPOSIT_PRINTER | 420 | 28980 | | 5 (0)| 00:00:01 | | |
| 8 | VIEW | | 27687 | 84M| | 19302 (1)| 00:03:52 | | |
|* 9 | HASH JOIN RIGHT OUTER | | 27687 | 88M| | 19302 (1)| 00:03:52 | | |
| 10 | REMOTE | V_LMS_SUPPLIER | 1936 | 956K| | 66 (0)| 00:00:01 | DIPFIN | R->S |
| 11 | VIEW | | 27687 | 74M| | 19235 (1)| 00:03:51 | | |
|* 12 | HASH JOIN RIGHT OUTER | | 27687 | 24M| 8632K| 19235 (1)| 00:03:51 | | |
| 13 | REMOTE | T_BD_CUSTOMER | 27281 | 8312K| | 1184 (1)| 00:00:15 | DIPFIN | R->S |
|* 14 | HASH JOIN RIGHT OUTER | | 27628 | 15M| | 16821 (1)| 00:03:22 | | |
| 15 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 16422 | 176K| | 137 (1)| 00:00:02 | | |
|* 16 | HASH JOIN RIGHT OUTER | | 27628 | 15M| | 16683 (1)| 00:03:21 | | |
|* 17 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 11447 | 413K| | 137 (1)| 00:00:02 | | |
|* 18 | HASH JOIN RIGHT OUTER | | 27628 | 14M| | 16545 (1)| 00:03:19 | | |
|* 19 | TABLE ACCESS FULL | T_ORG_DEPARTMENT | 10843 | 423K| | 137 (1)| 00:00:02 | | |
|* 20 | HASH JOIN RIGHT OUTER | | 27628 | 13M| 5048K| 16407 (1)| 00:03:17 | | |
| 21 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 3317K| | 897 (2)| 00:00:11 | | |
|* 22 | HASH JOIN RIGHT OUTER | | 27628 | 13M| 4328K| 14598 (1)| 00:02:56 | | |
| 23 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 2596K| | 897 (2)| 00:00:11 | | |
|* 24 | HASH JOIN RIGHT OUTER | | 27628 | 12M| 4328K| 12848 (1)| 00:02:35 | | |
| 25 | TABLE ACCESS FULL | T_ORG_EMPLOYEE | 147K| 2596K| | 897 (2)| 00:00:11 | | |
|* 26 | HASH JOIN RIGHT OUTER | | 27628 | 12M| | 11122 (1)| 00:02:14 | | |
| 27 | TABLE ACCESS FULL | T_PAY_FUNDTYPE | 33 | 1023 | | 3 (0)| 00:00:01 | | |
|* 28 | HASH JOIN RIGHT OUTER | | 27628 | 11M| | 11118 (1)| 00:02:14 | | |
| 29 | TABLE ACCESS FULL | T_PAY_REMITTYPE | 8 | 168 | | 3 (0)| 00:00:01 | | |
|* 30 | TABLE ACCESS BY INDEX ROWID| T_CLAIM_REMITTANCERECORD | 27628 | 10M| | 11114 (1)| 00:02:14 | | |
|* 31 | INDEX SKIP SCAN | IDX_REMIT_COMP4 | 27714 | | | 5402 (1)| 00:01:05 | | |
| 32 | TABLE ACCESS BY INDEX ROWID | T_ORG_EMPLOYEE | 1 | 18 | | 1 (0)| 00:00:01 | | |
|* 33 | INDEX UNIQUE SCAN | UK_EMPLOYEE_EMPCODE | 1 | | | 1 (0)| 00:00:01 | | |
--------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T"."NUM">0 AND "T"."NUM"<=50)
6 - access("I"."CODENUM"(+)="A"."CODENUM")
9 - access("S"."SNUMBER"(+)=SYS_OP_C2C("A"."SUPPLIER"))
12 - access("CUS"."FNUMBER"(+)=SYS_OP_C2C("A"."CUSTOMER"))
14 - access("F"."DEPTID"="K"."ID"(+))
16 - access("A"."REMITDEPART"="D"."FINASYSCODE"(+))
17 - filter("D"."FINASYSCODE"(+) IS NOT NULL)
18 - access("A"."PLAYDEPTNAME"="Y"."FINASYSCODE"(+))
19 - filter("Y"."FINASYSCODE"(+) IS NOT NULL AND "Y"."STATUS"(+)=1)
20 - access("F"."EMPCODE"(+)="A"."ADDPERSON")
22 - access("H"."EMPCODE"(+)="A"."CLAIMMAN")
24 - access("G"."EMPCODE"(+)="A"."UPDATEPERSON")
26 - access("C"."FID"(+)="A"."AMOUNTSCATEGORY")
28 - access("A"."REMITTYPE"="B"."FID"(+))
30 - filter("A"."REPEALSTATE"<>1)
31 - access("A"."REACHAMOUNTDATE">=TIMESTAMP' 2014-01-01 00:00:00' AND "A"."REACHAMOUNTDATE"<=TIMESTAMP' 2014-04-01 00:00:00')
filter("A"."REACHAMOUNTDATE">=TIMESTAMP' 2014-01-01 00:00:00' AND "A"."WRITEOFFSTATE" LIKE '%未核销%' AND
"A"."REACHAMOUNTDATE"<=TIMESTAMP' 2014-04-01 00:00:00' AND "A"."WRITEOFFSTATE" IS NOT NULL)
33 - access("I"."CREATEUSER"="J"."EMPCODE"(+))
Remote SQL Information (identified by operation id):
----------------------------------------------------
10 - SELECT "SNUMBER","SNAME" FROM "V_LMS_SUPPLIER" "S" (accessing 'DIPFIN' )
13 - SELECT "FNAME_L2","FNUMBER" FROM "T_BD_CUSTOMER" "CUS" (accessing 'DIPFIN' )
|
|