Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Куда уходит FILTER?  [new]
Asmodeus
Member

Откуда: Минск
Сообщений: 543
Следующая ситуация.

Две таблицы: D и FTP. В таблице FTP - по факту одна запись для каждого значения is_session. В таблице D записей может бы сколько угодно. Статистика собрана и актуальна. Однако только на условии соединения таблиц получается декартово произведение. Иллюстрация.
+
SQL> select distinct A.ID_DEMAND,
  2                  A.NUM_LOT,
  3                  A.ID_SESSION,
  4                  count (*) over () as ALL_ROW_COUNT,
  5                  F.SOUND_TIME_BEGIN
  6    from D A, FTP F
  7   where     A.ID_SESSION = 2878
  8         and A.ID_SECTION = 1
  9         and A.ID_NAPRAV = 1
 10         and a.is_active = 1
 11         and A.ID_SESSION = F.ID_SESSION
 12         --and f.id_session = 2878
 13         ;

27 строк выбрано.

SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT                                                                                                                                               
----------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  4rkt8bvgp39s6, child number 1                                                                                                                           
-------------------------------------                                                                                                                           
select distinct A.ID_DEMAND,                 A.NUM_LOT,                                                                                                         
A.ID_SESSION,                 count (*) over () as ALL_ROW_COUNT,                                                                                               
          F.SOUND_TIME_BEGIN   from D A, FTP F  where     A.ID_SESSION                                                                                          
= 2878        and A.ID_SECTION = 1        and A.ID_NAPRAV = 1                                                                                                   
and a.is_active = 1        and A.ID_SESSION = F.ID_SESSION        --and                                                                                         
f.id_session = 2878                                                                                                                                             
                                                                                                                                                                
Plan hash value: 2325136284                                                                                                                                     
                                                                                                                                                                
-------------------------------------------------------------------------------------------------------------------------------------------------------         
| Id  | Operation                       | Name                           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |         
-------------------------------------------------------------------------------------------------------------------------------------------------------         
|   0 | SELECT STATEMENT                |                                |      1 |        |     27 |00:00:00.01 |      20 |       |       |          |         
|   1 |  HASH UNIQUE                    |                                |      1 |      2 |     27 |00:00:00.01 |      20 |   798K|   798K| 1268K (0)|         
|   2 |   WINDOW BUFFER                 |                                |      1 |      2 |     27 |00:00:00.01 |      20 |  4096 |  4096 | 4096  (0)|         
|   3 |    MERGE JOIN CARTESIAN         |                                |      1 |      3 |     27 |00:00:00.01 |      20 |       |       |          |         
|   4 |     TABLE ACCESS BY INDEX ROWID | FTP                            |      1 |      1 |      1 |00:00:00.01 |       2 |       |       |          |         
|*  5 |      INDEX RANGE SCAN           | I_FOREST_TIME_PERIOD_IDSESSION |      1 |      1 |      1 |00:00:00.01 |       1 |       |       |          |         
|   6 |     BUFFER SORT                 |                                |      1 |      3 |     27 |00:00:00.01 |      18 |  2048 |  2048 | 2048  (0)|         
|   7 |      TABLE ACCESS BY INDEX ROWID| D                              |      1 |      3 |     27 |00:00:00.01 |      18 |       |       |          |         
|*  8 |       INDEX RANGE SCAN          | I_DEMANDS_NAMEGOOD             |      1 |      3 |     27 |00:00:00.01 |       3 |       |       |          |         
-------------------------------------------------------------------------------------------------------------------------------------------------------         
                                                                                                                                                                
Predicate Information (identified by operation id):                                                                                                             
---------------------------------------------------                                                                                                             
                                                                                                                                                                
   5 - access("F"."ID_SESSION"=2878)                                                                                                                            
   8 - access("A"."ID_SECTION"=1 AND "A"."ID_SESSION"=2878 AND "A"."ID_NAPRAV"=1 AND "A"."IS_ACTIVE"=1)                                                         
                                                                                                                                                                

31 строк выбрано.

SQL> select distinct A.ID_DEMAND,
  2                  A.NUM_LOT,
  3                  A.ID_SESSION,
  4                  count (*) over () as ALL_ROW_COUNT,
  5                  F.SOUND_TIME_BEGIN
  6    from D A, FTP F
  7   where     A.ID_SESSION = 2878
  8         and A.ID_SECTION = 1
  9         and A.ID_NAPRAV = 1
 10         and a.is_active = 1
 11         and A.ID_SESSION = F.ID_SESSION
 12         and f.id_session = 2878
 13         ;

27 строк выбрано.

SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT                                                                                                                                               
----------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  8sd2ds9403hjv, child number 1                                                                                                                           
-------------------------------------                                                                                                                           
select distinct A.ID_DEMAND,                 A.NUM_LOT,                                                                                                         
A.ID_SESSION,                 count (*) over () as ALL_ROW_COUNT,                                                                                               
          F.SOUND_TIME_BEGIN   from D A, FTP F  where     A.ID_SESSION                                                                                          
= 2878        and A.ID_SECTION = 1        and A.ID_NAPRAV = 1                                                                                                   
and a.is_active = 1        and A.ID_SESSION = F.ID_SESSION        and                                                                                           
f.id_session = 2878                                                                                                                                             
                                                                                                                                                                
Plan hash value: 1054189618                                                                                                                                     
                                                                                                                                                                
-------------------------------------------------------------------------------------------------------------------------------------------------------         
| Id  | Operation                       | Name                           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |         
-------------------------------------------------------------------------------------------------------------------------------------------------------         
|   0 | SELECT STATEMENT                |                                |      1 |        |     27 |00:00:00.01 |      22 |       |       |          |         
|   1 |  HASH UNIQUE                    |                                |      1 |      1 |     27 |00:00:00.01 |      22 |   798K|   798K| 1269K (0)|         
|   2 |   WINDOW BUFFER                 |                                |      1 |      1 |     27 |00:00:00.01 |      22 |  4096 |  4096 | 4096  (0)|         
|   3 |    NESTED LOOPS                 |                                |      1 |        |     27 |00:00:00.01 |      22 |       |       |          |         
|   4 |     NESTED LOOPS                |                                |      1 |      1 |     27 |00:00:00.01 |      21 |       |       |          |         
|   5 |      TABLE ACCESS BY INDEX ROWID| D                              |      1 |      3 |     27 |00:00:00.01 |      18 |       |       |          |         
|*  6 |       INDEX RANGE SCAN          | I_DEMANDS_NAMEGOOD             |      1 |      3 |     27 |00:00:00.01 |       3 |       |       |          |         
|*  7 |      INDEX RANGE SCAN           | I_FOREST_TIME_PERIOD_IDSESSION |     27 |      1 |     27 |00:00:00.01 |       3 |       |       |          |         
|   8 |     TABLE ACCESS BY INDEX ROWID | FTP                            |     27 |      1 |     27 |00:00:00.01 |       1 |       |       |          |         
-------------------------------------------------------------------------------------------------------------------------------------------------------         
                                                                                                                                                                
Predicate Information (identified by operation id):                                                                                                             
---------------------------------------------------                                                                                                             
                                                                                                                                                                
   6 - access("A"."ID_SECTION"=1 AND "A"."ID_SESSION"=2878 AND "A"."ID_NAPRAV"=1 AND "A"."IS_ACTIVE"=1)                                                         
   7 - access("F"."ID_SESSION"=2878)                                                                                                                            
       filter("A"."ID_SESSION"="F"."ID_SESSION")                                                                                                                
                                                                                                                                                                

32 строк выбрано.


Воспроизводится на 10.2.0.4 и 11.2.0.3. Какие есть идеи о причинах такого поведения?
20 дек 12, 17:52    [13661621]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
Asmodeus,
Ну а чем вам не угодило декартово произведение и вы считаете это ошибкой оптимизатора?
20 дек 12, 17:59    [13661656]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
борщ бруевич
Guest
В чём именно проблема?
В твоем случае нет особой разницы в методе соединения, хоть hash join там делай.
20 дек 12, 18:01    [13661660]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
Asmodeus
Member

Откуда: Минск
Сообщений: 543
"Проблема" в том, что одна запись - по факту, но не по бизнес-логике, т.е. записей может стать несколько "без объявления войны" с сопутствующими "все стало тормозить".
20 дек 12, 18:28    [13661776]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
борщ бруевич
Guest
Asmodeus
"Проблема" в том, что одна запись - по факту, но не по бизнес-логике, т.е. записей может стать несколько "без объявления войны" с сопутствующими "все стало тормозить".

ну тогда тебе опасно юзать план, распарсеный в то время, когда была одна строка,
тогда зафиксируй нужный хинтами

для одной строки оба плана нормальные
20 дек 12, 18:30    [13661795]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
Reylonds
Member

Откуда: Казань
Сообщений: 371
я вообще тоже не понял по какой такой логике он отбрасывает условие
20 дек 12, 18:31    [13661803]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
Asmodeus
"Проблема" в том, что одна запись - по факту, но не по бизнес-логике, т.е. записей может стать несколько "без объявления войны" с сопутствующими "все стало тормозить".

Настоящая проблема в том, что тебе просто лень проверить, что же будет с запросом, нескольких записях в таблице FTP.
20 дек 12, 18:59    [13661956]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
Asmodeus
Member

Откуда: Минск
Сообщений: 543
AlexFF__|
Asmodeus
"Проблема" в том, что одна запись - по факту, но не по бизнес-логике, т.е. записей может стать несколько "без объявления войны" с сопутствующими "все стало тормозить".

Настоящая проблема в том, что тебе просто лень проверить, что же будет с запросом, нескольких записях в таблице FTP.

Вот.
+
SQL> select count(*) from ftp where id_session = 2878;

  COUNT(*)
----------
         4

Затрач.время: 00:00:00.00

SQL> begin
  2  dbms_stats.gather_table_stats
  3  (ownname=>'ASMODEUS',
  4  tabname=>'FTP',
  5  cascade=>true,
  6  estimate_percent=>null,
  7  method_opt=>'for all indexed columns size auto',
  8  no_invalidate=>false);
  9  end;
 10  /

Процедура PL/SQL успешно завершена.

Затрач.время: 00:00:00.06

SQL> select distinct A.ID_DEMAND,
  2                  A.NUM_LOT,
  3                  A.ID_SESSION,
  4                  count (*) over () as ALL_ROW_COUNT,
  5                  F.SOUND_TIME_BEGIN
  6    from D A, FTP F
  7   where     A.ID_SESSION = 2878
  8         and A.ID_SECTION = 1
  9         and A.ID_NAPRAV = 1
 10         and a.is_active = 1
 11         and A.ID_SESSION = F.ID_SESSION
 12         --and f.id_session = 2878
 13         ;

27 строк выбрано.

Затрач.время: 00:00:00.03
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  4rkt8bvgp39s6, child number 1
-------------------------------------
select distinct A.ID_DEMAND,                 A.NUM_LOT,
A.ID_SESSION,                 count (*) over () as ALL_ROW_COUNT,
          F.SOUND_TIME_BEGIN   from D A, FTP F  where     A.ID_SESSION
= 2878        and A.ID_SECTION = 1        and A.ID_NAPRAV = 1
and a.is_active = 1        and A.ID_SESSION = F.ID_SESSION        --and
f.id_session = 2878

Plan hash value: 1224676671

-------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                                |      1 |        |     27 |00:00:00.01 |      21 |       |       |          |
|   1 |  HASH UNIQUE                    |                                |      1 |      3 |     27 |00:00:00.01 |      21 |   795K|   795K| 1274K (0)|
|   2 |   WINDOW BUFFER                 |                                |      1 |      3 |    108 |00:00:00.01 |      21 | 11264 | 11264 |10240  (0)|
|   3 |    MERGE JOIN CARTESIAN         |                                |      1 |     10 |    108 |00:00:00.01 |      21 |       |       |          |
|   4 |     TABLE ACCESS BY INDEX ROWID | D                              |      1 |      3 |     27 |00:00:00.01 |      18 |       |       |          |
|*  5 |      INDEX RANGE SCAN           | I_DEMANDS_NAMEGOOD             |      1 |      3 |     27 |00:00:00.01 |       3 |       |       |          |
|   6 |     BUFFER SORT                 |                                |     27 |      4 |    108 |00:00:00.01 |       3 |  2048 |  2048 | 2048  (0)|
|   7 |      TABLE ACCESS BY INDEX ROWID| FTP                            |      1 |      4 |      4 |00:00:00.01 |       3 |       |       |          |
|*  8 |       INDEX RANGE SCAN          | I_FOREST_TIME_PERIOD_IDSESSION |      1 |      4 |      4 |00:00:00.01 |       1 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------------

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

   5 - access("A"."ID_SECTION"=1 AND "A"."ID_SESSION"=2878 AND "A"."ID_NAPRAV"=1 AND "A"."IS_ACTIVE"=1)
   8 - access("F"."ID_SESSION"=2878)


31 строк выбрано.

Затрач.время: 00:00:00.06
SQL> select distinct A.ID_DEMAND,
  2                  A.NUM_LOT,
  3                  A.ID_SESSION,
  4                  count (*) over () as ALL_ROW_COUNT,
  5                  F.SOUND_TIME_BEGIN
  6    from D A, FTP F
  7   where     A.ID_SESSION = 2878
  8         and A.ID_SECTION = 1
  9         and A.ID_NAPRAV = 1
 10         and a.is_active = 1
 11         and A.ID_SESSION = F.ID_SESSION
 12         and f.id_session = 2878
 13  ;

27 строк выбрано.

Затрач.время: 00:00:00.03
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  5ghv6yydqdfqg, child number 0
-------------------------------------
select distinct A.ID_DEMAND,                 A.NUM_LOT,
A.ID_SESSION,                 count (*) over () as ALL_ROW_COUNT,
          F.SOUND_TIME_BEGIN   from D A, FTP F  where     A.ID_SESSION
= 2878        and A.ID_SECTION = 1        and A.ID_NAPRAV = 1
and a.is_active = 1        and A.ID_SESSION = F.ID_SESSION        and
f.id_session = 2878

Plan hash value: 1054189618

-------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                                |      1 |        |     27 |00:00:00.01 |      75 |       |       |          |
|   1 |  HASH UNIQUE                    |                                |      1 |      1 |     27 |00:00:00.01 |      75 |   795K|   795K| 1266K (0)|
|   2 |   WINDOW BUFFER                 |                                |      1 |      1 |    108 |00:00:00.01 |      75 | 11264 | 11264 |10240  (0)|
|   3 |    NESTED LOOPS                 |                                |      1 |        |    108 |00:00:00.01 |      75 |       |       |          |
|   4 |     NESTED LOOPS                |                                |      1 |      1 |    108 |00:00:00.01 |      21 |       |       |          |
|   5 |      TABLE ACCESS BY INDEX ROWID| D                              |      1 |      3 |     27 |00:00:00.01 |      18 |       |       |          |
|*  6 |       INDEX RANGE SCAN          | I_DEMANDS_NAMEGOOD             |      1 |      3 |     27 |00:00:00.01 |       3 |       |       |          |
|*  7 |      INDEX RANGE SCAN           | I_FOREST_TIME_PERIOD_IDSESSION |     27 |      1 |    108 |00:00:00.01 |       3 |       |       |          |
|   8 |     TABLE ACCESS BY INDEX ROWID | FTP                            |    108 |      1 |    108 |00:00:00.01 |      54 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------------

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

   6 - access("A"."ID_SECTION"=1 AND "A"."ID_SESSION"=2878 AND "A"."ID_NAPRAV"=1 AND "A"."IS_ACTIVE"=1)
   7 - access("F"."ID_SESSION"=2878)
       filter("A"."ID_SESSION"="F"."ID_SESSION")


32 строк выбрано.

Затрач.время: 00:00:00.04
21 дек 12, 09:34    [13664025]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Cartesian Merge Join
21 дек 12, 09:53    [13664112]     Ответить | Цитировать Сообщить модератору
 Re: Куда уходит FILTER?  [new]
Asmodeus
Member

Откуда: Минск
Сообщений: 543
wurdu
Cartesian Merge Join

Спасибо. Видится (по беглому ознакомлению), что это ОНО. Буду вникать.
21 дек 12, 11:09    [13664538]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить