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')
4

1 に答える 1

1

一般に、インデックスを使用する可能性のあるフィルタリング条件がある場合、インデックスを使用するとデータを高速に取得できます。

(別のケースは、インデックスにある列のみを取得する場合であるため、エンジンはテーブルから何も読み取る必要はありません)

あなたの場合、次の部分でフィルタリング/結合条件のインデックスが必要になる場合があります。

joining conditions 1
joining conditions 2

しかし、覚えておいてください。テーブルの行の 15% ~ 20% 以上を取得する場合は、インデックスを使用するのではなく、テーブルから読み取ることをお勧めします。つまり、インデックスは使用できません。

于 2012-11-27T10:23:25.800 に答える