как ускорить заказ по запросу в оракуле - PullRequest
0 голосов
/ 07 декабря 2018

мой запрос разбивки на страницы ниже работает быстрее (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 голосов
/ 08 декабря 2018

Вы сортируете по nvl(s.name,c.vemail), затем opp.updat.Я предполагаю, что NVL может предотвратить большую оптимизацию, потому что Oracle не может сказать, каково будет значение этого столбца, не глядя на каждую строку в объединенном результате.Вы можете попробовать добавить индексы для этих трех столбцов или индекс на основе функций для nvl(s.name,c.vemail).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...