powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пропихнуть таблицу во вьюшку
14 сообщений из 14, страница 1 из 1
Пропихнуть таблицу во вьюшку
    #39541590
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, добрый день.

Подскажите, есть ли способ ?
Суть проблемы: есть запрос вида
Код: plsql
1.
2.
3.
SELECT * 
FROM driving_table drv
JOIN view_with_indexess v ON drv.uniq_id = vw.indexed_id



В таблице всего 5 записей, на поле drv.uniq_id - уникальный индекс
В таблицах из вьюшки по нескольку миллионов записей.
По плану, сначала через HASH_JOIN собирается вся вьюшка, а затем HASH_JOIN c ведущей таблицей.

Но если раскрыть вьюшку, всё собирается по индексам за доли секунды.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39541602
Sah,

пересказывать планы своими словами, конечно, интересно. Но лучше показать. Желательно вместе с запросов представления. Может оно у вас несливаемо-непропихиваемое....
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39541810
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня, по сути, интересует вопрос, какого хрена оракл начинает полностью материализировать вьюшку, когда в условии соединения уникальные ключи? И в ведущей таблице всего 5 записей?
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39541813
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SahМеня, по сути, интересует вопрос, какого хрена оракл начинает полностью материализировать вьюшку, когда в условии соединения уникальные ключи? И в ведущей таблице всего 5 записей?
Ответ ищите в трассе 10053.
Если ожидаете предметных советов на форуме - приводите конкретные листинги.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615234
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку вопрос, как пропихнуть предикаты во вьюшку. Прям бесит.
Запрос такой :
Код: plsql
1.
2.
3.
4.
SELECT *
  FROM ren_v_policy_commission pi                      
 WHERE pi.policy_nr =  :rc_policy_nr
   AND pi.endr_version = :p_endr_version 


План при этом
Код: plaintext
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.
Plan hash value: 3198364741
 
-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                         | 10181 |  6522K|       | 41209   (1)| 00:08:15 |
|*  1 |  VIEW                               | REN_V_POLICY_COMMISSION | 10181 |  6522K|       | 41209   (1)| 00:08:15 |
|   2 |   WINDOW SORT                       |                         | 10181 |  6671K|  7416K| 41209   (1)| 00:08:15 |
|*  3 |    HASH JOIN OUTER                  |                         | 10181 |  6671K|  6360K| 39762   (1)| 00:07:58 |
|   4 |     VIEW                            |                         | 10181 |  6233K|       | 39367   (1)| 00:07:53 |
|   5 |      CONCATENATION                  |                         |       |       |       |            |          |
|*  6 |       HASH JOIN                     |                         | 10092 |   985K|       | 24819   (1)| 00:04:58 |
|*  7 |        INDEX FAST FULL SCAN         | REN_POLICY_CONTACT_PK   | 25232 |   517K|       |   823   (2)| 00:00:10 |
|*  8 |        HASH JOIN                    |                         |  9313 |   718K|       | 23994   (1)| 00:04:48 |
|*  9 |         TABLE ACCESS FULL           | REN_POLICY_INFO         |  8247 |   281K|       |   793   (2)| 00:00:10 |
|  10 |         NESTED LOOPS                |                         |  6329K|   265M|       | 23123   (1)| 00:04:38 |
|  11 |          NESTED LOOPS               |                         |  6329K|   265M|       | 23123   (1)| 00:04:38 |
|* 12 |           TABLE ACCESS FULL         | T_PRODUCT_LINE_OPTION   |    10 |   290 |       |  1116   (1)| 00:00:14 |
|* 13 |           INDEX RANGE SCAN          | IDX$$_0A460001          |  7580 |       |       |    22   (0)| 00:00:01 |
|  14 |          TABLE ACCESS BY INDEX ROWID| P_COVER                 |  7580 |   111K|       |  5971   (1)| 00:01:12 |
|  15 |       NESTED LOOPS                  |                         |    89 |  8900 |       | 14548   (1)| 00:02:55 |
|* 16 |        HASH JOIN                    |                         |   344 | 27176 |       | 13859   (1)| 00:02:47 |
|  17 |         NESTED LOOPS                |                         | 18801 |   807K|       | 13059   (1)| 00:02:37 |
|  18 |          NESTED LOOPS               |                         | 18801 |   807K|       | 13059   (1)| 00:02:37 |
|* 19 |           TABLE ACCESS FULL         | T_PRODUCT_LINE_OPTION   |     2 |    58 |       |  1116   (1)| 00:00:14 |
|* 20 |           INDEX RANGE SCAN          | IDX$$_0A460001          |  7580 |       |       |    22   (0)| 00:00:01 |
|  21 |          TABLE ACCESS BY INDEX ROWID| P_COVER                 |  7580 |   111K|       |  5971   (1)| 00:01:12 |
|* 22 |         TABLE ACCESS FULL           | REN_POLICY_INFO         |   102K|  3512K|       |   799   (2)| 00:00:10 |
|* 23 |        INDEX RANGE SCAN             | REN_POLICY_CONTACT_PK   |     1 |    21 |       |     2   (0)| 00:00:01 |
|  24 |     TABLE ACCESS FULL               | REN_PARTNER_SETTLE_TYPE | 13908 |   597K|       |    49   (3)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("PI"."POLICY_NR"=:RC_POLICY_NR AND "PI"."ENDR_VERSION"=TO_NUMBER(:P_ENDR_VERSION))
   3 - access("ST"."POLICY_NR"(+)="RPI"."POLICY_NR" AND "PC"."CUSTOMER_ID"="ST"."PARTNER_ID"(+))
   6 - access("PC"."POLICY_ID"="RPI"."POLICY_ID" AND "RPI"."PRODUCT_CODE"="PC"."PRODUCT_CODE")
   7 - filter("PC"."CUSTOMER_ROLE"=5)
   8 - access("CVR"."ENDORSMENT_ID"="RPI"."POLICY_ID")
   9 - filter("RPI"."PRODUCT_CODE"='CASCO' AND ("RPI"."PRODUCT_CODE"='CASCO' OR "RPI"."PRODUCT_CODE"='OSAGO'))
  12 - filter(("PLO"."OPTION_TYPE_ID"=5151774 OR "PLO"."OPTION_TYPE_ID"=40000310 OR 
              "PLO"."OPTION_TYPE_ID"=51530149) AND ("PLO"."OPTION_TYPE_ID"=5151774 OR "PLO"."OPTION_TYPE_ID"=5153146 OR 
              "PLO"."OPTION_TYPE_ID"=40000310 OR "PLO"."OPTION_TYPE_ID"=51530149 OR "PLO"."OPTION_TYPE_ID"=51530227 OR 
              "PLO"."OPTION_TYPE_ID"=51530300))
  13 - access("PLO"."ID"="CVR"."PRODUCT_OPTION_ID")
  16 - access("CVR"."ENDORSMENT_ID"="RPI"."POLICY_ID")
       filter(LNNVL("RPI"."PRODUCT_CODE"='CASCO') OR LNNVL("PLO"."OPTION_TYPE_ID"=5151774) AND 
              LNNVL("PLO"."OPTION_TYPE_ID"=40000310) AND LNNVL("PLO"."OPTION_TYPE_ID"=51530149))
  19 - filter(("PLO"."OPTION_TYPE_ID"=5153146 OR "PLO"."OPTION_TYPE_ID"=51530227 OR 
              "PLO"."OPTION_TYPE_ID"=51530300) AND ("PLO"."OPTION_TYPE_ID"=5151774 OR "PLO"."OPTION_TYPE_ID"=5153146 OR 
              "PLO"."OPTION_TYPE_ID"=40000310 OR "PLO"."OPTION_TYPE_ID"=51530149 OR "PLO"."OPTION_TYPE_ID"=51530227 OR 
              "PLO"."OPTION_TYPE_ID"=51530300))
  20 - access("PLO"."ID"="CVR"."PRODUCT_OPTION_ID")
  22 - filter("RPI"."PRODUCT_CODE"='OSAGO' AND ("RPI"."PRODUCT_CODE"='CASCO' OR "RPI"."PRODUCT_CODE"='OSAGO'))
  23 - access("PC"."POLICY_ID"="RPI"."POLICY_ID" AND "RPI"."PRODUCT_CODE"="PC"."PRODUCT_CODE" AND 
              "PC"."CUSTOMER_ROLE"=5)
       filter("PC"."CUSTOMER_ROLE"=5)

Если подставить предикаты в сам запрос, получим такой план:
Код: plaintext
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.
Plan hash value: 746502299
 
------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name                         | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                              |     1 |   671 |    28   (4)| 00:00:01 |
|   1 |  WINDOW SORT                      |                              |     1 |   671 |    28   (4)| 00:00:01 |
|   2 |   NESTED LOOPS OUTER              |                              |     1 |   671 |    27   (0)| 00:00:01 |
|   3 |    VIEW                           |                              |     1 |   627 |    25   (0)| 00:00:01 |
|   4 |     NESTED LOOPS                  |                              |     1 |   100 |    25   (0)| 00:00:01 |
|   5 |      NESTED LOOPS                 |                              |     1 |    79 |    23   (0)| 00:00:01 |
|   6 |       NESTED LOOPS                |                              |     4 |   200 |    19   (0)| 00:00:01 |
|   7 |        TABLE ACCESS BY INDEX ROWID| REN_POLICY_INFO              |     1 |    35 |     3   (0)| 00:00:01 |
|*  8 |         INDEX RANGE SCAN          | REN_POLICY_INFO_UK2          |     1 |       |     2   (0)| 00:00:01 |
|   9 |        TABLE ACCESS BY INDEX ROWID| P_COVER                      |    44 |   660 |    16   (0)| 00:00:01 |
|* 10 |         INDEX RANGE SCAN          | P_COVER_NN1                  |    44 |       |     3   (0)| 00:00:01 |
|* 11 |       TABLE ACCESS BY INDEX ROWID | T_PRODUCT_LINE_OPTION        |     1 |    29 |     1   (0)| 00:00:01 |
|* 12 |        INDEX UNIQUE SCAN          | T_PRODUCT_LINE_OPTION_PK     |     1 |       |     0   (0)| 00:00:01 |
|* 13 |      INDEX RANGE SCAN             | REN_POLICY_CONTACT_PK        |     1 |    21 |     2   (0)| 00:00:01 |
|  14 |    TABLE ACCESS BY INDEX ROWID    | REN_PARTNER_SETTLE_TYPE      |     1 |    44 |     2   (0)| 00:00:01 |
|* 15 |     INDEX RANGE SCAN              | REN_PARTNER_SETTLE_TYPE_IDX1 |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   8 - access("RPI"."POLICY_NR"=:RC_POLICY_NR AND "RPI"."ENDR_VERSION"=TO_NUMBER(:P_ENDR_VERSION))
       filter("RPI"."PRODUCT_CODE"='CASCO' OR "RPI"."PRODUCT_CODE"='OSAGO')
  10 - access("CVR"."ENDORSMENT_ID"="RPI"."POLICY_ID")
  11 - filter(("PLO"."OPTION_TYPE_ID"=5151774 OR "PLO"."OPTION_TYPE_ID"=5153146 OR 
              "PLO"."OPTION_TYPE_ID"=40000310 OR "PLO"."OPTION_TYPE_ID"=51530149 OR "PLO"."OPTION_TYPE_ID"=51530227 OR 
              "PLO"."OPTION_TYPE_ID"=51530300) AND ("RPI"."PRODUCT_CODE"='OSAGO' AND ("PLO"."OPTION_TYPE_ID"=5153146 OR 
              "PLO"."OPTION_TYPE_ID"=51530227 OR "PLO"."OPTION_TYPE_ID"=51530300) OR "RPI"."PRODUCT_CODE"='CASCO' AND 
              ("PLO"."OPTION_TYPE_ID"=5151774 OR "PLO"."OPTION_TYPE_ID"=40000310 OR "PLO"."OPTION_TYPE_ID"=51530149)))
  12 - access("PLO"."ID"="CVR"."PRODUCT_OPTION_ID")
  13 - access("PC"."POLICY_ID"="RPI"."POLICY_ID" AND "RPI"."PRODUCT_CODE"="PC"."PRODUCT_CODE" AND 
              "PC"."CUSTOMER_ROLE"=5)
       filter("PC"."CUSTOMER_ROLE"=5)
  15 - access("ST"."POLICY_NR"(+)="RPI"."POLICY_NR" AND "PC"."CUSTOMER_ID"="ST"."PARTNER_ID"(+))
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615288
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah,

Если лень разбираться, перепиши запрос на родном синтаксисе.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615460
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. вместо JOIN - соединение в WHERE-кляузе?
А хинта никакого нет, чтобы сначала предикаты применились?
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615499
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah
Код: plaintext
WINDOW SORT
Смотри, у меня тоже такой ужас
Код: plsql
1.
2.
create table x as select rownum id from dual connect by rownum <= 2e6;
create unique index xi on x(id);


В первом случае все пучком, а во втором полное сканирование.
Код: 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.
SQL> select *
  2    from (select x.*, count(*) over(order by id) c
  3            from x
  4           where id = 1);

        ID          C
---------- ----------
         1          1

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

------------------------------------
| Id  | Operation           | Name |
------------------------------------
|   0 | SELECT STATEMENT    |      |
|   1 |  VIEW               |      |
|   2 |   WINDOW BUFFER     |      |
|   3 |    INDEX UNIQUE SCAN| XI   |
------------------------------------

SQL> select *
  2    from (select x.*, count(*) over(order by id) c
  3            from x)
  4   where id = 1;

        ID          C
---------- ----------
         1          1

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

------------------------------------
| Id  | Operation           | Name |
------------------------------------
|   0 | SELECT STATEMENT    |      |
|   1 |  VIEW               |      |
|   2 |   WINDOW SORT       |      |
|   3 |    TABLE ACCESS FULL| X    |
------------------------------------

А то, что запросы неэквивалентны - это мелочь.

Вместо того, чтоб беситься - пробуй иногда думать.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615519
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopА то, что запросы неэквивалентны - это мелочь.Так нужно partition by добавить и все будет пучком - может именно это и нужно ТС?
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615525
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловdbms_photoshopА то, что запросы неэквивалентны - это мелочь.Так нужно partition by добавить и все будет пучком - может именно это и нужно ТС?Ну если ТС устроят новые результаты аналитики - то, конечно, пучком.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615526
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, блин, просто в моём случае, результат-то будет один и тот же.
Предикаты + доп. условия внутри вьюшки выводят на уникальный индекс.

Совсем забыл, что аналитика может всё поломать.

Спасибо. Буду думать как без аналитики выкрутиться.
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39615537
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
partytion by стоял
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39618284
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sah,

Вот тут что-то было


Установить с помощью
Код: plaintext
 /*+QB_NAME(КОД БЛОКА)*/
алиасы нужных подзапросов в вьюшке, к которым в дальнейшем можно будет обращаться(или использовать системные)
Использовать хинт, например /*+push_pred(@vallist_sub1 s)*/
Синтаксис работает следующим образом /*+HINT(@<<В КАКОМ МЕСТЕ ИСПОЛЬЗОВАТЬ ХИНТ>> стандартный синтаксис)
...
Рейтинг: 0 / 0
Пропихнуть таблицу во вьюшку
    #39618344
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagor,

Уже ж написали, 21259309 ,
зачем пытаться пропихнуть невпихуемое?

Regards


Maxim
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пропихнуть таблицу во вьюшку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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