powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / проброс хинта во вью
9 сообщений из 9, страница 1 из 1
проброс хинта во вью
    #39479615
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
--есть такая вьюха-источник
  CREATE  VIEW FACTS as
  select
 a.fld1,
 a.fld2,
 ...
 a.fldX,
 c.VALIDDate
from tblC DC
LEFT JOIN tblA DA
ON DC.ID = DA.ID
;

--таблицы определены как

  CREATE TABLE tblC
   (	"ID" NUMBER, 
	"VALIDDate" TIMESTAMP (6)
   ) 
 COMPRESS BASIC NOLOGGING
;
   
  CREATE TABLE tblA
   (	"ID" NUMBER, 
   FILIAL NUMBER, 
  ....
   ) 
 COMPRESS BASIC  LOGGING 
  PARTITION BY LIST ("FILIAL") 
 (PARTITION "P_000"  VALUES ('1') SEGMENT CREATION IMMEDIATE 
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 COMPRESS BASIC LOGGING 
 ...
 PARTITION "P_OTHER"  VALUES (DEFAULT) 
 COMPRESS BASIC LOGGING 
  ;

  CREATE UNIQUE INDEX tblA_UQ ON tblA ("ID") 
  ;
    

--если из нее запросить следующий набор строк
select 
* from FACTS t
where VALIDDate > date '2013-12-31';

то получим план c Nested Loops, что на большом наборе строк неэффективно

----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name           | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                |     1 |   110 |   242K  (3)| 00:48:29 |       |       |
|   1 |  NESTED LOOPS OUTER                 |                |     1 |   110 |   242K  (3)| 00:48:29 |       |       |
|*  2 |   TABLE ACCESS FULL                 | tblC           |     1 |    22 |   242K  (3)| 00:48:29 |       |       |
|   3 |   TABLE ACCESS BY GLOBAL INDEX ROWID| tblA           |     1 |    88 |     3   (0)| 00:00:01 | ROWID | ROWID |
|*  4 |    INDEX UNIQUE SCAN                | tblA_UQ        |     1 |       |     2   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter("DC"."VALIDDate">TIMESTAMP' 2013-12-31 00:00:00')
   4 - access("DA"."ID"(+)="DC"."ID")

--ограничения: пересобрать статистику / слить 2 таблицы в одну нельзя

--решение: если добавить хинт 

select /*+full(t.DC) full(t.DA) use_hash(t.DC t.DA) */
* from FACTS t
where VALIDDate > date '2013-12-31';

--то он пробросится во вьюху - и получим желаемый план с hash join:
---------------------------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |     1 |   110 |   944K  (3)| 03:08:54 |       |       |
|*  1 |  HASH JOIN OUTER    |             |     1 |   110 |   944K  (3)| 03:08:54 |       |       |
|*  2 |   TABLE ACCESS FULL | tblC        |     1 |    22 |   242K  (3)| 00:48:29 |       |       |
|   3 |   PARTITION LIST ALL|             |   435M|    35G|   699K  (3)| 02:19:55 |     1 |    17 |
|   4 |    TABLE ACCESS FULL| tblA        |   435M|    35G|   699K  (3)| 02:19:55 |     1 |    17 |
---------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("DA"."ID"(+)="DC"."ID")
   2 - filter("DC"."VALIDDate">TIMESTAMP' 2013-12-31 00:00:00')


--Далее требуется в запросе соединить ее с еще одной таблицей:
select /*+ full(t.DC) full(t.DA) use_hash(t.DC t.DA) */
* 
from FACTS T
LEFT JOIN tbl X
    on X.C_LIST_PAY=T.COLLECTION_ID 
where t.VALIDDate > date '2016-12-31' --переменная величина

--проблема - запрос СНОВА получает план с Nested Loops

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name           | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                |     1 |    83 |   548K  (2)| 01:49:37 |       |       |
|*  1 |  HASH JOIN OUTER                     |                |     1 |    83 |   548K  (2)| 01:49:37 |       |       |
|   2 |   NESTED LOOPS OUTER                 |                |     1 |    65 |   242K  (3)| 00:48:29 |       |       |
|*  3 |    TABLE ACCESS FULL                 | tblС           |     1 |    22 |   242K  (3)| 00:48:29 |       |       |
|   4 |    TABLE ACCESS BY GLOBAL INDEX ROWID| tblA           |     1 |    43 |     3   (0)| 00:00:01 | ROWID | ROWID |
|*  5 |     INDEX UNIQUE SCAN                | tblA_UQ        |     1 |       |     2   (0)| 00:00:01 |       |       |
|   6 |   PARTITION LIST ALL                 |                |    22M|   380M|   305K  (1)| 01:01:07 |     1 |    17 |
|   7 |    TABLE ACCESS FULL                 | tbl            |    22M|   380M|   305K  (1)| 01:01:07 |     1 |    17 |
-----------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("C_LIST_PAY"(+)="DA"."COLLECTION_ID")
   3 - filter("DC"."VALIDDate">TIMESTAMP' 2016-12-31 00:00:00')
   5 - access("DA"."ID"(+)="DC"."ID")



--хинтование с целью получения hash join уже не помогает 
-- что не так делаю?
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39479696
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39479715
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAAlexus12,

http://www.sql.ru/forum/718430/vozmozhno-li-zahintovat-left-join-kak-use-hash То из другой оперы.

ТСу достаточно посмотреть аутлайн с помощью
Код: plaintext
select * from dbms_xplan.display_cursor(...,format => 'OUTLINE')
и подправить его соответственно пожеланиям.

В особо запущенных случаях, переписать ansi -> native.
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39479874
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12...
хинтование с целью получения hash join уже не помогает
что не так делаю?
[/src]
Или я слепой, но я НЕ увидел "хинтование с целью получения hash join". Есть хинтование с целью получения Full Table Scan. Вроде, full table scan'ов в плане полно )))

Чем не устраивает получившийся план, мне не понятно.
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39480177
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
смотрите второй сверху план и хинты в его запросе

чем не устраивает - NL на сотнях тысяч строк = часы работы
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39480213
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12Leonid Kudryavtsev,
смотрите второй сверху план и хинты в его запросе
Ну как минимум не совсем правильно применен use_hash :)
Кроме того, не определен порядок соединения.
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39480238
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
прошу указать в чем ошибка и предложить ваш вариант
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39480244
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12andrey_anonymous,
прошу указать в чем ошибка и предложить ваш вариант
Нет сейчас базы под рукой, демку сделать не на чем (дожил :) ).
Очевидные ошибки хинтования второго запроса я вроде указал.
При присоединении таблиц к view дополнительно следует рассмотреть вопросы [complex] view merging и [no_]push_pred
...
Рейтинг: 0 / 0
проброс хинта во вью
    #39480254
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

> не совсем правильно применен use_hash :)
> Кроме того, не определен порядок соединения.

второй сверху план содержит такой запрос - это соединение двух таблиц, какой порядок может быть иным?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
цитата
select /*+full(t.DC) full(t.DA) use_hash(t.DC t.DA) */
* from FACTS t
where VALIDDate > date '2013-12-31';

--то он пробросится во вьюху - и получим желаемый план с hash join:
---------------------------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |     1 |   110 |   944K  (3)| 03:08:54 |       |       |
|*  1 |  HASH JOIN OUTER    |             |     1 |   110 |   944K  (3)| 03:08:54 |       |       |
|*  2 |   TABLE ACCESS FULL | tblC        |     1 |    22 |   242K  (3)| 00:48:29 |       |       |
|   3 |   PARTITION LIST ALL|             |   435M|    35G|   699K  (3)| 02:19:55 |     1 |    17 |
|   4 |    TABLE ACCESS FULL| tblA        |   435M|    35G|   699K  (3)| 02:19:55 |     1 |    17 |
---------------------------------------------------------------------------------------------------



порядок соединения важен для хинта use_hash, т.е. обязательно указывать leading/ordered?
есть ссылка на доку/уважаемого гуру про это?

>Нет сейчас базы под рукой, демку сделать не на чем (дожил :) ).

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


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