WOW !!Это интересно .. У меня есть два разных плана объяснения, зависящих от разных объемов данных и запросов внутри логического представления (это мое предположение)
- Исходный вопрос: он определенно сначала выполняет фильтрацию.У меня есть небольшое количество данных (<10 в общей сложности) в этой тестовой таблице.<pre>
`
| 0 | SELECT STATEMENT | | 2 | 132 | 2 (0)|
00:00:01 |
| 1 | NESTED LOOPS | | 2 | 132 | 2 (0)|
00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| PERSON | 1 | 40 | 1 (0)|
00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PERSON_PK | 1 | | 0 (0)|
00:00:01 |
|* 4 | INDEX RANGE SCAN | ORDERS_PK | 2 | 52 | 1 (0)|
00:00:01 |
Predicate Information (identified by operation id)
3 - access("P"."P_ID"=1)
4 - access("O"."P_ID"=1)
Note
<ul>
<li>dynamic sampling used for this statement
`
- Однако, когда данные становятся больше (хотя бы несколько сотен, хотя 300–400) и запрос представления становится сложным (с использованием «connect by» и т. Д.),план изменился, я думаю ...
| 0 | SELECT STATEMENT | | 1 | 29 | 2
(0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 29 | 2
(0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| RP_TRANSACTION | 1 | 12 | 1
(0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | RP_TRANSACTION_PK | 1 | | 0
(0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| RP_REQUEST | 279 | 4743 | 1
(0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN | RP_REQUEST_PK | 1 | | 0
(0)| 00:00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("TRANSACTION_ID"=18516648)
5 - access("REQ"."REQUEST_ID"="TRANS"."REQUEST_ID")
---- Ниже мой оригинальный пост
Насколько я знаю, оракул сначала выполняет представление (логическое представление), используявременное пространство, а затем выполнить фильтр .. Таким образом, ваш запрос в основном такой же, как
SELECT *
FROM (SELECT *
ОТ ЧЕЛОВЕКА P, ЗАКАЗЫ O ГДЕ P.P_ID = O.P_ID)P_ID = '1234'
Я не думаю, что вы можете создать индекс для логического представления (материализованное представление использует индекс)
Кроме того, вы должны знать, что вы выполнили бы запрос для MY_VIEW,каждый раз, когда вы используете select * из MY_VIEW, где P_ID = '1234'.
Я имею в виду каждый раз.Естественно, это не очень хорошая идея для производительности