Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Precompute_Subquery vs Hard-Coded Values  [new]
sixers
Member

Откуда:
Сообщений: 145
Объясните пожалуйста,
Планы одинаковые, предикаты тоже, а consistent gets и время выполнения отличаются.
Уже задавал подобный вопрос на форуме. Но столкнулся второй раз, хотелось бы понять, почему так происходит.
SQL> set autotrace traceonly
SQL> SELECT B.E_DATE,
  2         B.T_CODE,
  3         DENSE_RANK() OVER(PARTITION BY B.T_CODE ORDER BY B.B_DATE DESC) RANK1
  4    FROM R_DBO.STATIC_T B
  5   WHERE B.B_DATE >= SYSDATE - 15
  6     AND B.R_CODE IS NOT NULL
  7     AND B.T_CODE IN (SELECT /*+ PRECOMPUTE_SUBQUERY */
  8                            T_CODE
  9                             FROM MYK_TEST M)
 10     AND TRIM(B.E_DATE) IS NOT NULL;
76 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 2049180976
--------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                    | Rows  | Bytes |COST (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                         |     1 |    33 |7809  (10)| 00:01:34 |
|   1 |  WINDOW SORT                 |                         |     1 |    33 |7809  (10)| 00:01:34 |
|*  2 |   TABLE ACCESS BY INDEX ROWID| STATIC_T                |     1 |    33 |7808  (10)| 00:01:34 |
|*  3 |    INDEX RANGE SCAN          | STATIC_T_IDX1           |    31 |       |7781  (10)| 00:01:34 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TRIM(INTERNAL_FUNCTION("B"."E_DATE")) IS NOT NULL)
   3 - access("B"."B_DATE">=SYSDATE@!-15)
       filter(("B"."T_CODE"='47284907' OR "B"."T_CODE"='49985485' OR
              "B"."T_CODE"='80715186' OR "B"."T_CODE"='80805916' OR "B"."T_CODE"='80920449' OR
              "B"."T_CODE"='80970729' OR "B"."T_CODE"='81182570' OR "B"."T_CODE"='81382008' OR
              "B"."T_CODE"='81470430' OR "B"."T_CODE"='83033069') AND "B"."R_CODE" IS NOT NULL)
Statistics
----------------------------------------------------------
         28  recursive calls
          0  db block gets
      83157  consistent gets
         47  physical reads
          0  redo size
       1317  bytes sent via SQL*Net to client
        282  bytes received via SQL*Net from client
          7  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
         76  rows processed

SQL> set autotrace off
SQL> select * from myk_test;
T_CODE
--------------------------------------------------------------------------------
80920449
80805916
80715186
80970729
81182570
49985485
81382008
83033069
47284907
81470430
10 rows selected.

SQL> set autotrace traceonlySQL> SELECT B.E_DATE,
  2         B.T_CODE,
  3         DENSE_RANK() OVER(PARTITION BY B.T_CODE ORDER BY B.B_DATE DESC) RANK1
  4    FROM R_DBO.STATIC_T B
  5   WHERE B.B_DATE >= SYSDATE - 15
  6     AND B.R_CODE IS NOT NULL
  7     AND B.T_CODE IN ('80920449',
  8                          '80805916',
  9                          '80715186',
 10                          '80970729',
 11                          '81182570',
 12                          '49985485',
 13                          '81382008',
 14                          '83033069',
 15                          '47284907',
 16                          '81470430'
 17                          )
 18      AND TRIM(B.E_DATE) IS NOT NULL;
76 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2049180976
--------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                    | Rows  | Bytes |COST (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                         |     1 |    33 |7808  (10)| 00:01:34 |
|   1 |  WINDOW SORT                 |                         |     1 |    33 |7808  (10)| 00:01:34 |
|*  2 |   TABLE ACCESS BY INDEX ROWID| STATIC_T                |     1 |    33 |7807  (10)| 00:01:34 |
|*  3 |    INDEX RANGE SCAN          | STATIC_T_IDX1           |    31 |       |7780  (10)| 00:01:34 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TRIM(INTERNAL_FUNCTION("B"."E_DATE")) IS NOT NULL)
   3 - access("B"."B_DATE">=SYSDATE@!-15)
       filter(("B"."T_CODE"='47284907' OR "B"."T_CODE"='49985485' OR
       "B"."T_CODE"='80715186' OR "B"."T_CODE"='80805916' OR "B"."T_CODE"='80920449' OR
        "B"."T_CODE"='80970729' OR "B"."T_CODE"='81182570' OR "B"."T_CODE"='81382008' OR
        "B"."T_CODE"='81470430' OR "B"."T_CODE"='83033069') AND "B"."R_CODE" IS NOT NULL)
Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      8377  consistent gets 
          0  physical reads
          0  redo size
       1317  bytes sent via SQL*Net to client
        282  bytes received via SQL*Net from client
          7  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         76  rows processed

SQL>
27 янв 12, 17:01    [11985045]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
A.
Guest
Трассировку сделай и увидишь свои 28 recursive calls.
Ну и вроде как должно быть очевидно что делает precompute_subquery ?
27 янв 12, 17:11    [11985121]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
A.
Guest
A.
Трассировку сделай и увидишь свои 28 recursive calls.
Ну и вроде как должно быть очевидно что делает precompute_subquery ?
И как оно должно влиять на consistent gets
27 янв 12, 17:16    [11985172]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
sixers
Member

Откуда:
Сообщений: 145
A.,

Трейс в приложении, не увидел 28 recursive calls -(
Вопрос в том, почему планы запросов одинаковые?

К сообщению приложен файл (preq_subq.zip - 1Kb) cкачать
27 янв 12, 18:02    [11985682]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
A.
Guest
Судя по трейсу у тебя precompute_subquery не сработал.
Все выглядит так как если у тебя explain plan выполнял precompute_subquery, execution - нет.

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

Версия базы какая? Почему клиент 10.2.0.3?
27 янв 12, 18:40    [11985897]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
sixers
Member

Откуда:
Сообщений: 145
Трейс для precompute_subquery
Версия базы 10.2.0.4
Теперь появились ожидания db file sequential read.
Так почему план не соответствует выполнению?
Спасибо.

К сообщению приложен файл (preq_subq2.zipx - 142Kb) cкачать
27 янв 12, 20:43    [11986451]     Ответить | Цитировать Сообщить модератору
 Re: Precompute_Subquery vs Hard-Coded Values  [new]
А.
Guest
sixers
Так почему план не соответствует выполнению?
Спасибо.

autotrace показывает план делая explain plan в другой сессии. Он запросто может не совпасть с реальным.
Пока не могу посмотреть второй трейс.
27 янв 12, 21:30    [11986662]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
ОЧЕНЬ привлекательные цены на курсы Oracle — от 26 тыс.руб.!
Все курсы по базам данных: Microsoft SQL Server 2014, Oracle, IBM DB2, Access, MySql