如何通过查询在oracle中加快订单

时间:2018-12-07 11:32:22

标签: oracle oracle10g

  

以下分页查询的运行速度更快(2.5秒),而无需按排序。   如果我按顺序使用它会变慢(180秒)。   记录总数只有90000

select * from(
select i.*,rownum rno from (
select opp.updat,nvl(s.name,c.vemail),s.name,c.vemail
from sfa_opportunities opp,sfa_company s, customer c
where opp.companyid = c.companyid(+)
and   opp.custid = c.custid(+)
and   opp.companyid = s.companyid(+)
and   opp.sfacompid = s.sfacompid(+)
order by 2 asc, 1 asc
)i) where rno >= 1 and rno <= 30
  

我已经给出了下面的解释计划以供参考。

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                    | 97980 |   110M|       | 14137   (1)| 00:03:18 |
|*  1 |  VIEW                            |                    | 97980 |   110M|       | 14137   (1)| 00:03:18 |
|   2 |   COUNT                          |                    |       |       |       |            |          |
|   3 |    VIEW                          |                    | 97980 |   109M|       | 14137   (1)| 00:03:18 |
|   4 |     SORT ORDER BY                |                    | 97980 |  6602K|    15M| 14137   (1)| 00:03:18 |
|   5 |      NESTED LOOPS OUTER          |                    | 97980 |  6602K|       | 13137   (1)| 00:03:04 |
|*  6 |       HASH JOIN RIGHT OUTER      |                    | 97980 |  3635K|  1136K|   614   (1)| 00:00:09 |
|   7 |        TABLE ACCESS FULL         | SFA_COMPANY        | 34851 |   714K|       |    58   (0)| 00:00:01 |
|   8 |        TABLE ACCESS FULL         | SFA_OPPORTUNITIES  | 97980 |  1626K|       |   390   (1)| 00:00:06 |
|*  9 |       TABLE ACCESS BY INDEX ROWID| CUSTOMER           |     1 |    31 |       |     1   (0)| 00:00:01 |
|* 10 |        INDEX UNIQUE SCAN         | PK_CUSTOMER_CUSTID |     1 |       |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------

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

   1 - filter("RNO"<=30 AND "RNO">=1)
   6 - access("OPP"."COMPANYID"="S"."COMPANYID"(+) AND "OPP"."SFACOMPID"="S"."SFACOMPID"(+))
   9 - filter("OPP"."COMPANYID"="C"."COMPANYID"(+))
  10 - access("OPP"."CUSTID"="C"."CUSTID"(+))

1 个答案:

答案 0 :(得分:0)

您正在对nvl(s.name,c.vemail)进行排序,然后对opp.updat进行排序。我的猜测是NVL可能会阻止许多优化,因为如果不查看联接结果中的每一行,Oracle都无法确定该列的值。您可以尝试在这三列上添加索引,也可以在nvl(s.name,c.vemail)上添加基于函数的索引。