powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение таблиц из участия в запросе
4 сообщений из 4, страница 1 из 1
Исключение таблиц из участия в запросе
    #39539154
misha1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется 3 таблицы:
...
Рейтинг: 0 / 0
Исключение таблиц из участия в запросе
    #39539160
misha1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha1973,
Извиняюсь, случайно нажал опубликовать.
Имеется 3 таблицы:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table first_one(col1 number);
insert into first_one values (1);
insert into first_one values (2);
insert into first_one values (3);

create table second_one(col1 number);
insert into second_one values (1);
insert into second_one values (3);

create table third_one(col1 number);
insert into third_one values (3);



Никак не пойму, идет ли сканирование 3-й таблицы при значении :par = 'sec', или же она вообще не участвует в выборке?
Запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
select *
from first_one 
left join second_one
ON  ((first_one.col1 = second_one.col1 and :par IN ('sec', 'all')))
left join third_one 
ON  ((first_one.col1 =  third_one.col1 and :par IN ('thrd', 'all')))
...
Рейтинг: 0 / 0
Исключение таблиц из участия в запросе
    #39539172
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
misha1973,

смотри план: если видишь шаг Filter c предикатами выше по дереву перед сканом таблицы/индекса, то значит обращение к таблицы будет зависеть от указанных условий, например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> explain plan for select * from dual where 1=0;

Explained.

SQL> @xplan

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3752461848

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     2 |     0   (0)|          |
|*  1 |  FILTER            |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(NULL IS NOT NULL)

14 rows selected.
...
Рейтинг: 0 / 0
Исключение таблиц из участия в запросе
    #39539334
jan2ary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну фильтр то будет, как мне кажется.
Я бьі зашел с другой стороньі - смотрите статистики вьіполнения.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
SQL> var par varchar2;
SQL> exec :par := 'sec';

PL/SQL procedure successfully completed.

SQL> select /*+ gather_plan_statistics */ *
  2  from first_one
  3  left join second_one
  4  ON  ((first_one.col1 = second_one.col1 and :par IN ('sec', 'all')))
  5  left join third_one
  6  ON  ((first_one.col1 =  third_one.col1 and :par IN ('thrd', 'all')));

      COL1       COL1       COL1
---------- ---------- ----------
         1          1
         2
         3          3

SQL> select * from table(dbms_xplan.display_cursor(format => 'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  gknhz5ys4x84t, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ * from first_one  left join
second_one ON  ((first_one.col1 = second_one.col1 and :par IN ('sec',
'all'))) left join third_one  ON  ((first_one.col1 =  third_one.col1
and :par IN ('thrd', 'all')))

Plan hash value: 3276029038

----------------------------------------------------------------------------------------------
| Id  | Operation             | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |            |      1 |        |      3 |00:00:00.01 |      28 |
|   1 |  NESTED LOOPS OUTER   |            |      1 |      3 |      3 |00:00:00.01 |      28 |
|   2 |   NESTED LOOPS OUTER  |            |      1 |      3 |      3 |00:00:00.01 |      28 |
|   3 |    TABLE ACCESS FULL  | FIRST_ONE  |      1 |      3 |      3 |00:00:00.01 |       7 |
|   4 |    VIEW               |            |      3 |      1 |      2 |00:00:00.01 |      21 |
|*  5 |     FILTER            |            |      3 |        |      2 |00:00:00.01 |      21 |
|*  6 |      TABLE ACCESS FULL| SECOND_ONE |      3 |      1 |      2 |00:00:00.01 |      21 |
|   7 |   VIEW                |            |      3 |      1 |      0 |00:00:00.01 |       0 |
|*  8 |    FILTER             |            |      3 |        |      0 |00:00:00.01 |       0 |
|*  9 |     TABLE ACCESS FULL | THIRD_ONE  |      0 |      1 |      0 |00:00:00.01 |       0 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - filter((:PAR='sec' OR :PAR='all'))
   6 - filter("FIRST_ONE"."COL1"="SECOND_ONE"."COL1")
   8 - filter((:PAR='thrd' OR :PAR='all'))
   9 - filter("FIRST_ONE"."COL1"="THIRD_ONE"."COL1")

Note
-----
   - dynamic sampling used for this statement (level=2)


36 rows selected.


Сравните с par = 'thrd', затем 'all'.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Исключение таблиц из участия в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]