Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пропихнуть таблицу во вьюшку / 14 сообщений из 14, страница 1 из 1
25.10.2017, 12:13
    #39541590
Sah
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
25.10.2017, 12:29
    #39541602
Пропихнуть таблицу во вьюшку
Sah,

пересказывать планы своими словами, конечно, интересно. Но лучше показать. Желательно вместе с запросов представления. Может оно у вас несливаемо-непропихиваемое....
...
Рейтинг: 0 / 0
25.10.2017, 14:56
    #39541810
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
Меня, по сути, интересует вопрос, какого хрена оракл начинает полностью материализировать вьюшку, когда в условии соединения уникальные ключи? И в ведущей таблице всего 5 записей?
...
Рейтинг: 0 / 0
25.10.2017, 14:58
    #39541813
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
SahМеня, по сути, интересует вопрос, какого хрена оракл начинает полностью материализировать вьюшку, когда в условии соединения уникальные ключи? И в ведущей таблице всего 5 записей?
Ответ ищите в трассе 10053.
Если ожидаете предметных советов на форуме - приводите конкретные листинги.
...
Рейтинг: 0 / 0
15.03.2018, 11:05
    #39615234
Sah
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
15.03.2018, 12:06
    #39615288
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
Sah,

Если лень разбираться, перепиши запрос на родном синтаксисе.
...
Рейтинг: 0 / 0
15.03.2018, 15:17
    #39615460
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
Т.е. вместо JOIN - соединение в WHERE-кляузе?
А хинта никакого нет, чтобы сначала предикаты применились?
...
Рейтинг: 0 / 0
15.03.2018, 15:53
    #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
15.03.2018, 16:18
    #39615519
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
dbms_photoshopА то, что запросы неэквивалентны - это мелочь.Так нужно partition by добавить и все будет пучком - может именно это и нужно ТС?
...
Рейтинг: 0 / 0
15.03.2018, 16:27
    #39615525
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
Андрей Панфиловdbms_photoshopА то, что запросы неэквивалентны - это мелочь.Так нужно partition by добавить и все будет пучком - может именно это и нужно ТС?Ну если ТС устроят новые результаты аналитики - то, конечно, пучком.
...
Рейтинг: 0 / 0
15.03.2018, 16:28
    #39615526
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропихнуть таблицу во вьюшку
Во, блин, просто в моём случае, результат-то будет один и тот же.
Предикаты + доп. условия внутри вьюшки выводят на уникальный индекс.

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

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

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


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

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

Regards


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


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