2012-11-27 108 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按列分組。我認爲選擇列不一定是索引。我會在幾天內得到環境,但在此之前我需要提出不同的意見。我需要通過索引檢查函數是否有用?另外,除了需要向DBA提出的其他文件的解釋計劃之外,基於功能的索引

我爲這裏增加實際的SQL,我要求解釋計劃,我會在某個時候: -

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,索引幫助你的數據的快速檢索,當你已經過濾條件至極可能使用索引。

(另一種情況whold是當你只檢索是在索引列,所以發動機不需要讀取表的任何東西)

在你的情況,你可能需要的索引上過濾/加盟條件以下部分:

joining conditions 1 
joining conditions 2 

但請記住。如果你得到的表的行數超過15%-20%,最好從表中讀取,而不是使用索引。也就是說,索引可能不被使用。

+0

除了查詢運行的解釋計劃之外,我需要詢問哪些文檔以及需要哪些文檔進行調整。 –

+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/) –