开发说: 有段SQL语句,去掉order by很快,有order by之后,查询1小时都无法返回结果。 我叫他把SQL扔给我看下。
1)建立索引
create index IDX_B_BILL_TEST03 on B_BILL (GETAGENTCODE, BILLNO);2)添加hint
/*+index_rs(a)*/3)or改写成union
select * from (select d.*, rownum as num from (SELECT /*+index_rs(a)*/ A.BILLNO, A.BILLCODE, A.GETDATE, A.GETUNITCODE, A.GETCODE, A.GETORGANCODE, A.USEORGANCODE, A.USEDATE, A.USEUNITCODE, A.USERCODE, A.CURRENCYCODE, A.AMOUNT, A.NAME, A.NOTES, A.STATUSCODE, A.IFPAGEONHOLE, A.OPCODE, A.OPUNITCODE, A.OPDATE, A.LOCKTIME, A.GETAGENTCODE, (SELECT D.AGENTNAME FROM SYN_MM_AGENTCODE_TC D WHERE D.AGENTCODE = A.GETAGENTCODE) AS GETAGENTNAME, A.USEAGENTCODE, A.OUTSTATUS, CASE A.BILLCODE WHEN 'B2010005' THEN A.FACTBILLCODE ELSE '' END FACTBILLCODE, A.SALES, A.FROMDATE, A.TODATE, (SELECT BILLNAME FROM BD_BILLCODE WHERE BILLCODE = A.BILLCODE) BILLNAME, (SELECT HANDLERNAME FROM BD_HANDLER WHERE HANDLERCODE = A.USERCODE) USERNAME, (SELECT HANDLERNAME FROM BD_HANDLER WHERE HANDLERCODE = A.GETCODE) GETERNAME, (SELECT NO3 FROM B_BILLDETAIL WHERE BILLNO = A.BILLNO AND BILLCODE = A.BILLCODE AND FACTBILLCODE = A.FACTBILLCODE) ONLINEINVOICENO, (SELECT NO4 FROM B_BILLDETAIL WHERE BILLNO = A.BILLNO AND BILLCODE = A.BILLCODE AND FACTBILLCODE = A.FACTBILLCODE) ONLINEINVOICECODE FROM B_BILL A WHERE 3 > 2 AND (3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2) AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND ((TRIM(GETUNITCODE) = '013100' /*OR GETAGENTCODE IN (SELECT A.AGENTCODE FROM CIOD_IM.CHAGENTBASE A WHERE 1 = 1 AND TRIM(A.BRANCHCODE) = '013100')*/ )) union SELECT A.BILLNO, A.BILLCODE, A.GETDATE, A.GETUNITCODE, A.GETCODE, A.GETORGANCODE, A.USEORGANCODE, A.USEDATE, A.USEUNITCODE, A.USERCODE, A.CURRENCYCODE, A.AMOUNT, A.NAME, A.NOTES, A.STATUSCODE, A.IFPAGEONHOLE, A.OPCODE, A.OPUNITCODE, A.OPDATE, A.LOCKTIME, A.GETAGENTCODE, (SELECT D.AGENTNAME FROM SYN_MM_AGENTCODE_TC D WHERE D.AGENTCODE = A.GETAGENTCODE) AS GETAGENTNAME, A.USEAGENTCODE, A.OUTSTATUS, CASE A.BILLCODE WHEN 'B2010005' THEN A.FACTBILLCODE ELSE '' END FACTBILLCODE, A.SALES, A.FROMDATE, A.TODATE, (SELECT BILLNAME FROM BD_BILLCODE WHERE BILLCODE = A.BILLCODE) BILLNAME, (SELECT HANDLERNAME FROM BD_HANDLER WHERE HANDLERCODE = A.USERCODE) USERNAME, (SELECT HANDLERNAME FROM BD_HANDLER WHERE HANDLERCODE = A.GETCODE) GETERNAME, (SELECT NO3 FROM B_BILLDETAIL WHERE BILLNO = A.BILLNO AND BILLCODE = A.BILLCODE AND FACTBILLCODE = A.FACTBILLCODE) ONLINEINVOICENO, (SELECT NO4 FROM B_BILLDETAIL WHERE BILLNO = A.BILLNO AND BILLCODE = A.BILLCODE AND FACTBILLCODE = A.FACTBILLCODE) ONLINEINVOICECODE FROM B_BILL A WHERE 3 > 2 AND (3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2 OR 3 > 2) AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND 3 > 2 AND (( /*TRIM(GETUNITCODE) = '013100' OR*/ GETAGENTCODE IN (SELECT A.AGENTCODE FROM CIOD_IM.CHAGENTBASE A WHERE 1 = 1 AND TRIM(A.BRANCHCODE) = '013100'))) ORDER BY BILLNO) d where rownum <= 100) where num > 0; Plan hash value: 215809904 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | 452K| | 76511 (34)| 00:15:19 | |* 1 | VIEW | | 100 | 452K| | 76511 (34)| 00:15:19 | |* 2 | COUNT STOPKEY | | | | | | | | 3 | VIEW | | 570K| 2511M| | 76511 (34)| 00:15:19 | |* 4 | SORT UNIQUE STOPKEY | | 570K| 104M| 278M| 50812 (46)| 00:10:10 | | 5 | UNION-ALL | | | | | | | | 6 | TABLE ACCESS BY INDEX ROWID| B_BILL | 569K| 104M| | 3755 (1)| 00:00:46 | |* 7 | INDEX RANGE SCAN | IDX_B_BILL_TEST | 227K| | | 771 (1)| 00:00:10 | | 8 | TABLE ACCESS BY INDEX ROWID| B_BILL | 81 | 15552 | | 7742 (1)| 00:01:33 | | 9 | NESTED LOOPS | | 262 | 54234 | | 23093 (1)| 00:04:38 | |* 10 | TABLE ACCESS FULL | CHAGENTBASE | 3 | 45 | | 6 (0)| 00:00:01 | |* 11 | INDEX RANGE SCAN | IDX_B_BILL_TEST03 | 1089 | | | 7672 (1)| 00:01:33 | -------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NUM">0) 2 - filter(ROWNUM<=100) 4 - filter(ROWNUM<=100) 7 - access(TRIM("GETUNITCODE")='013100') 10 - filter(TRIM("A"."BRANCHCODE")='013100') 11 - access("GETAGENTCODE"="A"."AGENTCODE") filter("GETAGENTCODE" IS NOT NULL)1s能返回结果,性能大大提升。开发很开心地把SQL拿走了。
转载于:https://www.cnblogs.com/wanbin/p/9514614.html
