2012-11-27 4 views
1
select 
<here I have functions like to_char, nvl, rtrim, ltrim, sum, decode> 
from 
table1 
table2 
where 
joining conditions 1 
joining conditions 2 
group by 
<here I have functions like to_char, nvl, rtrim, ltrim, sum, decode> 

나는 프로덕션에서이 쿼리를 얻었고 조정할 몇 가지 솔루션을 제공해야한다고 생각했지만 그룹별로 inbex 기반의 함수를 사용하려고 생각했습니다. select 열은 색인 일 필요가 없다고 생각합니다. 나는 이틀 안에 환경을 얻을 것이다.하지만 그 전에는 다른 apporaches를 생각해 낼 필요가있다. 인덱스로 함수가 유용하다는 것을 확인하기 위해 필요한 것은 무엇입니까? 또한, 설명과는 별도로 DBA에게 다른 문서를 요청해야합니까?함수 기반 인덱스

SELECT 
    D_E_TRADE.DATE_VALUE, 
    to_char(D_E_TRADE.DATE_VALUE,'Mon-yyyy'), 
    NVL(P_DIM.P_NAME,' '), 
    rtrim(ltrim(P_DIM.C_CTRY)), 
    D_E_TRADE.YEAR, 
    L_E_DIM.L_CODE, 
    NVL(D_DIM.DESCR,' '), 
    (decode(D_DIM.DEPT_ID,'-1',' ',D_DIM.DEPT_ID)), 
    sum(A_CGE.TOTAL_CALC_NET_FEES), 
    L_E_DIM.L_NAME, 
    decode(A_CGE.E_M_CENTER,-9,0,A_CGE.E_M_CENTER), 
    NVL(F_DIM.S_DESC,'-1'), 
    sum(A_CGE.C_TOTAL_SHARES) 
FROM 
    DATE_D D_E_TRADE, 
    P_DIM, 
    L_E_DIM, 
    D_DIM, 
    A_CGE, 
    F_DIM 
WHERE 
    (D_E_TRADE.DATE_KEY=A_CGE.T_KEY ) 
    AND (P_DIM.PARTY_KEY=A_CGE.E_P_KEY ) 
    AND (F_DIM.F_T_KEY=A_CGE.F_T_KEY ) 
    AND (L_E_DIM.L_E_KEY=A_CGE.L_E_KEY ) 
    AND (D_DIM.DEPT_KEY=A_CGE.DEPT_KEY ) 
    AND 
    (
    rtrim(ltrim(P_DIM.C_CTRY)) = 'AC' 
    AND 
    (A_CGE.T_KEY >= (SELECT DATE_D_PROMPTS.DATE_KEY FROM DATE_D DATE_D_PROMPTS WHERE ( DATE_D_PROMPTS.DATE_VALUE = '01-01-2012 00:00:00' )) 
AND 
A_CGE.T_KEY <= (SELECT DATE_D_PROMPTS.DATE_KEY FROM DATE_D DATE_D_PROMPTS WHERE ( DATE_D_PROMPTS.DATE_VALUE = '31-08-2012 00:00:00' )) 
    AND 
A_CGE.TRANS_REGION_KEY IN (SELECT REGION_KEY FROM REGION_DIM WHERE REGION_DIM.REGION_NAME IN ('Americas'))                          ) 
    AND 
    (A_CGE.T_KEY >= (SELECT DATE_D_PROMPTS.DATE_KEY FROM DATE_D DATE_D_PROMPTS WHERE ( DATE_D_PROMPTS.DATE_VALUE = '01-01-2012 00:00:00' )) 
AND 
A_CGE.T_KEY <= (SELECT DATE_D_PROMPTS.DATE_KEY FROM DATE_D DATE_D_PROMPTS WHERE ( DATE_D_PROMPTS.DATE_VALUE = '31-08-2012 00:00:00' )) 
    AND 
A_CGE.TRANS_REGION_KEY IN (SELECT REGION_KEY FROM REGION_DIM WHERE REGION_DIM.REGION_NAME IN ('Americas'))                          ) 
    AND 
    ('All Fees' IN ('2 - E','3 - P','4 - F','5 - C,')  OR                                  A_CGE.F_T_KEY IN (SELECT F_T_KEY FROM F_DIM WHERE (F_DIM.s_id) || ' - ' || (F_DIM.CHARGE_LVL1_NAME) IN ('2 - E','3 - P','4 - F','5 - C')) ) 
) 
GROUP BY 
    D_E_TRADE.DATE_VALUE, 
    to_char(D_E_TRADE.DATE_VALUE,'Mon-yyyy'), 
    NVL(P_DIM.P_NAME,' '), 
    rtrim(ltrim(P_DIM.C_CTRY)), 
    D_E_TRADE.YEAR, 
    L_E_DIM.L_CODE, 
    NVL(D_DIM.DESCR,' '), 
    (decode(D_DIM.DEPT_ID,'-1',' ',D_DIM.DEPT_ID)), 
    L_E_DIM.L_NAME, 
    decode(A_CGE.E_M_CENTER,-9,0,A_CGE.E_M_CENTER), 
    NVL(F_DIM.S_DESC,'-1') 
+1

아니요, 그룹별로 FBI를 추가하는 것은 시작할 장소가 아니므로 필터링 (where 절)을보고 거기에서 할 수있는 작업 (색인 생성, 쿼리 변경 등)을 수행해야합니다. 지금은 너무 광범위하므로 계획을보고/설명하기 위해 SQL을 제공해야합니다. – DazzaL

+0

나는 더 많은 설명을 위해 실제 SQL을 추가했다. –

+0

설명 계획을 기다리고 있습니다. –

답변

1

Generaly 당신이 필터링 조건이 수도 이십 기가 바이트 때, 인덱스 데이터의 빠른 검색에 당신을 도울 수 - : 나는 언젠가 얻을 것이다 계획을 설명을 위해 내가 여기에 실제 SQL을 추가 해요

, 나는 물었다 색인을 사용하십시오.

은 (색인에있는 경우에만 열을 검색 할 때 또 다른 경우는 수 WHOLD, 그래서 엔진은 테이블에서 아무것도 읽을 필요가없는) 당신의 조건/가입 필터링에 인덱스를해야 할 수도 있습니다, 귀하의 경우에는

을 다음 부분 :

joining conditions 1 
joining conditions 2 

그러나 유의하십시오. 테이블 행의 15 % -20 % 이상을 얻는다면 인덱스를 사용하지 말고 테이블에서 읽는 것이 좋습니다. 즉, 색인을 사용할 수 없습니다.

+0

조회가 실행중인 explain plan은 별도로하고, 튜닝에 필요한 모든 문서는 무엇입니까? –

+0

또한 where 절에서 합류하기 전에 필 터링 조건을 넣으면 다른 점이 있습니까? –

+0

어려운 질문입니다. 나는 모른다. 어쩌면 [oracle sql tunning docs] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm) 또는 [Oracle SQL 튜닝을 검색하는 웹 팁] (http : // www.orafaq.com/tuningguide/) –

관련 문제