在我的一個項目中,我使用dblink對View進行直接查詢,但是在執行檢查後發現它代價高昂(很多嵌套循環,高CPU使用率)。Oracle查詢優化的最佳方式
現在我們已經找到了一個解決方案,即使用函數在視圖上觸發這些查詢。那麼這是正確的解決方案還是有更好的方法來執行此操作。
樣品查詢,有業績報告:
- 不使用功能:
查詢:
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