热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VIEWPUSHEDPREDICATE(谓词推入)引发的惨剧

帮网友调SQLhttp:www.itpub.netforum.php?modviewthread&tid1492997&extrapageD1%3D&page1原

帮网友调SQL

http://www.itpub.net/forum.php?mod=viewthread&tid=1492997&extra=pageD1%3D&page=1

原SQL如下(要跑1个多小时):

SELECT *
FROM (SELECT A.INVOICE_ID,
A.VENDOR_ID,
A.INVOICE_NUM,
A.INVOICE_AMOUNT,
A.GL_DATE,
A.INVOICE_CURRENCY_CODE,
SUM(NVL(B.PREPAY_AMOUNT_APPLIED, 0)) PAID_AMOUNT,
A.INVOICE_AMOUNT - SUM(NVL(B.PREPAY_AMOUNT_APPLIED, 0)) REMAIN
FROM ap.AP_INVOICES_ALL A, APPS.AP_UNAPPLY_PREPAYS_V B
WHERE A.INVOICE_ID = B.INVOICE_ID(+)
AND A.ORG_ID = 126 /*:B4*/
AND A.SOURCE = 'OSM IMPORTED' /*:B3*/
AND A.INVOICE_NUM BETWEEN NVL( /*:B2*/ null, A.INVOICE_NUM) AND
NVL( /*:B1*/ null, A.INVOICE_NUM)
GROUP BY A.INVOICE_ID,
A.INVOICE_NUM,
A.INVOICE_AMOUNT,
A.VENDOR_ID,
A.GL_DATE,
A.INVOICE_CURRENCY_CODE)
WHERE REMAIN > 0 ;

B是一个视图,定义如下:

CREATE OR REPLACE VIEW APPS.AP_UNAPPLY_PREPAYS_V AS
SELECT AID1.ROWID ROW_ID,
AID1.INVOICE_ID INVOICE_ID,
AID1.INVOICE_DISTRIBUTION_ID INVOICE_DISTRIBUTION_ID,
AID1.PREPAY_DISTRIBUTION_ID PREPAY_DISTRIBUTION_ID,
AID1.DISTRIBUTION_LINE_NUMBER PREPAY_DIST_NUMBER,
(-1) * AID1.AMOUNT PREPAY_AMOUNT_APPLIED,
nvl(AID2.PREPAY_AMOUNT_REMAINING, AID2.AMOUNT) PREPAY_AMOUNT_REMAINING,
AID1.DIST_CODE_COMBINATION_ID DIST_CODE_COMBINATION_ID,
AID1.ACCOUNTING_DATE ACCOUNTING_DATE,
AID1.PERIOD_NAME PERIOD_NAME,
AID1.SET_OF_BOOKS_ID SET_OF_BOOKS_ID,
AID1.DESCRIPTION DESCRIPTION,
AID1.PO_DISTRIBUTION_ID PO_DISTRIBUTION_ID,
AID1.RCV_TRANSACTION_ID RCV_TRANSACTION_ID,
AID1.ORG_ID ORG_ID,
AI.INVOICE_NUM PREPAY_NUMBER,
AI.VENDOR_ID VENDOR_ID,
AI.VENDOR_SITE_ID VENDOR_SITE_ID,
ATC.TAX_ID TAX_ID,
ATC.NAME TAX_CODE,
PH.SEGMENT1 PO_NUMBER,
PV.VENDOR_NAME VENDOR_NAME,
PV.SEGMENT1 VENDOR_NUMBER,
PVS.VENDOR_SITE_CODE VENDOR_SITE_CODE,
RSH.RECEIPT_NUM RECEIPT_NUMBER
FROM AP_INVOICES AI,
AP_INVOICE_DISTRIBUTIONS AID1,
AP_INVOICE_DISTRIBUTIONS AID2,
AP_TAX_CODES ATC,
PO_VENDORS PV,
PO_VENDOR_SITES PVS,
PO_DISTRIBUTIONS PD,
PO_HEADERS PH,
PO_LINES PL,
PO_LINE_LOCATIONS PLL,
RCV_TRANSACTIONS RTXNS,
RCV_SHIPMENT_HEADERS RSH,
RCV_SHIPMENT_LINES RSL
WHERE AID1.PREPAY_DISTRIBUTION_ID = AID2.INVOICE_DISTRIBUTION_ID
AND AI.INVOICE_ID = AID2.INVOICE_ID
AND AID1.AMOUNT <0
AND nvl(AID1.REVERSAL_FLAG, 'N') != 'Y'
AND AID1.TAX_CODE_ID = ATC.TAX_ID(+)
AND AID1.LINE_TYPE_LOOKUP_CODE = 'PREPAY'
AND AI.VENDOR_ID = PV.VENDOR_ID
AND AI.VENDOR_SITE_ID = PVS.VENDOR_SITE_ID
AND AID1.PO_DISTRIBUTION_ID = PD.PO_DISTRIBUTION_ID(+)
AND PD.PO_HEADER_ID = PH.PO_HEADER_ID(+)
AND PD.LINE_LOCATION_ID = PLL.LINE_LOCATION_ID(+)
AND PLL.PO_LINE_ID = PL.PO_LINE_ID(+)
AND AID1.RCV_TRANSACTION_ID = RTXNS.TRANSACTION_ID(+)
AND RTXNS.SHIPMENT_LINE_ID = RSL.SHIPMENT_LINE_ID(+)
AND RSL.SHIPMENT_HEADER_ID = RSH.SHIPMENT_HEADER_ID(+);


执行计划如下:

SQL> @$ORACLE_HOME/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 722 |
|* 1 | FILTER | | | | |
| 2 | SORT GROUP BY | | 1 | 69 | 722 |
| 3 | NESTED LOOPS OUTER | | 3 | 207 | 697 |
|* 4 | TABLE ACCESS FULL | AP_INVOICES_ALL | 3 | 153 | 694 |
| 5 | VIEW PUSHED PREDICATE | AP_UNAPPLY_PREPAYS_V | 1 | 18 | 1 |
| 6 | NESTED LOOPS | | 1 | 372 | 3 |
| 7 | NESTED LOOPS | | 1 | 368 | 3 |
| 8 | NESTED LOOPS | | 1 | 361 | 2 |
| 9 | NESTED LOOPS | | 1 | 347 | 1 |
| 10 | NESTED LOOPS OUTER | | 1 | 334 | 1 |
| 11 | NESTED LOOPS OUTER | | 1 | 321 | 1 |
| 12 | NESTED LOOPS OUTER | | 1 | 295 | 1 |
| 13 | NESTED LOOPS OUTER | | 1 | 269 | 1 |
| 14 | NESTED LOOPS OUTER | | 1 | 243 | 1 |
| 15 | NESTED LOOPS OUTER | | 1 | 197 | 1 |
| 16 | NESTED LOOPS OUTER | | 1 | 157 | 1 |
| 17 | NESTED LOOPS OUTER | | 1 | 98 | 1 |
|* 18 | TABLE ACCESS BY INDEX ROWID| AP_INVOICE_DISTRIBUTIONS_ALL | 1 | 72 | 1 |
|* 19 | INDEX FULL SCAN | AP_INVOICE_DISTRIBUTIONS_N20 | 1 | | |
|* 20 | TABLE ACCESS BY INDEX ROWID| AP_TAX_CODES_ALL | 1 | 26 | |
|* 21 | INDEX UNIQUE SCAN | AP_TAX_CODES_U1 | 1 | | |
|* 22 | TABLE ACCESS BY INDEX ROWID | PO_DISTRIBUTIONS_ALL | 1 | 59 | |
|* 23 | INDEX UNIQUE SCAN | PO_DISTRIBUTIONS_U1 | 1 | | |
|* 24 | TABLE ACCESS BY INDEX ROWID | PO_HEADERS_ALL | 1 | 40 | |
|* 25 | INDEX UNIQUE SCAN | PO_HEADERS_U1 | 1 | | |
|* 26 | TABLE ACCESS BY INDEX ROWID | PO_LINE_LOCATIONS_ALL | 1 | 46 | |
|* 27 | INDEX UNIQUE SCAN | PO_LINE_LOCATIONS_U1 | 1 | | |
|* 28 | TABLE ACCESS BY INDEX ROWID | PO_LINES_ALL | 1 | 26 | |
|* 29 | INDEX UNIQUE SCAN | PO_LINES_U1 | 1 | | |
| 30 | TABLE ACCESS BY INDEX ROWID | RCV_TRANSACTIONS | 1 | 26 | |
|* 31 | INDEX UNIQUE SCAN | RCV_TRANSACTIONS_U1 | 1 | | |
| 32 | TABLE ACCESS BY INDEX ROWID | RCV_SHIPMENT_LINES | 1 | 26 | |
|* 33 | INDEX UNIQUE SCAN | RCV_SHIPMENT_LINES_U1 | 1 | | |
|* 34 | INDEX UNIQUE SCAN | RCV_SHIPMENT_HEADERS_U1 | 1 | 13 | |
|* 35 | TABLE ACCESS BY INDEX ROWID | AP_INVOICE_DISTRIBUTIONS_ALL | 1 | 13 | |
|* 36 | INDEX UNIQUE SCAN | AP_INVOICE_DISTRIBUTIONS_U2 | 1 | | |
|* 37 | TABLE ACCESS BY INDEX ROWID | AP_INVOICES_ALL | 1 | 14 | 1 |
|* 38 | INDEX UNIQUE SCAN | AP_INVOICES_U1 | 1 | | |
|* 39 | TABLE ACCESS BY INDEX ROWID | PO_VENDOR_SITES_ALL | 1 | 7 | 1 |
|* 40 | INDEX UNIQUE SCAN | PO_VENDOR_SITES_U1 | 1 | | |
|* 41 | INDEX UNIQUE SCAN | PO_VENDORS_U1 | 1 | 4 | |
-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("A"."INVOICE_AMOUNT"-SUM(NVL("B"."PREPAY_AMOUNT_APPLIED",0))>0)
4 - filter("A"."ORG_ID"=126 AND "A"."SOURCE"='OSM IMPORTED' AND
"A"."INVOICE_NUM">=NVL(NULL,"A"."INVOICE_NUM") AND "A"."INVOICE_NUM"<=NVL(NULL,"A"."INVOICE_NUM"))
18 - filter("A"."INVOICE_ID"="AP_INVOICE_DISTRIBUTIONS_ALL"."INVOICE_ID" AND
"AP_INVOICE_DISTRIBUTIONS_ALL"."AMOUNT"<0 AND NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."REVERSAL_FLAG",'N')<>'Y'
AND "AP_INVOICE_DISTRIBUTIONS_ALL"."LINE_TYPE_LOOKUP_CODE"='PREPAY' AND
NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
19 - filter("AP_INVOICE_DISTRIBUTIONS_ALL"."PREPAY_DISTRIBUTION_ID" IS NOT NULL)
20 - filter(NVL("AP_TAX_CODES_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
21 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."TAX_CODE_ID"="AP_TAX_CODES_ALL"."TAX_ID"(+))
22 - filter(NVL("PO_DISTRIBUTIONS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
23 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."PO_DISTRIBUTION_ID"="PO_DISTRIBUTIONS_ALL"."PO_DISTRIBUTION_ID"
(+))
24 - filter(NVL("PO_HEADERS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
25 - access("PO_DISTRIBUTIONS_ALL"."PO_HEADER_ID"="PO_HEADERS_ALL"."PO_HEADER_ID"(+))
26 - filter(NVL("PO_LINE_LOCATIONS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
27 - access("PO_DISTRIBUTIONS_ALL"."LINE_LOCATION_ID"="PO_LINE_LOCATIONS_ALL"."LINE_LOCATION_ID"(+))
28 - filter(NVL("PO_LINES_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
29 - access("PO_LINE_LOCATIONS_ALL"."PO_LINE_ID"="PO_LINES_ALL"."PO_LINE_ID"(+))
31 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."RCV_TRANSACTION_ID"="RTXNS"."TRANSACTION_ID"(+))
33 - access("RTXNS"."SHIPMENT_LINE_ID"="RSL"."SHIPMENT_LINE_ID"(+))
34 - access("RSL"."SHIPMENT_HEADER_ID"="RSH"."SHIPMENT_HEADER_ID"(+))
35 - filter(NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
36 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."PREPAY_DISTRIBUTION_ID"="AP_INVOICE_DISTRIBUTIONS_ALL"."INVOICE
_DISTRIBUTION_ID")
37 - filter(NVL("AP_INVOICES_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
38 - access("AP_INVOICES_ALL"."INVOICE_ID"="AP_INVOICE_DISTRIBUTIONS_ALL"."INVOICE_ID")
39 - filter(NVL("PO_VENDOR_SITES_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
40 - access("AP_INVOICES_ALL"."VENDOR_SITE_ID"="PO_VENDOR_SITES_ALL"."VENDOR_SITE_ID")
41 - access("AP_INVOICES_ALL"."VENDOR_ID"="PV"."VENDOR_ID")

Note: cpu costing is off

92 rows selected.


看到 Note: cpu costing is off 我就知道DB 是9i

这个SQL语句要优化很简单,SQL调优做得太多了,看到index unique scan我就忽略它,因为它不会发生性能问题(相信我,遇到index unique scan你不要看它)

执行计划中引起我注意的地方有3个

1.VIEW PUSHED PREDICATE  表明它进行了谓词推入

18行,19行

从哪里看到有谓词推入呢? 请注意观察18行 A"."INVOICE_ID"="AP_INVOICE_DISTRIBUTIONS_ALL 这个就把A的过滤条件给推入了

谓词推入是双刃剑,但是我看到的更多的案例是谓词推入反而引发性能问题,问题的原因在于谓词推入后CBO计算基数就 大大减小了。

可以用hint use_hash 强制CBO走hash join,这样CBO就不能进行谓词推入了

SELECT *
FROM (SELECT /*+ use_hash(a,b) */ A.INVOICE_ID,
A.VENDOR_ID,
A.INVOICE_NUM,
A.INVOICE_AMOUNT,
A.GL_DATE,
A.INVOICE_CURRENCY_CODE,
SUM(NVL(B.PREPAY_AMOUNT_APPLIED, 0)) PAID_AMOUNT,
A.INVOICE_AMOUNT - SUM(NVL(B.PREPAY_AMOUNT_APPLIED, 0)) REMAIN
FROM ap.AP_INVOICES_ALL A, APPS.AP_UNAPPLY_PREPAYS_V B
WHERE A.INVOICE_ID = B.INVOICE_ID(+)
AND A.ORG_ID = 126 /*:B4*/
AND A.SOURCE = 'OSM IMPORTED' /*:B3*/
AND A.INVOICE_NUM BETWEEN NVL( /*:B2*/ null, A.INVOICE_NUM) AND
NVL( /*:B1*/ null, A.INVOICE_NUM)
GROUP BY A.INVOICE_ID,
A.INVOICE_NUM,
A.INVOICE_AMOUNT,
A.VENDOR_ID,
A.GL_DATE,
A.INVOICE_CURRENCY_CODE)
WHERE REMAIN > 0 ;


也可以 ALTER SESSION SET "_push_join_predicate" = FALSE;  效果一样,最终的执行计划如下:

SQL> @$ORACLE_HOME/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 723 |
|* 1 | FILTER | | | | |
| 2 | SORT GROUP BY | | 1 | 69 | 723 |
|* 3 | HASH JOIN OUTER | | 3 | 207 | 698 |
|* 4 | TABLE ACCESS FULL | AP_INVOICES_ALL | 3 | 153 | 694 |
| 5 | VIEW | AP_UNAPPLY_PREPAYS_V | 1 | 18 | 3 |
| 6 | NESTED LOOPS | | 1 | 372 | 3 |
| 7 | NESTED LOOPS | | 1 | 368 | 3 |
| 8 | NESTED LOOPS | | 1 | 361 | 2 |
| 9 | NESTED LOOPS | | 1 | 347 | 1 |
| 10 | NESTED LOOPS OUTER | | 1 | 334 | 1 |
| 11 | NESTED LOOPS OUTER | | 1 | 321 | 1 |
| 12 | NESTED LOOPS OUTER | | 1 | 295 | 1 |
| 13 | NESTED LOOPS OUTER | | 1 | 269 | 1 |
| 14 | NESTED LOOPS OUTER | | 1 | 243 | 1 |
| 15 | NESTED LOOPS OUTER | | 1 | 197 | 1 |
| 16 | NESTED LOOPS OUTER | | 1 | 157 | 1 |
| 17 | NESTED LOOPS OUTER | | 1 | 98 | 1 |
|* 18 | TABLE ACCESS BY INDEX ROWID| AP_INVOICE_DISTRIBUTIONS_ALL | 1 | 72 | 1 |
|* 19 | INDEX FULL SCAN | AP_INVOICE_DISTRIBUTIONS_N20 | 1 | | |
|* 20 | TABLE ACCESS BY INDEX ROWID| AP_TAX_CODES_ALL | 1 | 26 | |
|* 21 | INDEX UNIQUE SCAN | AP_TAX_CODES_U1 | 1 | | |
|* 22 | TABLE ACCESS BY INDEX ROWID | PO_DISTRIBUTIONS_ALL | 1 | 59 | |
|* 23 | INDEX UNIQUE SCAN | PO_DISTRIBUTIONS_U1 | 1 | | |
|* 24 | TABLE ACCESS BY INDEX ROWID | PO_HEADERS_ALL | 1 | 40 | |
|* 25 | INDEX UNIQUE SCAN | PO_HEADERS_U1 | 1 | | |
|* 26 | TABLE ACCESS BY INDEX ROWID | PO_LINE_LOCATIONS_ALL | 1 | 46 | |
|* 27 | INDEX UNIQUE SCAN | PO_LINE_LOCATIONS_U1 | 1 | | |
|* 28 | TABLE ACCESS BY INDEX ROWID | PO_LINES_ALL | 1 | 26 | |
|* 29 | INDEX UNIQUE SCAN | PO_LINES_U1 | 1 | | |
| 30 | TABLE ACCESS BY INDEX ROWID | RCV_TRANSACTIONS | 1 | 26 | |
|* 31 | INDEX UNIQUE SCAN | RCV_TRANSACTIONS_U1 | 1 | | |
| 32 | TABLE ACCESS BY INDEX ROWID | RCV_SHIPMENT_LINES | 1 | 26 | |
|* 33 | INDEX UNIQUE SCAN | RCV_SHIPMENT_LINES_U1 | 1 | | |
|* 34 | INDEX UNIQUE SCAN | RCV_SHIPMENT_HEADERS_U1 | 1 | 13 | |
|* 35 | TABLE ACCESS BY INDEX ROWID | AP_INVOICE_DISTRIBUTIONS_ALL | 1 | 13 | |
|* 36 | INDEX UNIQUE SCAN | AP_INVOICE_DISTRIBUTIONS_U2 | 1 | | |
|* 37 | TABLE ACCESS BY INDEX ROWID | AP_INVOICES_ALL | 1 | 14 | 1 |
|* 38 | INDEX UNIQUE SCAN | AP_INVOICES_U1 | 1 | | |
|* 39 | TABLE ACCESS BY INDEX ROWID | PO_VENDOR_SITES_ALL | 1 | 7 | 1 |
|* 40 | INDEX UNIQUE SCAN | PO_VENDOR_SITES_U1 | 1 | | |
|* 41 | INDEX UNIQUE SCAN | PO_VENDORS_U1 | 1 | 4 | |
-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("A"."INVOICE_AMOUNT"-SUM(NVL("B"."PREPAY_AMOUNT_APPLIED",0))>0)
3 - access("A"."INVOICE_ID"="B"."INVOICE_ID"(+))
4 - filter("A"."ORG_ID"=126 AND "A"."SOURCE"='OSM IMPORTED' AND
"A"."INVOICE_NUM">=NVL(NULL,"A"."INVOICE_NUM") AND "A"."INVOICE_NUM"<=NVL(NULL,"A"."INVOICE_NUM"))
18 - filter("AP_INVOICE_DISTRIBUTIONS_ALL"."AMOUNT"<0 AND
NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."REVERSAL_FLAG",'N')<>'Y' AND
"AP_INVOICE_DISTRIBUTIONS_ALL"."LINE_TYPE_LOOKUP_CODE"='PREPAY' AND
NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
19 - filter("AP_INVOICE_DISTRIBUTIONS_ALL"."PREPAY_DISTRIBUTION_ID" IS NOT NULL)
20 - filter(NVL("AP_TAX_CODES_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
21 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."TAX_CODE_ID"="AP_TAX_CODES_ALL"."TAX_ID"(+))
22 - filter(NVL("PO_DISTRIBUTIONS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
23 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."PO_DISTRIBUTION_ID"="PO_DISTRIBUTIONS_ALL"."PO_DISTRIBUTION_ID"
(+))
24 - filter(NVL("PO_HEADERS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
25 - access("PO_DISTRIBUTIONS_ALL"."PO_HEADER_ID"="PO_HEADERS_ALL"."PO_HEADER_ID"(+))
26 - filter(NVL("PO_LINE_LOCATIONS_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
27 - access("PO_DISTRIBUTIONS_ALL"."LINE_LOCATION_ID"="PO_LINE_LOCATIONS_ALL"."LINE_LOCATION_ID"(+))
28 - filter(NVL("PO_LINES_ALL"."ORG_ID"(+),NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
29 - access("PO_LINE_LOCATIONS_ALL"."PO_LINE_ID"="PO_LINES_ALL"."PO_LINE_ID"(+))
31 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."RCV_TRANSACTION_ID"="RTXNS"."TRANSACTION_ID"(+))
33 - access("RTXNS"."SHIPMENT_LINE_ID"="RSL"."SHIPMENT_LINE_ID"(+))
34 - access("RSL"."SHIPMENT_HEADER_ID"="RSH"."SHIPMENT_HEADER_ID"(+))
35 - filter(NVL("AP_INVOICE_DISTRIBUTIONS_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
36 - access("AP_INVOICE_DISTRIBUTIONS_ALL"."PREPAY_DISTRIBUTION_ID"="AP_INVOICE_DISTRIBUTIONS_ALL"."INVOICE
_DISTRIBUTION_ID")
37 - filter(NVL("AP_INVOICES_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
38 - access("AP_INVOICES_ALL"."INVOICE_ID"="AP_INVOICE_DISTRIBUTIONS_ALL"."INVOICE_ID")
39 - filter(NVL("PO_VENDOR_SITES_ALL"."ORG_ID",NVL(TO_NUMBER(DECODE(SUBSTRB(:B1,1,1),'
',NULL,SUBSTRB(:B2,1,10))),(-99)))=NVL(TO_NUMBER(DECODE(SUBSTRB(:B3,1,1),' ',NULL,SUBSTRB(:B4,1,10))),(-99)))
40 - access("AP_INVOICES_ALL"."VENDOR_SITE_ID"="PO_VENDOR_SITES_ALL"."VENDOR_SITE_ID")
41 - access("AP_INVOICES_ALL"."VENDOR_ID"="PV"."VENDOR_ID")

Note: cpu costing is off

93 rows selected.


这个SQL之所以跑很慢,是因为18行谓词推入,而它又是外部nested loop的驱动行源,这样导致过滤AP_INVOICE_DISTRIBUTIONS_ALL表灰常多次(由于无法连接他DB,无法计算过滤多少次)


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 一、路由首先需要配置路由,就是点击good组件进入goodDetail组件配置路由如下{path:goodDetail,component:goodDetail}同时在good组件中写入如下点击事件,路由中加入 ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • des算法php,Des算法属于加密技术中的
    本文目录一览:1、des是什么算法2、80分求 ... [详细]
  • 路径查找基础知识-动画演示
    这是教程教你建立路径查找算法的第一步。路径查找就是在两点之间查找最短路径的算法,你可以在很多地方应用,例如:玩家控制角色时通过点击设置目的地时,就需要用到。在开始前,我们需要明确一点:路径查找是在终点 ... [详细]
author-avatar
紫竹林素食坊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有