Phô lôc C giíi thiÖu qu¸ tr×nh tèi u c©u lÖnh kÕt nèi trong phÇn mÒm tra cøu v¨n b¶n ph¸p qui.
Sau khi ph©n tÝch qu¸ tr×nh thùc hiÖn c¸c c©u lÖnh SQL cña phÇn mÒm Tra cøu v¨n b¶n ph¸p qui th× trong c©u ph©n tÝch lÖnh xuÊt hiÖn mét kÕt nèi cha hîp lý gi÷a V¨n b¶n cÇn tra cøu vµ Danh môc ®Þa ph¬ng chøa tªn ®Þa ph¬ng ®· ban hµnh v¨n b¶n.
Lý do: viÖc kÕt nèi nhiÒu b¶ng lµ sù kÕt nèi tõng cÆp hai b¶ng mét cho ®Õn khi trë thµnh mét b¶ng duy nhÊt. C¸c v¨n b¶n cña mét ®Þa ph¬ng ®Òu cã mét m· ®Þa ph¬ng duy nhÊt trong khi ®ã ORACLE lu«n t¹o cÆp kÕt nèi gi÷a b¶ng VB vµ b¶ng DMDP (Danh môc ®Þa ph¬ng) ®Ó lÊy ra tªn ®Þa ph¬ng råi míi chän theo m· VB. KÕt qu¶ lµ ph¶i tiÕn hµnh s¾p xÕp vµ duyÖt toµn bé nguån VB cña ®Þa ph¬ng ®· chØ ra.
C¸ch gi¶i quyÕt: LÊy tªn ®Þa ph¬ng øng víi m· ®Þa ph¬ng trong tham sè vµo cña procedure. Nh vËy thêi gian chuyÓn tõ thùc hiÖn phÐp kÕt nèi (1.16 gi©y) xuèng cßn thùc hiÖn phÐp chän (xÊp xØ 0 gi©y).
SELECT V_CCTH.MA_VB, V_CCTH.MA_DP_VB, V_CCTH.MA_CC, V_CCTH.MA_DP_CC,
V_VBCC.SO, V_VBCC.KY_HIEU, V_VBCC.NGAY_PH, V_VBCC.TRICH_YEU
FROM V_CCTH V_CCTH, VB V_VBCC,DMDP DMDP1, DMLVB DMLVB1, DMCD DMCD1
WHERE V_VBCC.MA_VB = V_CCTH.MA_CC
and V_VBCC.MA_DP = V_CCTH.MA_DP_CC
and DMDP1.MA_DP = V_VBCC.MA_DP
and DMLVB1.MA_LOAI_VB = V_VBCC.MA_LOAI_VB
and DMCD1.MA_CHU_DE = V_VBCC.MA_CHU_DE
and (V_CCTH.MA_DP_VB = 'VPCP')
and (V_CCTH.MA_VB = 4404)
ORDER BY 7;
Thêi gian thùc hiÖn
call count cpu elapsed disk query current rows
total 5 1.14 1.16 375 8590 2 2
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
2 SORT (ORDER BY)
2 NESTED LOOPS
2 NESTED LOOPS
5 HASH JOIN
2 VIEW OF 'V_CCTH'
2 SORT (UNIQUE)
2 UNION-ALL
3 INDEX (RANGE SCAN) OF 'CCTW_PK' (UNIQUE)
0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CCDP_BTC'
1 INDEX (RANGE SCAN) OF 'I_S_CCBTC' (NON-UNIQUE)
4105 NESTED LOOPS
4105 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'VB'
4105 INDEX (UNIQUE SCAN) OF 'DMDP_PK' (UNIQUE)
2 INDEX (UNIQUE SCAN) OF 'DMLVB_PK' (UNIQUE)
2 INDEX (UNIQUE SCAN) OF 'DMCD_PK' (UNIQUE)
-
C©u lÖnh ban ®Çu ®îc chuyÓn ®æi thµnh hai c©u lÖnh con nh sau
SELEC T V_VBTH.MA_DP,DMDP.DATA_BASE,DMDP.PATH_TV,DMDP.TEN_DP,DMDP.VERSION,
V_VBTH.MA_LOAI_VB,DMLVB3.TEN_LOAI_VB,V_VBTH.MA_CHU_DE,DMCD3.MA_LOAI_CD,
DMCD3.TEN_CHU_DE,V_VBTH.SO,V_VBTH.KY_HIEU,V_VBTH.NGAY_PH,V_VBTH.NGUOI_KY,
V_VBTH.TRICH_YEU,V_VBTH.TOAN_VAN,V_VBTH.MA_VB
FROM V_VBTH V_VBTH,DMDP DMDP,DMCD DMCD3,DMLVB DMLVB3
WHERE V_VBTH.MA_VB = :b1 AND V_VBTH.MA_DP = :b2 AND DMDP.MA_DP = V_VBTH.MA_DP
AND DMCD3.MA_CHU_DE = V_VBTH.MA_CHU_DE AND DMLVB3.MA_LOAI_VB = V_VBTH.MA_LOAI_VB;
Thêi gian thùc hiÖn
call count cpu elapsed disk query current rows
total 3 0.00 0.00 0 11 2 19
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 NESTED LOOPS
1 NESTED LOOPS
1 HASH JOIN
1 TABLE ACCESS (BY ROWID) OF 'DMDP'
2 INDEX (RANGE SCAN) OF 'DMDP_PK' (UNIQUE)
1 VIEW OF 'V_VBTH'
1 SORT (UNIQUE)
1 UNION-ALL
1 TABLE ACCESS GOAL: ANALYZED (BY ROWID) OF 'VB'
1 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'VB_PK'
(UNIQUE)
11 TABLE ACCESS GOAL: ANALYZED (FULL) OF
'SNAP$_S_VBDP_BTC'
1 TABLE ACCESS (BY ROWID) OF 'DMCD'
1 INDEX (UNIQUE SCAN) OF 'DMCD_PK' (UNIQUE)
1 TABLE ACCESS (BY ROWID) OF 'DMLVB'
1 INDEX (UNIQUE SCAN) OF 'DMLVB_PK' (UNIQUE)
********************************************************************************
SELECT TEN_DP FROM DMDP DMDP WHERE DMDP.MA_DP = :b1;
call count cpu elapsed disk query current rows
total 3 0.00 0.00 0 2 0 2
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 TABLE ACCESS (BY ROWID) OF 'DMDP'
1 INDEX (UNIQUE SCAN) OF 'DMDP_PK' (UNIQUE)
Phô lôc D Tèi u ho¸ b»ng sö dông Index kÕt hîp víi Hint Text Trong phÇn mÒm Tra cøu V¨n b¶n Ph¸p qui
Sau mét thêi gian thö nghiÖm, ph©n tÝch kÕt qu¶ ®¹t ®îc vµ cha ®¹t ®îc cña c¸c lÇn tèi u c©u lÖnh SQL trong phÇn mÒm Tra cøu V¨n b¶n ph¸p qui chóng t«i ®· rót ra ®îc ph¬ng thøc tèi u tèt nhÊt cho phÇn mÒm nµy lµ sö dông Index phøc kÕt hîp víi Hint Text.
V× phÇn mÒm nµy sö dông CSDL ph©n t¸n n»m r¶i kh¾p c¸c tØnh, c¸c ngµnh, c¸c bé vµ cña V¨n phßng ChÝnh phñ cho nªn trong c¸c b¶ng, c¸c Snapshot (chøa d÷ liÖu cña c¸c v¨n b¶n) ®îc Index theo thø tù m· ®Þa ph¬ng, m· v¨n b¶n råi sau ®ã míi ®Õn c¸c cét kh¸c nÕu cã. §iÒu nµy sÏ ®¶m b¶o trong c¸c View tæng hîp d÷ liÖu tõ c¸c b¶ng sÏ ®îc ph©n ®o¹n ngang dùa trªn m· ®Þa ph¬ng, nh vËy mçi khi truy nhËp ®Õn mét v¨n b¶n cña mét ®Þa ph¬ng nµo ®ã th× Oracle sÏ chØ duyÖt trªn ®o¹n chøa v¨n b¶n cã m· ®Þa ph¬ng ®· chØ ra.
Hint Text lµ nh÷ng chØ dÉn thi hµnh ®Ó b¸o cho Oracle biÕt thùc hiÖn c©u lÖnh SQL theo c¸ch mong muèn. Trong phÇn mÒm Tra cøu V¨n b¶n ph¸p qui khi truy xuÊt mét v¨n b¶n nµo ®Òu dùa trªn m· ®Þa ph¬ng vµ sè v¨n b¶n. §Ó lÊy ra tªn ®Þa ph¬ng ®· ph¸t hµnh v¨n b¶n th× ph¶i kÕt nèi b¶ng chøa v¨n b¶n víi b¶ng chøa danh môc c¸c ®Þa ph¬ng. Râ rµng trong trêng hîp nµy thùc hiÖn phÐp chän tríc sau ®ã råi thùc hiÖn phÐp kÕt nèi, tuy nhiªn Oracle lu«n kÕt nèi gi÷a b¶ng chøa c¸c v¨n b¶n vµ b¶ng chøa danh môc c¸c ®Þa ph¬ng qua m· ®Þa ph¬ng tríc phÐp chän dùa trªn m· v¨n b¶n vµ m· ®Þa ®Þa ph¬ng. §iÒu nµy rÊt bÊt hîp lý v× toµn bé c¸c v¨n b¶n cña mét ®Þa ph¬ng ®Òu cã cïng mét m· ®Þa ph¬ng do ®ã ph¶i kÕt nèi toµn bé c¸c v¨n b¶n cña ®Þa ph¬ng ®ã, trong khi ®ã nÕu thùc hiÖn phÐp chän tríc th× chØ lÊy ra duy nhÊt mét v¨n b¶n råi kÕt nèi víi danh môc ®Þa ph¬ng ®Ó lÊy ra tªn ®Þa ph¬ng ®· ph¸t hµnh v¨n b¶n ®ã.
Do ®ã gi¶i ph¸p ®Ó kh¾c phôc lµ thªm chØ thÞ thùc hiÖn kÕt nèi ORDERD ®Ó c¸c b¶ng kÕt nèi theo thø tù xuÊt hiÖn sau mÖnh ®Ò FROM.
Nh vËy sau khi kÕt hîp c¶ hai ph¬ng ph¸p trªn th× sè lÇn duyÖt ®Ó truy xuÊt tíi v¨n b¶n sÏ lµ Ýt nhÊt (qua index trùc tiÕp) vµ sè lîng c¸c hµng tham gia vµo kÕt nèi lµ nhá nhÊt (mét hµng) do ®ã thêi gian t¨ng lªn rÊt nhiÒu lÇn v× thao t¸c kÕt nèi tõ n v¨n b¶n (toµn bé v¨n b¶n cña mét ®Þa ph¬ng) cßn l¹i chØ kÕt nèi mét v¨n b¶n ®· t×m ra.
Díi ®©y lµ mét vÝ dô trong hµng chôc c©u lÖnh nh vËy.
-
C©u lÖnh cha ®îc tèi u
SELECT V_CCTH.MA_CC,V_CCTH.MA_DP_CC,V_VBCC.MA_LOAI_VB,V_VBCC.MA_CHU_DE,
V_VBCC.SO,V_VBCC.KY_HIEU,V_VBCC.NGAY_PH,V_VBCC.NGUOI_KY,V_VBCC.TRICH_YEU,
V_VBCC.TOAN_VAN,V_CCTH.MA_DP_VB,V_CCTH.MA_VB
FROM
V_CCTH V_CCTH,V_VBTH V_VBCC WHERE V_CCTH.MA_CC = :b1 AND V_CCTH.MA_DP_CC =
:b2 AND V_CCTH.MA_DP_VB = :b3 AND V_CCTH.MA_VB = :b4 AND V_VBCC.MA_VB =
V_CCTH.MA_CC AND V_VBCC.MA_DP = V_CCTH.MA_DP_CC
Thêi gian thùc hiÖn
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.02 0 0 0 0
Execute 2 0.06 11.09 0 0 2 6
Fetch 1 1.85 10.51 520 8245 1954 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 1.93 21.62 520 8245 1956 7
C©y ph©n tÝch lÖnh
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 MERGE JOIN
4121 SORT (JOIN)
4121 VIEW OF 'V_VBTH'
4121 SORT (UNIQUE)
4121 UNION-ALL
4106 TABLE ACCESS (BY ROWID) OF 'VB'
4107 INDEX (RANGE SCAN) OF 'IH_VB_DPVB' (NON-UNIQUE)
15 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_VBDP_BTC'
16 INDEX (RANGE SCAN) OF 'IH_S_BTC_DPVB' (NON-UNIQUE)
1 SORT (JOIN)
1 VIEW OF 'V_CCTH'
1 SORT (UNIQUE)
1 UNION-ALL
1 INDEX (UNIQUE SCAN) OF 'CCTW_PK' (UNIQUE)
0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CCDP_BTC'
1 INDEX (RANGE SCAN) OF 'I_S_CCBTC' (NON-UNIQUE)
SELECT /*+ ORDERED */ V_CCTH.MA_CC,V_CCTH.MA_DP_CC,V_VBCC.MA_LOAI_VB,
V_VBCC.MA_CHU_DE,V_VBCC.SO,V_VBCC.KY_HIEU,V_VBCC.NGAY_PH,V_VBCC.NGUOI_KY,
V_VBCC.TRICH_YEU,V_VBCC.TOAN_VAN,V_CCTH.MA_DP_VB,V_CCTH.MA_VB
FROM
V_CCTH V_CCTH,V_VBTH V_VBCC WHERE V_CCTH.MA_CC = :b1 AND V_CCTH.MA_DP_CC =
:b2 AND V_CCTH.MA_DP_VB = :b3 AND V_CCTH.MA_VB = :b4 AND V_VBCC.MA_VB =
V_CCTH.MA_CC AND V_VBCC.MA_DP = V_CCTH.MA_DP_CC
Thêi gian thùc hiÖn
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.11 0.17 1 0 1 0
Execute 1 0.03 0.21 0 0 0 3
Fetch 1 0.00 0.02 1 6 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.14 0.40 2 6 1 4
C©y ph©n tÝch lÖnh
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 HASH JOIN
1 VIEW OF 'V_CCTH'
1 SORT (UNIQUE)
1 UNION-ALL
1 INDEX (UNIQUE SCAN) OF 'CCTW_PK' (UNIQUE)
0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CCDP_BTC'
1 INDEX (RANGE SCAN) OF 'I_S_CCBTC' (NON-UNIQUE)
1 VIEW OF 'V_VBTH'
1 SORT (UNIQUE)
1 UNION-ALL
1 TABLE ACCESS (BY ROWID) OF 'VB'
1 INDEX (UNIQUE SCAN) OF 'VB_PK' (UNIQUE)
0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_VBDP_BTC'
1 INDEX (RANGE SCAN) OF 'I_S_VBDP_BTC' (NON-UNIQUE)
Chia sẻ với bạn bè của bạn: |