Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
Добрый день,

правильно ли я понимаю, что если в запросе всего две таблицы tst1 и tst2, то хинт leading будет одинаково, что при указании leading(tst1 tst2), что при указании leading(tst2 tst1)?
заранее всех благодарю
13 ноя 17, 10:06    [20948131]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
с точностью до регистра букв
Guest
cobalt_frog
leading будет одинаково
Слово leading всегда пишется одинаково.
13 ноя 17, 10:14    [20948152]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
cobalt_frog,

нет, планы должны получаться разные (если без swap_join_inputs)
13 ноя 17, 11:36    [20948590]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
cobalt_frog,

что значит одинаково?
  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
13 ноя 17, 11:39    [20948611]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
Stax,

я имел ввиду одинаковые планы показывать.
13 ноя 17, 14:12    [20949480]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
Stax,

спасибо за ответ. А можно узнать почему они разные? или ссылку.
13 ноя 17, 14:13    [20949486]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
нет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?
13 ноя 17, 14:14    [20949494]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
и мне!
Guest
А может у кого-нибудь есть еще ссылочка, где подробно расписано, как программировать? Очень надо, заранее спасибо.
13 ноя 17, 14:26    [20949549]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
тоже хочу
Guest
нет ни у кого случайно ссылки, гед подробно расписано как открыть таблицу оракла в экселе?
13 ноя 17, 14:31    [20949572]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
есть такой запрос:

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)?

если можно пришлите плз ссылки.
13 ноя 17, 15:26    [20949824]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
Valergrad
Member

Откуда:
Сообщений: 704
cobalt_frog
нет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?


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

Но для начала возможно лучше поискать где-нибудь где на более хайлевельном уровне.
13 ноя 17, 15:35    [20949887]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
Valergrad,

от за это преогромнейшее вам спасибо.
13 ноя 17, 15:49    [20949958]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
Valergrad
Member

Откуда:
Сообщений: 704
cobalt_frog
есть такой запрос:

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.
13 ноя 17, 16:06    [20950023]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
AmKad
Member

Откуда:
Сообщений: 5222
cobalt_frog
нет ни у кого случайно ссылки, гед подробно расписано как формируется план и по каким правилам?
Джонатан Льюис "Основы стоимостной оптимизации". Есть на английском, есть на русском.
13 ноя 17, 16:13    [20950044]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Valergrad
Так что они, скорее всего, пройдут до джойна.
Это смотря какой джойн. Если hash, то да. Если nested loops или merge join, то все зависит от некоторых факторов, в конечном счете - от выбранного метода доступа к таблице.
13 ноя 17, 16:17    [20950055]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
AmKad
Valergrad
Так что они, скорее всего, пройдут до джойна.
Это смотря какой джойн. Если hash, то да. Если nested loops или merge join, то все зависит от некоторых факторов, в конечном счете - от выбранного метода доступа к таблице.
Интересно про какие факторы речь.

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

Первая значит применять фильтр как можно раньше. В том числе до соединения, если это логически возможно.
Вторая значит отбрасывать ненужные столбцы как можно раньше.
13 ноя 17, 16:28    [20950099]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
AmKad
Valergrad
Так что они, скорее всего, пройдут до джойна.
Это смотря какой джойн.

Да и от системы немножко зависит - к примеру, storage indexes могут вносить некоторое разнообразие в монотонность бытия...
13 ноя 17, 16:28    [20950101]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
dbms_photoshop
Есть две эвристики, которые реализованы во всех ключевых СУБД.
1. Perform selection as early as possible.
2. Perform projections as early as possible.

Первая значит применять фильтр как можно раньше. В том числе до соединения, если это логически возможно.
Вторая значит отбрасывать ненужные столбцы как можно раньше.

Любите вы все обобщать...
И какая из вышеуказанных эвристик сработала?
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 |
-------------------------------------------------------------------------------------------

Правило одно, стоимость должна быть минимальной, а фильтры, усечения и прочее лишь способы, на которые не делается акцент.
13 ноя 17, 16:44    [20950167]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
AlexFF__|,

Согласен, уточнение про стоимость имеет смысл.
13 ноя 17, 16:56    [20950226]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
dbms_photoshop
1. Perform selection as early as possible.
это правда, безотносительно методов джойна и прочего (хотя я бы selection поменял на filter, хотя, наверное, это не важно)

dbms_photoshop
2. Perform projections as early as possible...
Вторая значит отбрасывать ненужные столбцы как можно раньше.
а тут, как мне кажется, несколько сомнительное/неточное правило, т.к. слишком раннее получение всех нужных столбцов, которые при этом не нужны для фильтров, приводит к увеличению потребления памяти
13 ноя 17, 17:03    [20950253]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
AlexFF__|
Правило одно, стоимость должна быть минимальной
к сожалению, есть случаи когда эвристические трансформации отрабатывает раньше стоимостных, что приводит к невозможности получения более дешевого плана
13 ноя 17, 17:04    [20950261]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
AlexFF__|
Правило одно, стоимость должна быть минимальной, а фильтры, усечения и прочее лишь способы, на которые не делается акцент.
так стоимость от них зависит...
AlexFF__|
И какая из вышеуказанных эвристик сработала?
эвристики работают для любых планов...
13 ноя 17, 17:07    [20950277]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
xtender
я бы selection поменял на filter, хотя, наверное, это не важно

...несколько сомнительное/неточное правило, т.к. слишком раннее получение всех нужных столбцов

1. Не надо менять на "фильтр" - все-таки есть определенная разница между селекцией (отбором) и фильтрацией (просеиванием отобранного).
2. Тут непонятно. Алекс говорит об отсеивании заведомо ненужных атрибутов, что, в свою очередь, делает возможным финты ушами вроде table elimination, а не о раннем формировании полного набора атрибутов.
13 ноя 17, 18:27    [20950542]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
Valergrad
Member

Откуда:
Сообщений: 704
Как обычно - профи ушли в дебри которые новичку даже близко и не нужны :)
В общем и целом - нужно научиться определять по плану порядок операций , а затем смотрите в плане для каждого предиката на каком степе он был применен. В большинстве случаев если предикат используется как access - это хорошо, как filter он должен использоваться только если нельзя использовать как access.
14 ноя 17, 05:41    [20951233]     Ответить | Цитировать Сообщить модератору
 Re: Hint leading  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
andrey_anonymous
1. Не надо менять на "фильтр" - все-таки есть определенная разница между селекцией (отбором) и фильтрацией (просеиванием отобранного).
так о том и речь, что важно как можно раньше не выбрать данные, а отсеять ненужные(a la reduce в MapReduce). Но это вопрос терминологии, потому не так важно...

andrey_anonymous
2. Тут непонятно. Алекс говорит об отсеивании заведомо ненужных атрибутов, что, в свою очередь, делает возможным финты ушами вроде table elimination, а не о раннем формировании полного набора атрибутов.
join elimination - это никак не "Perform projections as early as possible". Выкинутый шаг невозможно "перформить" раньше или позже...
14 ноя 17, 09:18    [20951351]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить