Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hint leading / 25 сообщений из 26, страница 1 из 2
13.11.2017, 10:06
    #39551986
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
Добрый день,

правильно ли я понимаю, что если в запросе всего две таблицы tst1 и tst2, то хинт leading будет одинаково, что при указании leading(tst1 tst2), что при указании leading(tst2 tst1)?
заранее всех благодарю
...
Рейтинг: 0 / 0
13.11.2017, 10:14
    #39551989
Hint leading
cobalt_frogleading будет одинаковоСлово leading всегда пишется одинаково.
...
Рейтинг: 0 / 0
13.11.2017, 11:36
    #39552059
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
cobalt_frog,

нет, планы должны получаться разные (если без swap_join_inputs)
...
Рейтинг: 0 / 0
13.11.2017, 11:39
    #39552061
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
cobalt_frog,

что значит одинаково?
Код: 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.
  1* select /*+ leading (d e) */ dname,ename from emp e,dept d where d.deptno=e.deptno
SQL> /

DNAME          ENAME
-------------- ----------
ACCOUNTING     CLARK
ACCOUNTING     KING
ACCOUNTING     MILLER
RESEARCH       SMITH
RESEARCH       JONES
RESEARCH       SCOTT
RESEARCH       ADAMS
RESEARCH       FORD
SALES          ALLEN
SALES          WARD
SALES          MARTIN
SALES          BLAKE
SALES          TURNER
SALES          JAMES

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 1371801182

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |    14 |   308 |     4   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |              |       |       |            |          |
|   2 |   NESTED LOOPS               |              |    14 |   308 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL         | DEPT         |     4 |    52 |     3   (0)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN          | I$EMP$DEPTNO |     5 |       |     1   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| EMP          |     4 |    36 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   4 - access("D"."DEPTNO"="E"."DEPTNO")

SQL> ed
Wrote file afiedt.buf

  1* select /*+ leading (e d) */ dname,ename from emp e,dept d where d.deptno=e.deptno
SQL> /

DNAME          ENAME
-------------- ----------
ACCOUNTING     CLARK
ACCOUNTING     KING
ACCOUNTING     MILLER
RESEARCH       SMITH
RESEARCH       JONES
RESEARCH       SCOTT
RESEARCH       ADAMS
RESEARCH       FORD
SALES          ALLEN
SALES          WARD
SALES          MARTIN
SALES          BLAKE
SALES          TURNER
SALES          JAMES

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2456909366

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |    14 |   308 |     5  (20)| 00:00:01 |
|   1 |  MERGE JOIN                  |              |    14 |   308 |     5  (20)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| EMP          |    14 |   126 |     1   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | I$EMP$DEPTNO |    14 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT JOIN                  |              |     4 |    52 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | DEPT         |     4 |    52 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   4 - access("D"."DEPTNO"="E"."DEPTNO")
       filter("D"."DEPTNO"="E"."DEPTNO")

SQL>



....
stax
...
Рейтинг: 0 / 0
13.11.2017, 14:12
    #39552222
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
Stax,

я имел ввиду одинаковые планы показывать.
...
Рейтинг: 0 / 0
13.11.2017, 14:13
    #39552224
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
Stax,

спасибо за ответ. А можно узнать почему они разные? или ссылку.
...
Рейтинг: 0 / 0
13.11.2017, 14:14
    #39552226
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
нет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?
...
Рейтинг: 0 / 0
13.11.2017, 14:26
    #39552241
и мне!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
А может у кого-нибудь есть еще ссылочка, где подробно расписано, как программировать? Очень надо, заранее спасибо.
...
Рейтинг: 0 / 0
13.11.2017, 14:31
    #39552248
тоже хочу
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
нет ни у кого случайно ссылки, гед подробно расписано как открыть таблицу оракла в экселе?
...
Рейтинг: 0 / 0
13.11.2017, 15:26
    #39552297
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
есть такой запрос:

Код: plsql
1.
2.
3.
4.
5.
select *
  from  t1,t2
 where  t1.id = t2.id
   and  t1.name like '%иван%'
   and  t1.last_name like '%иванов%'


1. Сначала будут отобраны данные по условиям на лайк и потом произойдет соединение таблиц или наоборот?
2. Зависит ли ответ на первый вопрос от типа условий(=,!=,like и т.д.) по которым отбираются записи?
3. Зависит ли ответ на первый вопрос от типа соединения(nl,merge,hash)?

если можно пришлите плз ссылки.
...
Рейтинг: 0 / 0
13.11.2017, 15:35
    #39552305
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
cobalt_frogнет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?

Достаточно подробно - здесь
https://docs.oracle.com/database/121/TGSQL/title.htm

Но для начала возможно лучше поискать где-нибудь где на более хайлевельном уровне.
...
Рейтинг: 0 / 0
13.11.2017, 15:49
    #39552321
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
Valergrad,

от за это преогромнейшее вам спасибо.
...
Рейтинг: 0 / 0
13.11.2017, 16:06
    #39552333
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
cobalt_frogесть такой запрос:

Код: plsql
1.
2.
3.
4.
5.
select *
  from  t1,t2
 where  t1.id = t2.id
   and  t1.name like '%иван%'
   and  t1.last_name like '%иванов%'


1. Сначала будут отобраны данные по условиям на лайк и потом произойдет соединение таблиц или наоборот?
2. Зависит ли ответ на первый вопрос от типа условий(=,!=,like и т.д.) по которым отбираются записи?
3. Зависит ли ответ на первый вопрос от типа соединения(nl,merge,hash)?

если можно пришлите плз ссылки.

Общее правило - оракл старается любой фильтр использовать максимально рано, как это только возможно. Так что они, скорее всего, пройдут до джойна.
Чтобы убедиться в этом наверняка, вам нужно сделать explain plan и смотреть поля access predicates/filter predicates.
...
Рейтинг: 0 / 0
13.11.2017, 16:13
    #39552340
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
cobalt_frogнет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?Джонатан Льюис "Основы стоимостной оптимизации". Есть на английском, есть на русском.
...
Рейтинг: 0 / 0
13.11.2017, 16:17
    #39552345
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
ValergradТак что они, скорее всего, пройдут до джойна.Это смотря какой джойн. Если hash, то да. Если nested loops или merge join, то все зависит от некоторых факторов, в конечном счете - от выбранного метода доступа к таблице.
...
Рейтинг: 0 / 0
13.11.2017, 16:28
    #39552360
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
AmKadValergradТак что они, скорее всего, пройдут до джойна.Это смотря какой джойн. Если hash, то да. Если nested loops или merge join, то все зависит от некоторых факторов, в конечном счете - от выбранного метода доступа к таблице.Интересно про какие факторы речь.

Есть две эвристики, которые реализованы во всех ключевых СУБД.
Код: plaintext
1.
1. Perform selection as early as possible.
2. Perform projections as early as possible.

Первая значит применять фильтр как можно раньше. В том числе до соединения, если это логически возможно.
Вторая значит отбрасывать ненужные столбцы как можно раньше.
...
Рейтинг: 0 / 0
13.11.2017, 16:28
    #39552361
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
AmKadValergradТак что они, скорее всего, пройдут до джойна.Это смотря какой джойн.
Да и от системы немножко зависит - к примеру, storage indexes могут вносить некоторое разнообразие в монотонность бытия...
...
Рейтинг: 0 / 0
13.11.2017, 16:44
    #39552380
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
dbms_photoshopЕсть две эвристики, которые реализованы во всех ключевых СУБД.
Код: plaintext
1.
1. Perform selection as early as possible.
2. Perform projections as early as possible.

Первая значит применять фильтр как можно раньше. В том числе до соединения, если это логически возможно.
Вторая значит отбрасывать ненужные столбцы как можно раньше.
Любите вы все обобщать...
И какая из вышеуказанных эвристик сработала?
Код: 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.
create table t1 as select rownum id, 'иван' name, 'иванов' last_name from dual connect by rownum <= 1000;
create index idx_t1_id on t1(id);
create table t2 as select 1 id from dual;

begin
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname          => user,
    tabname          => 'T1',
    estimate_percent => 100,
    cascade          => true );
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname          => user,
    tabname          => 'T2',
    estimate_percent => 100,
    cascade          => true );
end;
/

select *
  from  t1,t2
 where  t1.id = t2.id
   and  t1.name like '%иван%'
   and  t1.last_name like '%иванов%';

-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |        |       |     4 (100)|          |
|   1 |  NESTED LOOPS                |           |      1 |    29 |     4   (0)| 00:00:01 |
|   2 |   NESTED LOOPS               |           |      1 |    29 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL         | T2        |      1 |     3 |     2   (0)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN          | IDX_T1_ID |      1 |       |     1   (0)| 00:00:01 |
|*  5 |   TABLE ACCESS BY INDEX ROWID| T1        |      1 |    26 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------


Правило одно, стоимость должна быть минимальной, а фильтры, усечения и прочее лишь способы, на которые не делается акцент.
...
Рейтинг: 0 / 0
13.11.2017, 16:56
    #39552393
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
AlexFF__|,

Согласен, уточнение про стоимость имеет смысл.
...
Рейтинг: 0 / 0
13.11.2017, 17:03
    #39552397
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
dbms_photoshop
Код: plaintext
1. Perform selection as early as possible.
это правда, безотносительно методов джойна и прочего (хотя я бы selection поменял на filter, хотя, наверное, это не важно)

dbms_photoshop
Код: plaintext
1.
2. Perform projections as early as possible...
Вторая значит отбрасывать ненужные столбцы как можно раньше.
а тут, как мне кажется, несколько сомнительное/неточное правило, т.к. слишком раннее получение всех нужных столбцов, которые при этом не нужны для фильтров, приводит к увеличению потребления памяти
...
Рейтинг: 0 / 0
13.11.2017, 17:04
    #39552398
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
AlexFF__|Правило одно, стоимость должна быть минимальнойк сожалению, есть случаи когда эвристические трансформации отрабатывает раньше стоимостных, что приводит к невозможности получения более дешевого плана
...
Рейтинг: 0 / 0
13.11.2017, 17:07
    #39552404
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
AlexFF__|Правило одно, стоимость должна быть минимальной, а фильтры, усечения и прочее лишь способы, на которые не делается акцент.так стоимость от них зависит...
AlexFF__|И какая из вышеуказанных эвристик сработала?эвристики работают для любых планов...
...
Рейтинг: 0 / 0
13.11.2017, 18:27
    #39552460
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
xtenderя бы selection поменял на filter, хотя, наверное, это не важно

...несколько сомнительное/неточное правило, т.к. слишком раннее получение всех нужных столбцов
1. Не надо менять на "фильтр" - все-таки есть определенная разница между селекцией (отбором) и фильтрацией (просеиванием отобранного).
2. Тут непонятно. Алекс говорит об отсеивании заведомо ненужных атрибутов, что, в свою очередь, делает возможным финты ушами вроде table elimination, а не о раннем формировании полного набора атрибутов.
...
Рейтинг: 0 / 0
14.11.2017, 05:41
    #39552595
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
Как обычно - профи ушли в дебри которые новичку даже близко и не нужны :)
В общем и целом - нужно научиться определять по плану порядок операций , а затем смотрите в плане для каждого предиката на каком степе он был применен. В большинстве случаев если предикат используется как access - это хорошо, как filter он должен использоваться только если нельзя использовать как access.
...
Рейтинг: 0 / 0
14.11.2017, 09:18
    #39552641
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hint leading
andrey_anonymous1. Не надо менять на "фильтр" - все-таки есть определенная разница между селекцией (отбором) и фильтрацией (просеиванием отобранного).так о том и речь, что важно как можно раньше не выбрать данные, а отсеять ненужные(a la reduce в MapReduce). Но это вопрос терминологии, потому не так важно...

andrey_anonymous2. Тут непонятно. Алекс говорит об отсеивании заведомо ненужных атрибутов, что, в свою очередь, делает возможным финты ушами вроде table elimination, а не о раннем формировании полного набора атрибутов.join elimination - это никак не "Perform projections as early as possible". Выкинутый шаг невозможно "перформить" раньше или позже...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hint leading / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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