2017-01-30 6 views
2

После запроса занимает около 45 секунд в оракула 11gКак оптимизировать запрос оракула?

select count(cap.ISHIGH),ms.SID,ms.NUM from CDetail cap,MData ms 
where cap.MDataID_FK=ms.MDataID_PK and trunc(cap.CREATEDTIME) between trunc(sysdate-10) and trunc(sysdate) 
group by ms.SID,ms.NUM ; 

объяснить план:

------------------------------------------------------------------------------------------------------------------- 
    | Id | Operation      | Name     | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | 
    ------------------------------------------------------------------------------------------------------------------- 
    | 0 | SELECT STATEMENT     |      | 766K| 32M|  | 94421 (1)| 00:18:54 | 
    | 1 | HASH GROUP BY     |      | 766K| 32M| 41M| 94421 (1)| 00:18:54 | 
    |* 2 | HASH JOIN      |      | 766K| 32M| 21M| 85716 (1)| 00:17:09 | 
    | 3 | VIEW       | VW_GBC_5    | 766K| 13M|  | 73348 (1)| 00:14:41 | 
    | 4 |  HASH GROUP BY    |      | 766K| 13M| 98M| 73348 (1)| 00:14:41 | 
    |* 5 |  FILTER      |      |  |  |  |   |   | 
    | 6 |  TABLE ACCESS BY INDEX ROWID| CDetail   | 3217K| 58M|  | 63738 (1)| 00:12:45 | 
    |* 7 |  INDEX RANGE SCAN   | IDX_CPCTYDTLTRNCCRTDTM | 3365K|  |  | 14679 (1)| 00:02:57 | 
    | 8 | TABLE ACCESS FULL    | MData  | 871K| 22M|  | 9665 (1)| 00:01:56 | 
    ------------------------------------------------------------------------------------------------------------------- 

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

     2 - access("ITEM_1"="MS"."MDataID_PK") 
     5 - filter(TRUNC([email protected]!-10)<=TRUNC([email protected]!)) 
     7 - access(TRUNC(INTERNAL_FUNCTION("CREATEDTIME"))>=TRUNC([email protected]!-10) AND 
        TRUNC(INTERNAL_FUNCTION("CREATEDTIME"))<=TRUNC([email protected]!)) 

table MData contains around 900,000 rows and table CDetail contains 23,000,000 rows. 

Should I introduce any new index or any other way to optimize the above query. 

Edit 3. IDX_CPCTYDTLTRNCCRTDTM представляет собой функциональный индекс СТВОЛА (CREATEDTIME) Edit: 1

пояснить план: для полного сканирования таблицы usi нг намек/+ полный (Cdetail)/

--------------------------------------------------------------------------------------------------- 
| Id | Operation    | Name    | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | 
--------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |     | 780K| 33M|  | 160K (2)| 00:32:01 | 
| 1 | HASH GROUP BY   |     | 780K| 33M| 42M| 160K (2)| 00:32:01 | 
|* 2 | HASH JOIN   |     | 780K| 33M| 22M| 151K (2)| 00:30:15 | 
| 3 | VIEW    | VW_GBC_5   | 780K| 13M|  | 138K (2)| 00:27:46 | 
| 4 |  HASH GROUP BY  |     | 780K| 14M| 230M| 138K (2)| 00:27:46 | 
|* 5 |  FILTER   |     |  |  |  |   |   | 
|* 6 |  TABLE ACCESS FULL| CDetail | 7521K| 136M|  | 120K (2)| 00:24:02 | 
| 7 | TABLE ACCESS FULL | MData | 890K| 22M|  | 9666 (1)| 00:01:56 | 
--------------------------------------------------------------------------------------------------- 

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

    2 - access("ITEM_1"="MS"."MDataID_PK") 
    5 - filter(TRUNC([email protected]!-10)<=TRUNC([email protected]!)) 
    6 - filter(TRUNC(INTERNAL_FUNCTION("CREATEDTIME"))>=TRUNC([email protected]!-10) AND 
       TRUNC(INTERNAL_FUNCTION("CREATEDTIME"))<=TRUNC([email protected]!)) 
+1

Вы должны добавить индексы по столбцам между '' CDetail' и MData', а именно '' MDataID_FK' и столбцов MDataID_PK' , Это должно ускорить соединение. –

+0

@TimBiegeleisen. Почему, по вашему мнению, этот индекс поможет? – BobC

+0

@BobC Ну, соединение должно выполняться с или без последующей агрегации, и не будет ли индекс делать это быстрее? –

ответ

0
  1. Спасибо за обмен объяснить план; Это хороший старт. Однако дело с планом объяснений заключается в том, что оно дает вам оценки, а не фактические данные. Если можно, можете ли вы получить отчет SQL Monitor? Это покажет вам фактическую мощность и покажет вам, где время расходуется на запрос.

  2. Фильтр даты ожидает примерно 3M строк (ID 6 и 7)? Это точно?

  3. Каково определение индекса IDX_CPCTYDTLTRNCCRTDTM? Функционирует ли это функция?

  4. Чтобы проверить мои мысли, вы можете добавить следующий намек, запустить запрос и снова получить план объяснения.

    выберите/* + полный (крышка) */...

+0

2. Да 3M строки точны. Для 3 и 4 я отредактировал мой вопрос –

+0

@VarshaGadekar. Как долго выполнялся запрос при использовании полного сканирования? – BobC

+0

Запрос занял 30 секунд, используя полное сканирование таблицы –

Смежные вопросы