(Oracle Performance)基于视图的查询是否会使用where子句限制视图?

Bes*_*ces 2 sql oracle views

在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会对没有索引的视图而不是具有索引的基表执行查询?

Pet*_*ang 6

它不会先执行查询.如果您有索引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)