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

Откуда: Киев
Сообщений: 1519
Всем привет.
Есть два запроса и планы на них. Первый имеет очень большой cost но выполняется достаточно быстро - порялка 15 секунда, а вот второй, который без хинта, выполняется очень долго.... до конца так и не дождался. Как такое может быть.... и есть ли какие-нибудь советы по его оптимизации.?

SELECT /*+ LEADING(g eu_b) */dd.dim_date_id,
                'purch_rec' ANALYTIC_CD,
                g.general_value BAR_NAME,
                count(eu_b.eu_id) BAR_value
          FROM eu_transaction eu_b,
               d_dim_general g,
               d_dim_date dd
          WHERE dd.PARENT_ID is null
           and g.general_cd = 'numrange'
           and  eu_b.transaction_date is not null
           and trunc(sysdate-eu_b.transaction_date) between g.range_from and nvl(g.range_till,trunc(sysdate-eu_b.transaction_date))
         group by dd.dim_date_id,
                  g.general_value
 
------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name             | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                  |     1 |    38 |       |  2568K  (3)| 08:33:38 |
|   1 |  HASH GROUP BY                  |                  |     1 |    38 |       |  2568K  (3)| 08:33:38 |
|   2 |   MERGE JOIN CARTESIAN          |                  |     1 |    38 |       |  2568K  (3)| 08:33:38 |
|   3 |    MERGE JOIN                   |                  | 24656 |   674K|       |  5213   (3)| 00:01:03 |
|   4 |     SORT JOIN                   |                  |    14 |   280 |       |     3  (34)| 00:00:01 |
|   5 |      TABLE ACCESS BY INDEX ROWID| D_DIM_GENERAL    |    14 |   280 |       |     2   (0)| 00:00:01 |
|*  6 |       INDEX RANGE SCAN          | PK_D_DIM_GENERAL |    14 |       |       |     1   (0)| 00:00:01 |
|*  7 |     FILTER                      |                  |       |       |       |            |          |
|*  8 |      SORT JOIN                  |                  |   704K|  5503K|    21M|  5210   (3)| 00:01:03 |
|*  9 |       TABLE ACCESS FULL         | EU_TRANSACTION   |   704K|  5503K|       |  2570   (2)| 00:00:31 |
|  10 |    BUFFER SORT                  |                  |     1 |    10 |       |  2565K  (3)| 08:33:07 |
|* 11 |     TABLE ACCESS FULL           | D_DIM_DATE       |     1 |    10 |       |   104   (2)| 00:00:02 |
------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   6 - access("G"."GENERAL_CD"='numrange')
   7 - filter(TRUNC(SYSDATE@!-"EU_B"."TRANSACTION_DATE")<=NVL("G"."RANGE_TILL",TRUNC(SYSDATE@!-"EU_B
              "."TRANSACTION_DATE")))
   8 - access("G"."RANGE_FROM"<=TRUNC(SYSDATE@!-"EU_B"."TRANSACTION_DATE"))
       filter("G"."RANGE_FROM"<=TRUNC(SYSDATE@!-"EU_B"."TRANSACTION_DATE"))
   9 - filter("EU_B"."TRANSACTION_DATE" IS NOT NULL)
  11 - filter("DD"."PARENT_ID" IS NULL)



SELECT dd.dim_date_id,
                'purch_rec' ANALYTIC_CD,
                g.general_value BAR_NAME,
                count(eu_b.eu_id) BAR_value
          FROM eu_transaction eu_b,
               d_dim_general g,
               d_dim_date dd
          WHERE dd.PARENT_ID is null
           and g.general_cd = 'numrange'
           and  eu_b.transaction_date is not null
           and trunc(sysdate-eu_b.transaction_date) between g.range_from and nvl(g.range_till,trunc(sysdate-eu_b.transaction_date))
         group by dd.dim_date_id,
                  g.general_value
 
----------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                  |     1 |    38 |  2678   (2)| 00:00:33 |
|   1 |  HASH GROUP BY                  |                  |     1 |    38 |  2678   (2)| 00:00:33 |
|   2 |   NESTED LOOPS                  |                  |     1 |    38 |  2677   (2)| 00:00:33 |
|   3 |    MERGE JOIN CARTESIAN         |                  |     1 |    30 |   107   (2)| 00:00:02 |
|*  4 |     TABLE ACCESS FULL           | D_DIM_DATE       |     1 |    10 |   105   (2)| 00:00:02 |
|   5 |     BUFFER SORT                 |                  |    14 |   280 |     2   (0)| 00:00:01 |
|   6 |      TABLE ACCESS BY INDEX ROWID| D_DIM_GENERAL    |    14 |   280 |     2   (0)| 00:00:01 |
|*  7 |       INDEX RANGE SCAN          | PK_D_DIM_GENERAL |    14 |       |     1   (0)| 00:00:01 |
|*  8 |    TABLE ACCESS FULL            | EU_TRANSACTION   |  1761 | 14088 |  2570   (2)| 00:00:31 |
----------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - filter("DD"."PARENT_ID" IS NULL)
   7 - access("G"."GENERAL_CD"='numrange')
   8 - filter("EU_B"."TRANSACTION_DATE" IS NOT NULL AND 
              "G"."RANGE_FROM"<=TRUNC(SYSDATE@!-"EU_B"."TRANSACTION_DATE") AND 
              TRUNC(SYSDATE@!-"EU_B"."TRANSACTION_DATE")<=NVL("G"."RANGE_TILL",TRUNC(SYSDATE@!-"EU_B"."TRA
              NSACTION_DATE")))



13 ноя 08, 18:42    [6437525]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
SimonInBlues
Member

Откуда: Балаково
Сообщений: 264
если есть индекс по eu_transaction.transaction_date, то попробуй такой запрос:

select 
      dd.dim_date_id,
      'purch_rec' analytic_cd,
      g.general_value bar_name,
      count(eu_b.eu_id) bar_value
from  eu_transaction eu_b, 
      d_dim_general g, 
      d_dim_date dd
where dd.parent_id is null
  and g.general_cd = 'numrange'
  and eu_b.transaction_date is not null
  and eu_b.transaction_date between (trunc(sysdate) - nvl(g.range_till, trunc(sysdate))) and (trunc(sysdate) - g.range_from)
group by dd.dim_date_id, g.general_value
13 ноя 08, 20:26    [6437976]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Добрый Э - Эх
Guest
_Alex_SMIRNOV_
------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name             | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------
|   2 |   MERGE JOIN CARTESIAN          |                  |     1 |    38 |       |  2568K  (3)| 08:33:38 |


Это так и задумано или случайно связка таблиц выпала из запроса?
14 ноя 08, 05:05    [6438611]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить