在Oracle(10g)中,当我使用View(非物化视图)时,Oracle在执行视图时会考虑where子句吗?
比方说我有:
MY_VIEW =
SELECT *
FROM PERSON P, ORDERS O
WHERE P.P_ID = O.P_ID
Run Code Online (Sandbox Code Playgroud)
然后我执行以下操作:
SELECT *
FROM MY_VIEW
WHERE MY_VIEW.P_ID = '1234'
Run Code Online (Sandbox Code Playgroud)
执行此操作时,oracle是否首先执行视图查询,然后根据我的where子句(其中MY_VIEW.P_ID ='1234')对其进行过滤,或者它是否作为视图执行的一部分进行过滤?如果它不执行后者,并且P_ID有一个索引,那么我是否也会失去索引功能,因为Oracle会对没有索引的视图而不是具有索引的基表执行查询?
它不会先执行查询.如果您有索引P_ID,将使用它.
执行计划与将view-code和WHERE-clause合并到单个select语句中的方法相同.
你可以自己试试:
EXPLAIN PLAN FOR
SELECT *
FROM MY_VIEW
WHERE MY_VIEW.P_ID = '1234'
Run Code Online (Sandbox Code Playgroud)
其次是
SELECT * FROM TABLE( dbms_xplan.display );
---------------------------------------------------------------------------------
|Id | Operation | Name |Rows| Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 52 | 2 (0)| 00:00:01|
| 1 | NESTED LOOPS | | 1 | 52 | 2 (0)| 00:00:01|
| 2 | TABLE ACCESS BY INDEX ROWID| PERSON | 1 | 26 | 2 (0)| 00:00:01|
| 3 | INDEX UNIQUE SCAN | PK_P | 1 | | 1 (0)| 00:00:01|
| 4 | TABLE ACCESS BY INDEX ROWID| ORDERS | 1 | 26 | 0 (0)| 00:00:01|
| 5 | INDEX RANGE SCAN | IDX_O | 1 | | 0 (0)| 00:00:01|
---------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3256 次 |
| 最近记录: |