Oracleパフォーマンスの向上--実績
私はデビューして、対日ソフトの开発に従事してもう一年になりました.現在、私はちょうどJ 2 SEのプロジェクトを維持しています.ちょうど障害のあるOracleの実行効率を高める問題に遭遇しました.私はとても面白いと思って、みんなに分かち合います!皆さんに励ましてもらいたいのですが...
元のSQL文は15万件程度のデータ記録を実行する必要があり、1つのクエリー条件を実行するには少なくとも15分以上かかります.元SQL文は次のとおりです.
このSQL文をSQLPLUSにコピーし、F 5キーを押して実行すると、このSQL文がインデックスに使用されていないことに気づきました.インデックスは次のとおりです.
と書く
Owner Name Type Columns
KMJ TRNSCTNFK1 Normal HNSHTN_CD, DN_NB
KMJ TRNSCTNFK10 Normal HNSHTN_CD, INJZM_KB
KMJ TRNSCTNFK11 Normal HNSHTN_CD, STI_INJZM_KB
KMJ TRNSCTNFK12 Normal HNSHTN_CD, GY_NB, AT_DN_NB
KMJ TRNSCTNFK13 Normal HNSHTN_CD, SHHN_CD, ZK_KSHN_DY, DN_DY
KMJ TRNSCTNFK14 Normal HNSHTN_CD, TRHKSK_CD, TRHKSK_KB, DN_KB, GY_NB, STI_INJZM_KB
KMJ TRNSCTNFK15 Normal HNSHTN_CD, TRHKSK_CD, DN_KB, SKY_DY, CHH_DY
KMJ TRNSCTNFK2 Normal HNSHTN_CD, TRHKSK_CD, DN_DY
KMJ TRNSCTNFK3 Normal HNSHTN_CD, SHHN_CD, DN_DY
KMJ TRNSCTNFK4 Normal HNSHTN_CD, ZK_KSHN_DY
KMJ TRNSCTNFK5 Normal HNSHTN_CD, SYS_SHR_DY, DN_KB
KMJ TRNSCTNFK6 Normal HNSHTN_CD, SKY_DY
KMJ TRNSCTNFK7 Normal HNSHTN_CD, TGT_DY, DN_KB
KMJ TRNSCTNFK8 Normal HNSHTN_CD, DN_DY, DN_KB
KMJ TRNSCTNFK9 Normal HNSHTN_CD, TRHKSK_CD, SKY_DY, CHH_DY
KMJ TRNSCTNPKI Unique HNSHTN_CD, DN_DY, DN_KB, DN_NB, DN_D, KKR_KB, GY_NB, NY_TN_NB
私は一日のテストに合格して、元のSQL文を以下のように最適化した後、効率が最も高く、実行時間が161.875 sに向上したことを発見しました.
日本側はこのような効率にほぼ満足しているが、これはSQL文の実行時間だけで、JAVAの実行時間を加えると5分もかかる.生まれながらにして完璧を追求するプログラマーとしては少し甘んじないようだ.そこで私は上記のSQLを最も原始的な最適化を採用して、性能は倍増して、実行時間は8.912 sしかかかりません.
実は私はORACLEに対して开発の経験がなくて、ただ个人の趣味のため、少し皮の毛を研究します.なぜこのような実行効率が最も高いのか、私は特にはっきりしていないので、皆さんにアドバイスをしてほしい!!!
私はすでに次文の详しい叙述の过程をhttp://rdqwhr.iteye.com/admin/blogs/208382に置いて、どうぞご覧ください!!!
元のSQL文は15万件程度のデータ記録を実行する必要があり、1つのクエリー条件を実行するには少なくとも15分以上かかります.元SQL文は次のとおりです.
SELECT
A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB,
SUM(A.CS_SRY),
SUM(A.BR_SRY),
SUM(A.BR_KNZN_SRY)
FROM TRNSCTN A,
SHHN_MST
WHERE A.HNSHTN_CD='001'
AND ((A.ZK_SK_CD='1'
AND A.ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD')
AND DN_DY<TO_DATE('20080601',
'YYYYMMDD'))
OR (A.ZK_SK_CD='1'
AND A.DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD')
AND TO_DATE('20080623','YYYYMMDD')))
AND DN_GYBN_KB IN('1',
'2',
'5',
'7',
'C',
'D',
'G',
'H')
AND DN_KB IN('1',
'2',
'3',
'4')
AND GY_NB<>'0'
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD
AND A.SHHN_CD=SHHN_MST.SHHN_CD
AND SHHN_MST.BMN_CD BETWEEN '000'
AND '999' )
GROUP BY A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
ORDER BY A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
このSQL文をSQLPLUSにコピーし、F 5キーを押して実行すると、このSQL文がインデックスに使用されていないことに気づきました.インデックスは次のとおりです.
と書く
Owner Name Type Columns
KMJ TRNSCTNFK1 Normal HNSHTN_CD, DN_NB
KMJ TRNSCTNFK10 Normal HNSHTN_CD, INJZM_KB
KMJ TRNSCTNFK11 Normal HNSHTN_CD, STI_INJZM_KB
KMJ TRNSCTNFK12 Normal HNSHTN_CD, GY_NB, AT_DN_NB
KMJ TRNSCTNFK13 Normal HNSHTN_CD, SHHN_CD, ZK_KSHN_DY, DN_DY
KMJ TRNSCTNFK14 Normal HNSHTN_CD, TRHKSK_CD, TRHKSK_KB, DN_KB, GY_NB, STI_INJZM_KB
KMJ TRNSCTNFK15 Normal HNSHTN_CD, TRHKSK_CD, DN_KB, SKY_DY, CHH_DY
KMJ TRNSCTNFK2 Normal HNSHTN_CD, TRHKSK_CD, DN_DY
KMJ TRNSCTNFK3 Normal HNSHTN_CD, SHHN_CD, DN_DY
KMJ TRNSCTNFK4 Normal HNSHTN_CD, ZK_KSHN_DY
KMJ TRNSCTNFK5 Normal HNSHTN_CD, SYS_SHR_DY, DN_KB
KMJ TRNSCTNFK6 Normal HNSHTN_CD, SKY_DY
KMJ TRNSCTNFK7 Normal HNSHTN_CD, TGT_DY, DN_KB
KMJ TRNSCTNFK8 Normal HNSHTN_CD, DN_DY, DN_KB
KMJ TRNSCTNFK9 Normal HNSHTN_CD, TRHKSK_CD, SKY_DY, CHH_DY
KMJ TRNSCTNPKI Unique HNSHTN_CD, DN_DY, DN_KB, DN_NB, DN_D, KKR_KB, GY_NB, NY_TN_NB
私は一日のテストに合格して、元のSQL文を以下のように最適化した後、効率が最も高く、実行時間が161.875 sに向上したことを発見しました.
SELECT
/*+ index(SHHN_MST TRNSCTNFK4)*/ /*+ index(SHHN_MST TRNSCTNFK8)*/
A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB,
SUM(A.CS_SRY),
SUM(A.BR_SRY),
SUM(A.BR_KNZN_SRY)
FROM TRNSCTN A,
SHHN_MST
WHERE A.HNSHTN_CD='001'
AND ((A.ZK_SK_CD='1'
AND A.ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD')
AND DN_DY<TO_DATE('20080601',
'YYYYMMDD'))
OR (A.ZK_SK_CD='1'
AND A.DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD')
AND TO_DATE('20080623','YYYYMMDD')))
AND DN_GYBN_KB IN('1',
'2',
'5',
'7',
'C',
'D',
'G',
'H')
AND DN_KB IN('1',
'2',
'3',
'4')
AND GY_NB<>'0'
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD
AND A.SHHN_CD=SHHN_MST.SHHN_CD
AND SHHN_MST.BMN_CD BETWEEN '000'
AND '999' )
GROUP BY A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
ORDER BY A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
日本側はこのような効率にほぼ満足しているが、これはSQL文の実行時間だけで、JAVAの実行時間を加えると5分もかかる.生まれながらにして完璧を追求するプログラマーとしては少し甘んじないようだ.そこで私は上記のSQLを最も原始的な最適化を採用して、性能は倍増して、実行時間は8.912 sしかかかりません.
SELECT
A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB,
SUM(A.CS_SRY),
SUM(A.BR_SRY),
SUM(A.BR_KNZN_SRY)
FROM
(
SELECT
*
FROM TRNSCTN
WHERE ZK_SK_CD='1'
AND ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD')
AND DN_DY<TO_DATE('20080601',
'YYYYMMDD')
UNION ALL
SELECT
*
FROM TRNSCTN
WHERE ZK_SK_CD='1'
AND DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD')
AND TO_DATE('20080623','YYYYMMDD')
) A,
SHHN_MST
WHERE A.HNSHTN_CD='001'
AND DN_GYBN_KB IN('1',
'2',
'5',
'7',
'C',
'D',
'G',
'H')
AND DN_KB IN('1',
'2',
'3',
'4')
AND GY_NB<>'0'
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD
AND A.SHHN_CD=SHHN_MST.SHHN_CD
AND SHHN_MST.BMN_CD BETWEEN '000'
AND '999' )
GROUP BY A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
ORDER BY A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
実は私はORACLEに対して开発の経験がなくて、ただ个人の趣味のため、少し皮の毛を研究します.なぜこのような実行効率が最も高いのか、私は特にはっきりしていないので、皆さんにアドバイスをしてほしい!!!
私はすでに次文の详しい叙述の过程をhttp://rdqwhr.iteye.com/admin/blogs/208382に置いて、どうぞご覧ください!!!