В одном из моих проектов я запускаю прямой запрос в режиме просмотра с использованием dblink, но после проверки производительности наблюдается, что это дорого (много использования Nested Looping, High CPU).Лучший способ оптимизации запросов Oracle
Теперь мы нашли одно решение i.e. Используйте функцию для запуска этих запросов на просмотр. Так это правильное решение или есть лучший способ выполнить эту операцию.
Пример запроса и есть отчет об исполнении:
- без использования функции:
Запрос:
SELECT t1.,
t2.
FROM table1 t1
join table2 t2
ON t1.id = t2.id
WHERE t1.bookingId = '0250014547'
Отчет:
SQL> explain plan for SELECT t1., t2. FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t1.bookingId = '0250014547';
SQL> select * from table(dbms_xplan.display);
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 331 | 6 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 331 | 6 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 1 | 299 | 5 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 210 | 4 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 1 | 185 | 3 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 156 | 2 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| GENERAL_ACCT_MAST_TABLE | 1 | 66 | 1 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | IDX_GAM_FORACID | 1 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID| SERVICE_OUTLET_TABLE | 1694 | 148K| 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | IDX_SERVICE_OUTLET_TABLE | 1 | | 1 (0)| 00:00:01 |
| 10 | TABLE ACCESS BY INDEX ROWID | GEN_SCHM_PARM_TABLE | 356 | 10324 | 1 (0)| 00:00:01 |
|* 11 | INDEX UNIQUE SCAN | IDX_GEN_SCHM_PARM_TABLE | 1 | | 1 (0)| 00:00:01 |
|* 12 | TABLE ACCESS BY INDEX ROWID | ACCT_STATEMENT_TABLE | 12M| 309M| 1 (0)| 00:00:01 |
|* 13 | INDEX UNIQUE SCAN | IDX_ACCT_STATEMENT_TABLE | 1 | | 1 (0)| 00:00:01 |
| 14 | TABLE ACCESS BY INDEX ROWID | CUST_MAST_GEN_TABLE | 24M| 2119M| 1 (0)| 00:00:01 |
|* 15 | INDEX UNIQUE SCAN | IDX_CUST_MAST_GEN_TABLE | 1 | | 1 (0)| 00:00:01 |
| 16 | TABLE ACCESS BY INDEX ROWID | BRANCH_BIC_TABLE | 65258 | 2039K| 1 (0)| 00:00:01 |
|* 17 | INDEX UNIQUE SCAN | IDX_BRANCH_BIC_TABLE | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
- Использование функции:
Запрос:
SELECT Funquery1('0250014547')
FROM dual;
Отчет:
SQL> explain plan for select gtt('0252050014577') from dual;
SQL> select * from table(dbms_xplan.display);
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
и что делает 'Funquery1'? – Sathya
имеет тот же запрос, о котором я упомянул выше, который возвращает результат в курсоре. – Sham