gpt4 book ai didi

sql - (Oracle性能)基于 View 的查询会使用where子句限制 View 吗?

转载 作者:行者123 更新时间:2023-12-03 23:10:01 24 4
gpt4 key购买 nike

在 Oracle (10g) 中,当我使用 View (不是物化 View )时,Oracle 在执行 View 时是否考虑 where 子句?

假设我有:

MY_VIEW =
SELECT *
FROM PERSON P, ORDERS O
WHERE P.P_ID = O.P_ID

然后我执行以下命令:

SELECT * 
FROM MY_VIEW
WHERE MY_VIEW.P_ID = '1234'

执行时,oracle 是否首先执行 View 查询,然后根据我的 where 子句(其中 MY_VIEW.P_ID = '1234')对其进行过滤,还是将这种过滤作为 View 执行的一部分进行?如果它不执行后者,并且 P_ID 有索引,我是否也会失去索引功能,因为 Oracle 将针对没有索引的 View 而不是有索引的基表执行我的查询?

最佳答案

它不会首先执行查询。如果您在 P_ID 上有索引,则会使用它。

执行计划与将 View 代码和 WHERE 子句合并到单个选择语句中相同。

您可以自己尝试一下:

EXPLAIN PLAN FOR
SELECT *
FROM MY_VIEW
WHERE MY_VIEW.P_ID = '1234'

其次是

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|
---------------------------------------------------------------------------------

关于sql - (Oracle性能)基于 View 的查询会使用where子句限制 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com