Boa tarde, caros colegas. Estou neste momento trabalhando no tune de uma query em particular e gostaria da opinião de vocês quanto à tomada de decisão.
Banco 10.2.0.4.0 Existe essa query que faz parte de uma procedure que roda diariamente. SELECT fcal.business_owner_dim_id, fcal.date_dim_id, dprd.call_type_cd, DPRD.call_type_nm, fcal.gl_product_dim_id, CM.CLASS_OF_SERVICE_ID, TRUNC (SYSDATE) start_effective_date, SUM (billable_minutes) minutes, COUNT ( * ) calls, SUM (FCAL.ACTUAL_CONNECTIONS) connections, SUM (netbasetotcallamt) revenue, ut.USE_TYPE_CATEGORY FROM gdwhs_adm.f_call fcal, gdwhs_adm.d_product dprd, ODS_SFDC.SFDC_BTC_GL_COS_MAP cm, gdwhs_adm.d_use_type ut WHERE partition_key BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -6) AND SYSDATE AND fcal.product_dim_id = dprd.product_dim_id AND FCAL.GL_PRODUCT_DIM_ID = CM.GL_PRODUCT_DIM_ID AND FCAL.USE_TYPE_DIM_ID = UT.USE_TYPE_DIM_ID GROUP BY fcal.business_owner_dim_id, fcal.date_dim_id, dprd.call_type_cd, DPRD.call_type_nm, fcal.gl_product_dim_id, ut.USE_TYPE_CATEGORY, CM.CLASS_OF_SERVICE_ID O plano de execução para a mesma é o seguinte: ----------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 339K| 29M| | 137K (1)| 00:32:10 | | | | | | |* 1 | PX COORDINATOR | | | | | | | | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10004 | 339K| 29M| | 137K (1)| 00:32:10 | | | Q1,04 | P->S | QC (RAND) | | 3 | SORT GROUP BY | | 339K| 29M| 67M| 137K (1)| 00:32:10 | | | Q1,04 | PCWP | | | 4 | PX RECEIVE | | 339K| 29M| | 137K (1)| 00:32:10 | | | Q1,04 | PCWP | | | 5 | PX SEND HASH | :TQ10003 | 339K| 29M| | 137K (1)| 00:32:10 | | | Q1,03 | P->P | HASH | | 6 | SORT GROUP BY | | 339K| 29M| 67M| 137K (1)| 00:32:10 | | | Q1,03 | PCWP | | |* 7 | FILTER | | | | | | | | | Q1,03 | PCWC | | |* 8 | HASH JOIN | | 339K| 29M| | 137K (1)| 00:32:10 | | | Q1,03 | PCWP | | | 9 | PX RECEIVE | | 2189 | 45969 | | 85 (0)| 00:00:02 | | | Q1,03 | PCWP | | | 10 | PX SEND BROADCAST | :TQ10001 | 2189 | 45969 | | 85 (0)| 00:00:02 | | | Q1,01 | P->P | BROADCAST | | 11 | PX BLOCK ITERATOR | | 2189 | 45969 | | 85 (0)| 00:00:02 | | | Q1,01 | PCWC | | | 12 | TABLE ACCESS FULL | D_PRODUCT | 2189 | 45969 | | 85 (0)| 00:00:02 | | | Q1,01 | PCWP | | |* 13 | HASH JOIN | | 339K| 22M| | 137K (1)| 00:32:09 | | | Q1,03 | PCWP | | | 14 | BUFFER SORT | | | | | | | | | Q1,03 | PCWC | | | 15 | PX RECEIVE | | 73 | 1898 | | 3 (0)| 00:00:01 | | | Q1,03 | PCWP | | | 16 | PX SEND BROADCAST | :TQ10000 | 73 | 1898 | | 3 (0)| 00:00:01 | | | | S->P | BROADCAST | | 17 | TABLE ACCESS FULL | SFDC_BTC_GL_COS_MAP | 73 | 1898 | | 3 (0)| 00:00:01 | | | | | | |* 18 | HASH JOIN | | 339K| 14M| | 137K (1)| 00:32:09 | | | Q1,03 | PCWP | | | 19 | PX RECEIVE | | 10 | 60 | | 2 (0)| 00:00:01 | | | Q1,03 | PCWP | | | 20 | PX SEND BROADCAST | :TQ10002 | 10 | 60 | | 2 (0)| 00:00:01 | | | Q1,02 | P->P | BROADCAST | | 21 | PX BLOCK ITERATOR | | 10 | 60 | | 2 (0)| 00:00:01 | | | Q1,02 | PCWC | | | 22 | TABLE ACCESS FULL| D_USE_TYPE | 10 | 60 | | 2 (0)| 00:00:01 | | | Q1,02 | PCWP | | | 23 | PX BLOCK ITERATOR | | 339K| 12M| | 137K (1)| 00:32:09 | KEY | KEY | Q1,03 | PCWC | | |* 24 | TABLE ACCESS FULL | F_CALL | 339K| 12M| | 137K (1)| 00:32:09 | KEY | KEY | Q1,03 | PCWP | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_DATE(:I_6C_BI_FROM_DATE)<=TO_DATE(:I_REFRESH_DATE)) 7 - filter(TO_DATE(:I_6C_BI_FROM_DATE)<=TO_DATE(:I_REFRESH_DATE)) 8 - access("FCAL"."PRODUCT_DIM_ID"="DPRD"."PRODUCT_DIM_ID") 13 - access("FCAL"."GL_PRODUCT_DIM_ID"="CM"."GL_PRODUCT_DIM_ID") 18 - access("FCAL"."USE_TYPE_DIM_ID"="UT"."USE_TYPE_DIM_ID") 24 - filter("PARTITION_KEY">=:I_6C_BI_FROM_DATE AND "PARTITION_KEY"<=:I_REFRESH_DATE) Existe um indice para gdwhs_adm.f_call.partition_key , um bitmat index, mas o mesmo não está sendo usado. Tentei forçar o indice, bem como forçar um parallel no bitmap index usando as hints index_ffs e parallel_index, mas não houve melhora significativa. Essa tabela F_CALL é particionada anualmente. Então, pretendo sugerir um particionamento mensal, visto que, da forma como está hoje, e utilizando os mesmos filtros, caso estejamos no começo do ano, serão lidos dados de 2 anos inteiros para que sejam filtrados apenas dados de 6 meses. Gostaria da impressão de vocês quanto a isso, se alguém tem alguma idéia melhor. Forte a braço, e agradeço desde já pela ajuda. Evandro Giachetto Oracle DBA evandrogiache...@gmail.com