B. Ph©n tÝch c¸ch thi hµnh c©u lÖnh SQL
Khi Server nhËn ®îc c©u lÖnh SQL tõ Client göi tíi th× Server sÏ tiÕn hµnh ph©n tÝch c©u lÖnh theo d¹ng c©y do ®ã sè tæ hîp cã thÓ kh¸ lín. T¹i Oracle Server cã mét vïng nhí ®Ó lu tr÷ c¸c c©u lÖnh SQL ®· ph©n tÝch ®Ó khi gÆp l¹i c©u lÖnh th× kh«ng ph¶i thùc hiÖn qu¸ tr×nh ph©n tÝch n÷a. Do lµm viÖc trong m«i trêng ®a ngêi dïng nªn kh¶ n¨ng gÆp l¹i c¸c c©u lÖnh SQL lµ rÊt lín vµ cã thÓ nhËn thÊy r»ng bé ®Öm lu tr÷ cµng lín th× x¸c suÊt t×m thÊy c©u lÖnh trong bé ®Öm lµ cµng cao. Tuy nhiªn kÝch thíc cña bé ®Öm còng kh«ng thÓ lín qu¸ phÇn bé nhí RAM vËt lý cßn r¶nh v× nÕu vît qu¸ sÏ g©y ra viÖc tr¸o ®æi bé nhí ra ®Üa, ®©y lµ hiÖu øng kh«ng mong muèn v× nã sÏ lµm chËm tèc ®é thùc hiÖn ch¬ng tr×nh.
Ph©n tÝch c¸ch thùc hiÖn mét c©u lÖnh SQL cô thÓ vµ x©y dùng c©y ph©n tÝch.
Gi¶ sö cã c¸c b¶ng Nh©nViªn chøa c¸c th«ng tin vÒ Nh©nViªn nh L¬ng, NghÒ, Tªn, M·Phßng ...v.v vµ b¶ng Phßng chøa M·Phßng vµ TªnPhßng ®Ó liªn kÕt víi b¶ng Nh©nViªn.
Gi¶ sö cã c©u lÖnh SQL sau:
SELECT TªnNh©nViªn, NghÒ, L¬ng, TªnPhßng
FROM Nh©nViªn, Phßng
WHERE Nh©nViªn.m·Phßng = Phßng.M·Phßng AND NOT EXITSTS ( SELECT * FROM BËcL¬ng WHERE Nh©nViªn.L¬ng BETWEEN BËc1 AND BËc2);
Do M·Phßng lµ kho¸ chÝnh nªn c¸c hµng trong b¶ng Phßng sÏ ®îc truy nhËp b»ng ROWID cßn b¶ng nh©n viªn do kh«ng cã Index trªn TªnNh©nViªn nªn b¶ng nµy sÏ ®îc truy nhËp b»ng ph¬ng ph¸p duyÖt toµn bé.
Trong s¬ ®å nµy th× mçi khèi øng víi mét bíc thùc hiÖn vµ con sè trong khèi chØ thø tù ®îc thùc hiÖn cña khçi. Mçi khèi sÏ lÊy d÷ liÖu tõ khèi kh¸c (mµu tr¾ng) hoÆc trùc tiÕp tõ d÷ liÖu trªn ®Üa (mµu ®en). Sau khi d÷ liÖu ®îc xö lý ë mçi khèi th× sÏ tr¶ l¹i mét tËp hîp c¸c hµng (®îc gäi lµ nguån d÷ liÖu Row Source) cho khèi ë møc trªn vµ nÕu lµ khèi trªn cïng th× sÏ tr¶ l¹i cho ngêi dïng hoÆc ch¬ng tr×nh thùc hiÖn c©u lÖnh.
Theo s¬ ®å trªn, Oracle sÏ thùc hiÖn bíc 3 vµ tr¶ l¹i tõng dßng mét cho bíc 2. T¬ng øng víi mçi dßng ë bíc 3 Oracle thùc hiÖn c¸c c«ng viÖc sau:
- Oracle thùc hiÖn bíc 5 vµ tr¶ l¹i ROWID cho bíc 4.
- Oracle thùc hiÖn bíc 4 tr¶ l¹i gi¸ trÞ hµng cho bíc 2.
- Oracle thùc hiÖn bíc 2 b»ng c¸ch lÊy mçi hµng ë bíc 3 vµ mét hµng ë bíc 4 ghÐp thµnh mét vµ tr¶ l¹i kÕt qu¶ cho bíc 1.
- Oracle sÏ thùc hiÖn bíc 6 vµ sÏ tr¶ l¹i c¸c hµng cho bíc 1 nÕu cã.
- §Ó thùc hiÖn bíc 1, Oracle sÏ kiÓm tra ë bíc 6 cã tr¶ l¹i hµng nµo kh«ng, nÕu cã th× Oracle sÏ tr¶ l¹i hµng tõ bíc 2 cho ngêi dïng.
Chó ý r»ng øng víi mçi hµng tr¶ l¹i ë bíc 3 th× Oracle sÏ ph¶i mét lÇn thùc hiÖn bíc 5, 4, 2, 6, 1. Víi c¸c bíc mµ chØ ®ßi hái mét dßng tõ c¸c nh¸nh con trong c©y ph©n tÝch th× rÊt tèt bëi v× Oracle cã thÓ tiÕn hµnh thùc hiÖn bíc ®ã ngay vµ nh vËy c©y lÖnh sÏ ®îc thu gän l¹i tõng thêi ®iÓm. Nãi chung th× c¸c bíc chØ yªu cÇu truy nhËp mét hµng tõ b¶ng lµ truy nhËp duy nhÊt trùc tiÕp tõ b¶ng, tõ Index, tõ kÕt nèi Nested-Loop vµ tõ bé läc cßn c¸c bíc yªu cÇu tÊt c¶ c¸c hµng hµng ®ång thêi lµ s¾p xÕp, kÕt nèi b»ng s¾p xÕp trén, c¸c hµm lµm viÖc víi nhãm hµng vµ phÐp hîp c¸c tËp hîp.
Dùa trªn c©y ph©n tÝch lÖnh cã thÓ ®¸nh gi¸ hoÆc s¾p xÕp l¹i c©u lÖnh ®Ó chän ra c¸ch thøc thùc hiÖn tèi u. Ngoµi ra còng cã thÓ chuyÓn c©y ph©n tÝch nµy c¸c chó gi¶i nh sau:
STT (ID) Thao t¸c (Operation) Tuú chän (Option) §èi tîng t¸c ®éng (Object-name)
0 LÖnh SELECT
1 Bé läc
2 Nested-Loop
3 Truy nhËp b¶ng DuyÖt toµn bé Nh©nViªn
4 Truy nhËp b¶ng B»ng ROWID Phßng
5 Truy nhËp b¶ng B»ng kho¸ duy nhÊt PK_MAPHONG
6 Truy nhËp b¶ng B»ng duyÖt toµn bé BËcL¬ng
C¸c chó gi¶i nµy cã thÓ ®îc liÖt kª ra bëi Oracle b»ng c¸ch sö dông lÖnh EXPLAIN PLAN ®Ó mçi khi thùc hiÖn c©u lÖnh th× Oracle sÏ ®a ra c¸c chó gi¶i vÒ c©y ph©n tÝch ®îc thùc hiÖn.
C. C¸c bíc tèi u ho¸
Cã thÓ tèi u ho¸ ë møc øng dông b»ng c¸ch x©y dùng c¸c b¶ng, lùa chän gi¶i ph¸p Index, c¸c View thÝch hîp. Sau ®ã sÏ tèi u ë møc c©u lÖnh b»ng c¸ch thay ®æi l¹i c©u lÖnh ®Ó nã ®îc thùc hiÖn cã hiÖu qu¶ h¬n. MÆc dï Oracle cã thÓ hç trî cho viÖc tèi u c©u lÖnh nhng tuy nhiªn Oracle kh«ng thÓ biÕt vÒ ®Æc ®iÓm d÷ liÖu còng nh vÒ ng÷ nghÜa c©u lÖnh b»ng nh÷ng ngêi ph¸t triÓn phÇn mÒm. Do vËy ph¸t triÓn phÇn mÒm sÏ ph¶i tù tiÕn hµnh tèi u c©u lÖnh ®Ó cho nã ®îc hoµn thiÖn h¬n.
Víi bÊt k× mét c©u lÖnh SQL nµo ®îc thùc hiÖn bëi Oracle th× bé tèi u ho¸ sÏ lµm c¸c c«ng viÖc sau:
-
§Þnh trÞ c¸c biÓu thøc vµ ®iÒu kiÖn: Oracle sÏ tiÕn hµnh tÝnh to¸n c¸c biÓu thøc vµ ®iÒu kiÖn thµnh c¸c gi¸ trÞ h»ng mét c¸ch tèi ®a.
-
ChuyÓn ®æi c©u lÖnh: Víi nh÷ng c©u lÖnh phøc t¹p th× Oracle sÏ tiÕn hµnh chuyÓn thµnh sù kÕt hîp cña c¸c c©u lÖnh ®¬n gi¶n h¬n, vÝ dô nh c©u hái cã sö dông Query bé phËn (subquery) th× sÏ ®îc chuyÓn thµnh kÕt nèi cña hai c©u hái t¬ng ®¬ng nÕu cã thÓ.
-
KÕt hîp View vµo trong c©u lÖnh: View thùc chÊt lµ mét c©u lÖnh SELECT, do vËy nÕu thùc hiÖn mét c©u lÖnh SELECT trªn View th× d÷ liÖu sÏ bÞ duyÖt hai lÇn. NÕu kÕt hîp View vµ c©u lÖnh SELECT th× sÏ chØ ph¶i duyÖt mét lÇn.
-
Chän c¸ch tèi u ho¸: Chän c¸ch tèi u dùa trªn luËt Rule-based hoÆc Cost-based.
-
Chän ph¬ng thøc truy nhËp: Chän c¸ch truy nhËp nhanh nhÊt tíi hµng cña b¶ng nÕu cã nhiÒu c¸ch truy nhËp.
-
Chän thø tù cña kÕt nèi: NÕu c©u lÖnh sö dông kÕt nèi nhiÒu h¬n hai b¶ng th× Oracle sÏ tiÕn hµnh t×m ra cÆp kÕt nèi thø nhÊt, råi cÆp tiÕp theo ...v.v.
-
Chän thao t¸c kÕt nèi: Víi bÊt k× c©u lÖnh nµo th× còng cÇn ph¶i cã mét thao t¸c ®Ó thùc hiÖn phÐp kÕt nèi.
1. §Þnh gi¸ biÓu thøc hoÆc ®iÒu kiÖn 1.1. ChuyÓn thµnh c¸c h»ng sè (Consts)
B»ng c¸ch ®Þnh gi¸ c¸c biÓu thøc thµnh h»ng sè mét c¸ch tèi ®a th× c©u lÖnh SQL sÏ ®îc thùc hiÖn nhanh h¬n. §iÒu nµy lµ hiÓn nhiªn bëi v× nÕu ®Þnh gi¸ mét biÓu thøc th× chØ lµm cã mét lÇn trong khi nÕu c©u lÖnh cò th× biÓu thøc ®ã sÏ ®îc thùc hiÖn trong suèt qu¸ tr×nh duyÖt. VÝ dô sau sÏ lµm râ ®iÒu nµy. Gi¶ sö cÇn ®a ra TªnNh©nViªn cña nh÷ng ngêi cã L¬ng>2000$ trong b¶ng Nh©nViªn, cã thÓ thùc hiÖn mét trong ba c©u lÖnh sau:
SELECT TªnNh©nViªn, L¬ng FROM Nh©nViªn WHERE L¬ng>20,000/10;
SELECT TªnNh©nViªn, L¬ng FROM Nh©nViªn WHERE L¬ng>2,000;
SELECT TªnNh©nViªn, L¬ng FROM Nh©nViªn WHERE L¬ng*10>20,000;
Râ rµng c¶ ba c©u lÖnh ®Òu tr¶ l¹i cïng mét kÕt qu¶ tuy nhiªn c©u lÖnh thø nhÊt vµ thø ba ph¶i thªm mét phÐp tÝnh ®Ó øng víi mçi phÐp so s¸nh so víi c©u lÖnh thø hai. Oracle sÏ tù ®éng chuyÓn c©u lÖnh thø nhÊt trë thµnh c©u lÖnh thø hai cßn c©u lÖnh thø ba th× kh«ng ®¬n gi¶n ®èi víi Oracle ®Ó thµnh c©u lÖnh thø hai. ChÝnh v× lý do nµy mµ nh÷ng ngêi ph¸t triÓn phÇn mÒm nªn tù chuyÓn ®iÒu kiÖn so s¸nh thµnh d¹ng mét cét víi mét h»ng sè trong bÊt k× trêng hîp nµo cã thÓ h¬n lµ mét ®iÒu kiÖn trong ®ã cã chøa mét biÓu thøc víi mét cét.
1.2. To¸n tö LIKE
Oracle sÏ chuyÓn c¸c ®iÒu kiÖn ®¬n gi¶n sö dông to¸n tö so s¸nh LIKE kh«ng sö dông kÝ tù ®¹i diÖn thµnh mét biÓu thøc so s¸nh b»ng. VÝ dô, Oracle sÏ chuyÓn biÓu thøc thø nhÊt thµnh biÓu thøc thø hai:
ChuyÓn biÓu thøc: TªnNh©nViªn LIKE 'SMITH'
thµnh biÓu thøc t¬ng ®¬ng: TªnNh©nViªn = 'SMITH'
C¸c biÓu thøc kiÓu nµy chØ ®îc chuyÓn khi mµ biÓu thøc so s¸nh víi c¸c biÕn cã kÝch thíc (size) kh«ng cè ®Þnh. NÕu nh TªnNh©nViªn cã kiÓu CHAR(10) th× biÓu thøc trªn kh«ng ®îc chuyÓn v× TªnNh©nViªn cã kÝch thíc cè ®Þnh.
1.3. To¸n tö IN
Oracle sÏ chuyÓn c¸c biÓu thøc cã chøa to¸n tö so s¸nh IN thµnh c¸c ®iÒu kiÖn so s¸nh b»ng liªn kÕt víi nhau bëi to¸n tö logic OR.
VÝ dô:
ChuyÓn biÓu thøc: TªnNh©nViªn IN ('SMITH','KING','JONES')
thµnh: TªnNh©nViªn='SMITH' OR TªnNh©nViªn='KING' OR TªnNh©nViªn='JONES'
1.4. To¸n tö ANY hoÆc SOME
C¸c biÓu thøc ®iÒu kiÖn sÏ ®îc chuyÓn thµnh c¸c ®iÒu kiÖn so s¸nh liªn kÕt víi nhau bëi to¸n tö OR. C¸c ®iÒu kiÖn sö dông ANY hoÆc SOME kÌm theo mét subquery sÏ chuyÓn thµnh to¸n tö EXITST vµ mét query liªn quan.
VÝ dô:
ChuyÓn biÓu thøc: L¬ng> ANY (:L¬ng1, :L¬ng2)
thµnh biÓu thøc: L¬ng>:L¬ng1 OR L¬ng>:L¬ng2
vµ chuyÓn: x> ANY (SELECT L¬ng FROM Nh©nViªn WHERE NghÒ='Ph©n tÝch viªn')
thµnh biÓu thøc t¬ng ®¬ng lµ:
EXITST (SELECT L¬ng FROM Nh©nViªn WHERE NghÒ='Ph©n tÝch viªn' and x>L¬ng)
1.5. To¸n tö ALL
Oracle sÏ chuyÓn c¸c ®iÒu kiÖn sö dông to¸n tö ALL thµnh c¸c ®iÒu kiÖn so s¸nh b»ng liªn kÕt víi nhau qua to¸n tö AND. NÕu ®iÒu kiÖn kÌm theo subquery th× sÏ chuyÓn thµnh subquery vµo trong mét ®iÒu kiÖn mµ sö dông to¸n tö ANY vµ mét query c¬ b¶n.
VÝ dô: L¬ng>ALL(:L¬ng1, :L¬ng2)
thµnh L¬ng> :L¬ng1 AND L¬ng > :L¬ng2
Tõ x>ALL ( SELECT L¬ng FROM Nh©nViªn WHERE M·Phßng=10;
thµnh NOT (x<= ANY ( SELECT L¬ng FROM Nh©nViªn WHERE M·Phßng=10))
vµ sau ®ã sÏ sö dông luËt ¸p dông víi to¸n tö ANY thµnh c©u lÖnh sau:
NOT EXISTS ( SELECT L¬ng FROM Nh©nViªn WHERE M·Phßng=10 AND x<= L¬ng)
1.6. To¸n tö BETWEEN
Oracle sÏ lu«n chuyÓn ®iÒu kiÖn sö dông to¸n tö BETWEEN thµnh ®iÒu kiÖn sö dông to¸n tö >= vµ <= liªn kÕt bëi to¸n tö AND.
VÝ dô:
ChuyÓn biÓu thøc: L¬ng BETWEEN 2,000 AND 3,000
thµnh biÓu thøc: L¬ng>=2,000 AND L¬ng<=3,000
1.7. To¸n tö NOT
Oracle sÏ lu«n chuyÓn ®iÒu kiÖn cã to¸n tö NOT thµnh mét ®iÒu kiÖn ®èi víi nã.
VÝ dô: ChuyÓn biÓu thøc:
NOT M·Phßng = ( SELECT M·Phßng FROM Nh©nViªn WHERE TªnNh©nViªn='TAYLOR')
thµnh biÓu thøc t¬ng ®¬ng:
M·Phßng <> ( SELECT M·Phßng FROM Nh©nViªn WHERE TªnNh©nViªn='TAYLOR')
Th«ng thêng mét ®iÒu kiÖn cã chøa to¸n tö NOT thêng cã nhiÒu c¸ch viÕt. Oracle chÊp nhËn viÖc chuyÓn ®æi nh÷ng ®iÒu kiÖn nh vËy thµnh nh÷ng ®iÒu kiÖn phñ ®Þnh thµnh phÇn, thËm chÝ ngay c¶ viÖc kÕt qu¶ cã chøa nhiÒu NOT h¬n.
VÝ dô c¸c biÓu thøc sau chøa to¸n tö NOT cã nghÜa t¬ng ®¬ng:
NOT ( L¬ng<1,000 OR Thëng IS NULL)
NOT L¬ng<1,000 AND Thëng IS NOT NULL
L¬ng>=1,000 AND Thëng IS NOT NULL
1.8. ChuyÓn tiÕp
NÕu hai ®iÒu kiÖn trong cïng mét mÖnh ®Ò WHERE cã sö dông mét cét chung th× Oracle ®«i khi cã thÓ chuyÓn thµnh gi¸ trÞ c¬ b¶n. §iÒu nµy cã kh¶ n¨ng lµm cho truy nhËp b»ng Index cã thÓ sö dông trong c©u lÖnh míi nhng l¹i kh«ng sö dông ®îc trong c©u lÖnh cò.
C¸c ®iÒu kiÖn ®ã cã d¹ng: WHERE Cét1 AND Cét1=Cét2
®îc chuyÓn thµnh: WHERE Cét1 AND Cét2
Trong ®ã cã thÓ lµ: =,!=, ^=, <, <>, >,<=, >=.
H»ng sè lµ bÊt k× gi¸ trÞ h»ng nµo víi to¸n tö, hµm SQL, kÝ tù, biÕn kÕt hîp hoÆc biÕn.
VÝ dô c©u lÖnh:
SELECT * FROM Nh©nViªn, Phßng
WHERE Nh©nViªn.M·Phßng=20 AND Nh©nViªn.M·Phßng=Phßng.M·Phßng
®îc chuyÓn thµnh c©u lÖnh cã nghÜa t¬ng ®¬ng:
SELECT * FROM Nh©nViªn, Phßng
WHERE Nh©nViªn.M·Phßng=20 AND Phßng.M·Phßng=20;
Chó ý r»ng d¹ng ®iÒu kiÖn sau sÏ kh«ng ®îc chuyÓn:
WHERE Cét1 Cét3 AND Cét1=Cét2 thµnh ®iÒu kiÖn Cét2 Cét3.
C¸ch thøc nµy còng chØ ®îc dïng trong tèi u dùa vµo luËt Cost-based.
2. ChuyÓn d¹ng c©u lÖnh
Do SQL lµ mét ng«n ng÷ thao t¸c d÷ liÖu mÒm dÎo nªn thêng cã nhiÒu c©u lÖnh mµ cã thÓ cã c«ng thøc tèi u ho¸ thµnh c«ng. §«i khi th× Oracle sÏ chuyÓn mét c©u lÖnh thµnh c©u lÖnh t¬ng ®¬ng cã hiÖu qu¶ h¬n. Trong phÇn nµy sÏ th¶o luËn vÒ nh÷ng d¹ng c©u lÖnh cã thÓ t¹o ra:
+ ChuyÓn nh÷ng c©u lÖnh chøa OR thµnh nh÷ng c©u lÖnh ghÐp nèi víi nhau b»ng UNION ALL
+ ChuyÓn c¸c c©u lÖnh phøc hîp thµnh c©u lÖnh kÕt nèi.
2.1. ChuyÓn nh÷ng c©u lÖnh chøa OR thµnh nh÷ng c©u lÖnh ghÐp nèi
NÕu mét c©u lÖnh chøa mét mÖnh ®Ò WHERE víi nhiÒu ®iÒu kiÖn liªn kÕt víi nhau b»ng to¸n tö OR th× Oracle sÏ chuyÓn thµnh c¸c c©u lÖnh ghÐp nèi víi nhau b»ng to¸n tö tËp hîp UNION ALL theo c¸ch sau:
+ NÕu mçi ®iÒu kiÖn t¹o ra mét c¸ch truy nhËp b»ng Index th× c©u lÖnh cã thÓ ®îc chuyÓn d¹ng. Oracle sÏ chän mét c©y ph©n tÝch sao cho truy nhËp b¶ng nhiÒu lÇn b»ng c¸ch Index kh¸c nhau sau ®ã nèi c¸c kÕt qu¶ l¹i víi nhau.
+ NÕu bÊt k× mét ®iÒu kiÖn nµo ®ßi hái ph¶i duyÖt toµn bé do kh«ng cßn c¸ch truy nhËp nµo kh¸c th× Oracle sÏ kh«ng chuyÓn d¹ng c©u lÖnh nµy (bëi v× lóc ®ã sÏ cÇn h¬n 1 lÇn duyÖt toµn bé b¶ng). Oracle sÏ tiÕn hµnh duyÖt toµn bé b¶ng vµ kiÓm tra mçi hµng cã tho¶ m·n mét trong c¸c ®iÒu kiÖn cña c©u lÖnh hay kh«ng.
Gi¶ sö r»ng ®· cã Index trªn cét NghÒ vµ cét M·Phßng. C©u lÖnh sau:
SELECT * FROM Nh©nViªn WHERE NghÒ='Th kÝ' OR M·Phßng=10;
®îc chuyÓn thµnh c©u lÖnh cã nghÜa t¬ng ®¬ng
SELECT * FROM Nh©nViªn WHERE NghÒ='Th kÝ'
UNION ALL
SELECT * FROM Nh©nViªn WHERE M·Phßng=10;
NÕu sö dông luËt tèi u Rule-based th× c©u lÖnh nµy ®îc chuyÓn bëi v× mçi c©u lÖnh thµnh phÇn cã thÓ sö dông mét Index. LuËt Rule-based cho r»ng thùc hiÖn hai c©u lÖnh thµnh phÇn truy nhËp b»ng Index sÏ nhanh h¬n lµ mét c©u lÖnh duyÖt toµn bé. Cßn nÕu sö dông luËt Cost-based th× Oracle sÏ ®¸nh íc lîng “gi¸” ph¶i tr¶ øng víi mçi c©u lÖnh vµ sÏ quyÕt ®Þnh chän c©u lÖnh nµo sÏ ®îc thùc hiÖn .
2.2. ChuyÓn c¸c c©u lÖnh phøc hîp thµnh c©u lÖnh kÕt nèi
§Ó chuyÓn mét c©u lÖnh phøc hîp thµnh mét c©u lÖnh kÕt nèi bÊt cø khi nµo nÕu nã ®¶m b¶o ®îc r»ng kÕt qu¶ cña hai c©u lÖnh nh nhau. Lóc ®ã c©u lÖnh kÕt nèi sÏ ®îc tèi u vµ “gi¸” ph¶i tr¶ cho mét c©u lÖnh kÕt nèi sÏ rÎ h¬n so víi c©u lÖnh phøc hîp.
Gi¶ sö chän ra c¸c cét trong b¶ng TµiKho¶n mµ cã M·Kh¸chHµng n»m trong b¶ng Kh¸chHµng b»ng c©u lÖnh:
SELECT * FROM TµiKho¶n WHERE M·Kh¸chHµng IN (SELECT M·Kh¸chHµng FROM Kh¸chHµng);
NÕu M·Kh¸chHµng lµ kho¸ chÝnh hoÆc kho¸ duy nhÊt th× c©u lÖnh trªn cã thÓ ®îc chuyÓn thµnh c©u lÖnh sau ®©y v× nã ®¶m b¶o kÕt qu¶ cña c©u lÖnh míi gièng kÕt qu¶ trong c©u lÖnh ban ®Çu:
SELECT TµiKho¶n.* FROM TµiKho¶n, Kh¸chhµng WHERE TµiKho¶n.M·Kh¸chHµng=Kh¸chHµng.M·Kh¸chHµng.
Tuy nhiªn c©u lÖnh nµy l¹i kh«ng thÓ chuyÓn ®îc thµnh c©u lÖnh kÕt nèi kiÓu nh vËy:
SELECT * FROM Nh©nViªn WHERE L¬ng> ( SELECT AVG(L¬ng) FROM Nh©nViªn).
v× c©u lÖnh ®îc chuyÓn d¹ng:
SELECT * FROM Nh©nViªn WHERE L¬ng>AVG(L¬ng);
cho kÕt qu¶ kh¸c h¼n c©u lÖnh ban ®Çu.
Chó ý r»ng c¸c c©u lÖnh phøc hîp cã c©u lÖnh thµnh phÇn sö dông hµm t¸c ®éng trªn nhiÒu hµng th× kh«ng thÓ chuyÓn ®îc. C¸c hµm ®ã lµ AVG, COUNT, SUM, MAX, MIN.
3. Tèi u ho¸ c©u lÖnh truy nhËp trªn VIEW
Cã thÓ cã c¸c c¸ch c¸ch sau ®Ó tèi u ho¸ lo¹i c©u lÖnh nµy.
-
KÕt hîp View vµo trong c©u lÖnh sau ®ã tèi u c©u lÖnh míi nµy.
-
KÕt hîp c©u lÖnh vµo trong View sau ®ã tèi u c©u lÖnh míi nµy.
-
Thay v× ph¶i lÊy ra tÊt c¶ c¸c hµng, c¸c cét tõ View, Oracle sÏ chØ lÊy ra tËp hîp c¸c hµng, c¸c cét víi c©u lÖnh yªu cÇu.
3.1. KÕt hîp View vµo c©u lÖnh
NÕu kÕt hîp View vµo c©u lÖnh, Oracle sÏ thay tªn cña View trong c©u lÖnh b»ng tªn cña b¶ng vµ thªm ®iÒu kiÖn cña View vµo ®iÒu kiÖn cña c©u lÖnh.
VÝ dô: T¹o mét View chøa tÊt c¶ c¸c nh©n viªn cã m· Phßng lµ 10 tõ b¶ng Nh©nViªn
CREATE VIEW Phßng10 AS SELECT M·Nh©nViªn, TªnNh©nViªn, NghÒ, L¬ng, Thëng, M·Phßng FROM Nh©nViªn WHERE M·Phßng=10;
§Ó chän ra tÊt c¶ c¸c M·Nh©nViªn>7800 tõ VIEW Phßng10 b»ng c©u lÖnh:
SELECT M·Nh©nViªn FROM Phßng10 WHERE M·Nh©nViªn>7800;
th× c©u lÖnh míi sÏ lµ:
SELECT M·Nh©nViªn FROM Nh©nViªn WHERE M·Phßng=10 AND M·Nh©nViªn>7800;
NÕu cã Index trªn cét M·Phßng vµ M·Nh©nViªn th× c©u lÖnh míi sÏ lµm cho ph¬ng thøc truy nhËp b»ng Index s½n dïng.
3.2. KÕt hîp c©u lÖnh vµo trong View sau ®ã tèi u c©u lÖnh míi nµy
Khi View cã chøa c¸c to¸n tö tËp hîp (UNION, UNION ALL, INTERSECT, MINUS), mÖnh ®Ò GROUP BY, mÖnh ®Ò CONNECT BY, to¸n tö DISTINCT, c¸c hµm thao t¸c trªn nhiÒu hµng (AVG, COUNT, MAX, MIN, SUM) th× kh«ng thÓ kÕt hîp View vµo trong c©u lÖnh mµ cã thÓ c©u lÖnh sÏ ®îc kÕt hîp vµo trong View.
VÝ dô:
CREATE VIEW NVPhßng AS SELECT M·Nh©nViªn, Avg(L¬ng) L¬ngTB, MIN(L¬ng) MinL¬ng, MAX(L¬ng) MaxL¬ng FROM Nh©nViªn GROUP BY M·Phßng;
vµ c©u lÖnh sau sÏ chän c¸c gi¸ trÞ trung b×nh, MIN, MAX cña l¬ng cña phßng 10 tõ View NVPhßng;
SELECT * FROM NVPhßng WHERE M·Phßng=10;
C©u lÖnh sÏ ®îc kÕt hîp vµo VIEW nh sau:
SELECT M·Nh©nViªn, AVG(L¬ng) L¬ngTB, MIN(L¬ng) MinL¬ng, MAX(L¬ng) MaxL¬ng FROM Nh©nViªn WHERE M·Phßng=10 GROUP BY M·Phßng;
VÝ dô c©u lÖnh:
SELECT AVG(L¬ngTB), AVG(MinL¬ng), AVG(MaxL¬ng)
FROM NVPhßng;
sÏ cã c©u lÖnh kÕt qu¶ lµ:
SELECT AVG(AVG(L¬ng)), AVG(AVG(L¬ng)), AVG(MAX(L¬ng))
FROM Nh©nViªn
GROUP BY M·Phßng;
3.3. Tèi u c¸c c©u lÖnh kh¸c truy nhËp trªn View
Kh«ng ph¶i lµ tÊt c¶ c¸c c©u lÖnh ®Òu cã thÓ kÕt hîp gi÷a View vµ c©u lÖnh. §Ó thùc hiÖn nh÷ng c©u lÖnh kiÓu nµy, Oracle thùc hiÖn View ®Ó läc ra mét tËp c¸c hµng, sau ®ã thùc c©u lÖnh trªn View nh ®èi víi mét hµng.
VÝ dô t¹o VIEW b»ng c©u lÖnh:
CREATE VIEW NVPhßng AS SELECT M·Nh©nViªn, Avg(L¬ng) L¬ngTB, MIN(L¬ng) MinL¬ng, MAX(L¬ng) MaxL¬ng FROM Nh©nViªn GROUP BY M·Phßng;
vµ c©u lÖnh truy xuÊt trªn View kh«ng thÓ chuyÓn ®îc lµ:
SELECT NVPhßng.M·Phßng, L¬ngTB, MinL¬ng, MaxL¬ng, TªnPhßng FROM NVPhßng, Nh©nViªn WHERE NVPhßng.M·Phßng=Phßng.TªnPhßng;
4. Chän luËt ®Ó tèi u ho¸ -
C¸ch thøc vµ môc tiªu tèi u ho¸ cña Oracle chÞu ¶nh hëng cña nh÷ng tham sè sau:
-
Tham sè khi cµi ®Æt: OPTIMIZER_MODE.
-
Tr¹ng th¸i cña tõ ®iÓn d÷ liÖu.
-
Tham sè OPTIMIZER_GOAL cña lÖnh ALTER SESSION, tham sè nµy sÏ x¸c lËp ®Ì lªn sù x¸c lËp cña tham sè khi cµi ®Æt OPTIMIZER_MODE.
-
C¸c c©u lÖnh kh¸c.
-
Tham sè OPTIMIZER_MODE vµ OPTIMIZER_GOAL cã thÓ cã c¸c gi¸ trÞ sau ®©y:
§©y lµ tham sè ngÇm ®Þnh cho c¸ch thøc tèi u ho¸ cña mét thÓ hiÖn. Tham sè nµy cã thÓ cã c¸c gi¸ trÞ sau:
-
CHOOSE: ®©y lµ gi¸ trÞ ngÇm ®Þnh cho tham sè nµy ®Ó x¸c ®Þnh viÖc chän c¸ch thøc tèi u rule-based hay cost-based. NÕu nh trong tõ ®iÓn d÷ liÖu cã chøa th«ng tin tr¹ng th¸i Ýt nhÊt lµ mét b¶ng th× ph¬ng thøc cost-based sÏ ®îc lùa chän vµ cã thÓ nhËn ®îc c¸ch thøc thi hµnh c©u lÖnh tèt nhÊt. NÕu nh trong tõ ®iÓn d÷ liÖu kh«ng cã mét th«ng tin g× vÒ tr¹ng th¸i c¸c b¶ng th× c¸ch thøc tèi u rule-based sÏ ®îc chän.
-
RULE: gi¸ trÞ sÏ lµm cho Oracle tiÕn hµnh tèi u tÊt c¶ c¸c c©u lÖnh SQL dùa vµo ph¬ng thøc rule-based bÊt chÊp cã th«ng tin tr¹ng th¸i vÒ c¸c b¶ng trong tõ ®iÓn d÷ liÖu.
-
ALL_ROWS: ph¬ng thøc tèi u cost-based sÏ ®îc thùc hiÖn cho tÊt c¶ c¸c c©u lÖnh SQL bÊt kÓ th«ng tin tr¹ng th¸i trong tõ ®iÓn d÷ liÖu sao cho nguån tµi nguyªn sö dông lµ tèi thiÓu ®Ó hoµn thµnh c©u lÖnh.
-
FIRST_ROW: Ph¬ng thøc tèi u cost-based ®îc sö dông cho tÊt c¶ c¸c c©u lÖnh SQL sao cho thêi gian ®¸p øng lµ nhá nhÊt (nguån tµi nguyªn sö dông ®Ó tr¶ l¹i hµng ®Çu tiªn trong kÕt qu¶ lµ tèi thiÓu). Chó ý r»ng PL/SQL sÏ bá qua tham sè OPTIMIZED_MODE vµ FIRST_ROW khi cµi ®Æt.
-
NÕu nh sö dông ph¬ng thøc tèi u íc lîng gi¸ mµ kh«ng cã th«ng tin tr¹ng th¸i vÒ mét vµi b¶ng th× Oracle sÏ sö dông th«ng tin néi bé nh lµ sè khèi d÷ liÖu truy nhËp c¸c b¶ng.
5. Chän ph¬ng thøc truy nhËp tíi hµng
Mét trong c¸c ®iÒu quan träng nhÊt trong viÖc tèi u mét c©y ph©n tÝch lÖnh lµ lµm nh thÕ nµo ®Ó cã thÓ nhËn ®îc d÷ liÖu tõ CSDL. Khi bÊt k× c©u lÖnh SQL nµo truy nhËp ®Õn bÊt k× hµng cña b¶ng trong CSDL th× cã thÓ cã nhiÒu ph¬ng thøc truy nhËp ®Ó t×m kiÕm vµ lÊy ra hµng ®ã. Oracle sÏ tiÕn hµnh chän ra mét ph¬ng thøc truy nhËp mµ nã cho r»ng tèi u nhÊt tuú theo viÖc ¸p dông luËt tèi u c¬ b¶n hay luËt tèi u íc lîng gi¸.
6. Chän thao t¸c kÕt nèi
§Ó kÕt nèi hai nguån d÷ liÖu bÊt k×, Oracle sÏ ph¶i thùc hiÖn mét trong c¸c thao t¸c kÕt nèi Nested-Loop, KÕt nèi b»ng s¾p xÕp trén (Sort-Merge), kÕt nèi b»ng sö dông Cluster, kÕt nèi b»ng sö dông hµm b¨m (Hash Join)
6.1. Chän c¸ch thùc hiÖn kÕt nèi víi luËt rule-based
Víi mét c©u lÖnh kÕt nèi trªn quan hÖ R, Oracle sÏ t¹o ra mét tËp hîp cña thø tù kÕt nèi R theo thuËt to¸n sau:
Víi mçi vÞ trÝ trong thø tù kÕt nèi, Oracle sÏ chän ra b¶ng cã c¸ch truy nhËp tèt nhÊt vµ cø nh vËy cho c¸c vÞ trÝ tiÕp theo.
Víi mçi b¶ng trong thø tù kÕt nèi, Oracle còng tiÕn hµnh chän ra thao t¸c kÕt nèi víi b¶ng (hoÆc nguån d÷ liÖu) ®øng tríc. Thao t¸c kÕt nèi b»ng s¾p xÕp trén (Merge-sort) ®îc sö dông lµm chuÈn (cã thø tù 12) cho c¸c c¸c qui t¾c tiÕp theo.
NÕu cã c¸ch truy nhËp lµ nhá h¬n 12 th× Oracle sÏ sö dông Nested-Loop víi b¶ng (hoÆc nguån d÷ liÖu) ®øng tríc lµm b¶ng ngoµi.
NÕu c¸ch truy nhËp lín h¬n 12 th× Oracle sÏ chän kÕt nèi theo ph¬ng ph¸p trén víi hai b¶ng.
NÕu c¸ch truy nhËp nhá h¬n 12 vµ kh«ng ph¶i lµ kÕt nèi b»ng th× Oracle sÏ chän thao t¸c Nested-Loop víi b¶ng tríc ®ã nh lµ b¶ng ngoµi.
Oracle sÏ chän sè thao t¸c kÕt nèi Nested-Loop lµ tèi ®a nÕu b¶ng néi ®îc truy nhËp b»ng Index vµ do vËy viÖc truy nhËp b¶ng néi nhiÒu lÇn sÏ ®¹t hiÖu qu¶ h¬n. Th«ng thêng th× thø tù c¸c b¶ng trong kÕt nèi sÏ kh«ng gièng nh thø tù xuÊt hiÖn trong mÖnh ®Ò FROM. Thø tù xuÊt hiÖn c¸c b¶ng sÏ theo c¸c qui t¾c sau:
+Oracle sÏ chän c¸ch thi hµnh cã thao t¸c Nested-Loop lµ tèi thiÓu nÕu nh b¶ng néi ph¶i duyÖt toµn bé.
+NÕu ®iÒu ®ã vÉn cßn cha hiÖu qu¶ th× Oracle sÏ tiÕn hµnh chän c¸ch thùc hiÖn víi theo t¸c s¾p xÕp trén lµ tèi thiÓu.
+NÕu vÉn cßn cha hiÖu qu¶ th× Oracle sÏ chän c¸ch thùc hiÖn mµ b¶ng ®Çu tiªn trong thø tù kÕt nèi lµ cã c¸ch truy nhËp tèt nhÊt.
Oracle sÏ chän b¶ng ®Çu tiªn mµ ®îc truy nhËp b»ng Index cét ®¬n vµ sÏ kÕt nèi theo kiÓu s¾p xÕp trén víi c¸c b¶ng kh¸c.
NÕu kh«ng ®îc th× Oracle sÏ chän b¶ng ®Çu tiªn mµ truy nhËp theo ph¬ng ph¸p duyÖt cã giíi h¹n vµ sè cét n»m trong phÇn ®Çu Index lµ tèi ®a.
+NÕu vÉn cha hiÖu qu¶ th× Oracle sÏ chän b¶ng xuÊt hiÖn sau cïng trong mÖnh ®Ò FROM.
6.2. Chän c¸ch thùc hiÖn kÕt nèi víi luËt tèi u Cost-based
Oracle sÏ t¹o ra mét tËp hîp c¸c c¸ch thùc hiÖn dùa trªn c¸c thø tù kÕt nèi cã thÓ, thao t¸c kÕt nèi vµ c¸c c¸ch truy nhËp tíi b¶ng. Oracle còng sÏ ®Þnh gi¸ cho mçi c¸ch thùc hiÖn vµ sÏ chän ra c¸ch nµo cã gi¸ ph¶i tr¶ lµ tèi thiÓu. §Ó ®Þnh gi¸ mét biÓu thøc Oracle sÏ dùa trªn c¸c th«ng tin sau:
-
Gi¸ cña mét thao t¸c Nested-Loop lµ gi¸ cña viÖc ®äc mçi hµng ®îc chän ra tõ b¶ng ngo¹i vµ mçi trêng hîp so khíp cña b¶ng néi ®îc n¹p vµo bé nhí. Oracle sÏ ®Þnh ra gi¸ nµy øng víi th«ng tin tr¹ng th¸i trong tõ ®iÓn d÷ liÖu.
-
Gi¸ cña mét thao t¸c kÕt nèi b»ng s¾p xÕp trén phÇn lín dùa trªn gi¸ ®Ó ®äc tÊt c¶ c¸c nguån d÷ liÖu vµo bé nhí vµ s¾p xÕp chóng.
-
Oracle còng ®Þnh gi¸ cña mét kÕt nèi theo s¾p xÕp trén dùa vµo c¸c yÕu tè kh¸c. VÝ dô nh:
- Mét vïng nhí s¾p xÕp cã kÝch thíc nhá sÏ lµm t¨ng gi¸ ph¶i tr¶ cho kÕt nèi s¾p xÕp bëi v× lóc ®ã viÖc s¾p xÕp sÏ cÇn nhiÒu thêi gian cña CPU h¬n vµ lÇn truy xuÊt (I/O) h¬n. KÝch thíc cña vïng bé nhí s¾p xÕp x¸c ®Þnh bëi tham sè SORT_AREA_SIZE.
- ViÖc ®äc mét ®a khèi lín sÏ lµm gi¶m gi¸ cña thao t¸c kÕt nèi b»ng s¾p xÕp trén trong mét quan hÖ so víi mét kÕt nèi Nested-Loop. NÕu sè lîng khã ®äc ®ång thêi trong mét lÇn truy xuÊt ®Üa(I/O) lµ lín th× mét truy nhËp qua Index cña b¶ng néi sÏ kÐm hiÖu qu¶ h¬n so víi duyÖt toµn bé. Sè lÇn ®äc ®a khèi ®îc biÕt qua tham sè DB_FILE_MULTIBLOCK_READ_COUNT.
- Víi mét kÕt nèi ngoµi th× b¶ng trong kÕt nèi ngoµi ph¶i ®i sau nh÷ng b¶ng kh¸c trong thø tù ®iÒu kiÖn cña kÕt nèi. Oracle sÏ s¾p xÕp l¹i nh÷ng thø tù kÕt nèi vi ph¹m ®iÒu kiÖn nµy.
D. KÕt luËn vÒ ph¬ng ph¸p tèi u trong Oracle
Sau khi ®· t×m hiÓu c¸ch thùc hiÖn c©u lÖnh víi c¸c tr¹ng th¸i cña d÷ liÖu cã thÓ rót ra c¸c c¸ch thøc ®Ó cho c©u lÖnh ®îc thùc hiÖn mét c¸ch tèi u nh sau:
1. Tèi u b»ng viÖc thay ®æi c¸c thùc thÓ
Bíc nµy ®îc thùc hiÖn trong giai ®o¹n thiÕt kÕ phÇn mÒm vµ viÖc thay ®æi c¸c thùc thÓ chØ ®îc sö dông trong c¸c trêng hîp ®Æc biÖt khi viÖc thiÕt kÕ c¸c b¶ng dÉn ®Õn c©u lÖnh thùc hiÖn trªn ®ã ph¶i sö dông ®Õn nhiÒu b¶ng trung gian.
B»ng viÖc thªm vµo mét thuéc tÝnh tõ b¶ng thø n vµo b¶ng thø nhÊt cã thÓ t¹o ra mét liªn kÕt trùc tiÕp gi÷a b¶ng 1 vµ b¶ng n mµ kh«ng cÇn ph¶i truy xuÊt c¸c b¶ng trung gian. Khi thay ®æi l¹i cÊu tróc c¸c b¶ng th× sÏ ph¸ vì d¹ng chuÈn d÷ liÖu 3NF nhng c©u lÖnh truy xuÊt trªn c¸c b¶ng sÏ nhanh h¬n. Do ®ã thao t¸c cÊu tróc l¹i c¸c b¶ng ®ßi hái ngêi thiÕt kÕ ph¶i n¾m v÷ng c¸c qui t¾c vÒ nghiÖp vô còng nh ph¶i lêng tríc ®îc c¸c vÊn ®Ò n¶y sinh trong c¸c thao t¸c cËp nhËt d÷ liÖu.
VÝ dô:
§Ó biÕt ®îc kh¸ch hµng thuéc chi nh¸nh nµo cña c«ng ty cã hai c¸ch thùc hiÖn nh sau:
C¸ch 1: Ph¶i thùc hiÖn kÕt nèi c¸c b¶ng CUSTOMERS (kh¸ch hµng), STREETS (®êng, phè), WARDS (phêng), SUBAREA (tiÓu khu), DISTRICTS (quËn), BRANCH (chi nh¸nh) sau ®ã thùc hiÖn phÐp chiÕu trªn cét BRANCH.name.
C¸ch 2: Thªm cét branch_code vµo b¶ng CUSTOMERS. ChØ cÇn thùc hiÖn kÕt nèi gi÷a hai b¶ng CUSTOMERS vµ BRANCH sau ®ã chiÕu trªn cét BRANCH.name.
2. Tèi u c¸c Table space
Bíc nµy ®îc thùc hiÖn trong qu¸ tr×nh t¹o thiÕt kÕ phÇn mÒm. Lý do sö dông viÖc ph©n bè c¸c thùc thÓ vµo c¸c Table lµ CSDL trong Oracle ®îc t¹o nªn tõ c¸c Tablespace, b»ng viÖc s¾p xÕp c¸c b¶ng trong c¸c Tablespace hîp lý còng cã thÓ t¨ng ®¸ng kÓ tèc ®é thùc hiÖn c©u lÖnh. Víi c¸c b¶ng Ýt cËp nhËt d÷ liÖu th× nªn ®Ó trong mét Tablespace (nh b¶ng chøa th«ng tin vÒ kh¸ch hµng) vµ c¸c b¶ng hay cËp nhËt vµo c¸c Tablespace kh¸c (nh b¶ng ho¸ ®¬n xuÊt kho). MÆt kh¸c c¸c Tablespace cã thÓ ®Æt trªn c¸c ®Üa kh¸c nhau do vËy viÖc truy xuÊt ®Õn c¸c Tablespace cã thÓ thùc hiÖn mét c¸ch ®ång thêi (do I/O kh«ng cÇn sù ®iÒu khiÓn cña CPU). Oracle ®· khuyÕn c¸o nªn t¹o mét Tablespace chØ ®Ó chøa c¸c Index vµ tèt nhÊt lµ ®Æt trªn mét æ ®Üa kh¸c víi c¸c Tablespace chøa d÷ liÖu. §iÒu nµy cã thÓ t¨ng tèc ®é thùc hiÖn truy xuÊt CSDL vµ cßn mét lý do n÷a lµ nÕu Tablespace chøa Index bÞ mÊt th× cã thÓ dÔ dµng t¹o l¹i.
VÝ dô trong hÖ qu¶n lý ho¸ ®¬n níc cã 8 Table space ®îc t¹o nh sau:
Tablespace USERS chøa c¸c ®èi tîng cña ngêi dïng n»m trong Data File Usr1BRN.ora vµ kÝch thíc lµ 100M.
Tablespace TEMP lµ vïng chøa c¸c th«ng tin t¹m n»m trong Data File Tmp1BRN.ora' size 80M;
Tablespace RBS dïng ®Ó chøa c¸c Rollback segment n»m trong data File Rbs1BRN.ora' kÝch thíc 60M;
Tablespace INDEXES chøa c¸c Index n»m trong Data File Ind1BRN.ora kÝch thíc 100M;
Tablespace CUST chøa c¸c b¶ng Ýt thay ®æi vÒ kh¸ch hµng vµ th«ng tin liªn quan n»m trong Data File Cus1BRN.ora kÝch thíc 50M;
Tablespace BILL chøa c¸c b¶ng ho¸ ®¬n hay thay ®æi n»m trong Data File Bil1BRN.ora kÝch thíc 50M;
Tablespace USAGE chøa c¸c th«ng tin vÒ lo¹i h×nh sö dông n»m trong Data File Usg1BRN.ora kÝch thíc 50M;
Tablespace METER chøa c¸c th«ng tin vÒ ®ång hå n»m trong Data File Met1BRN.ora kÝch thíc 50M;
3. Tèi u vïng nhí hÖ thèng SGA
Khi Oracle ho¹t ®éng th× mäi th«ng tin ph¶i chøa trong bé nhí hoÆc ®Üa. Do viÖc truy xuÊt trªn RAM sÏ nhanh h¬n nhiÒu víi viÖc truy xuÊt trªn ®Üa cho nªn mét trong nh÷ng thao t¸c c¬ b¶n trong tèi u ®Ó hÖ thèng cã thÓ ho¹t ®éng hiÖu qu¶ h¬n b»ng viÖc thay ®æi c¸c tham sè cña vïng nhí SGA (c¸c tham sè n»m trong Init File, cã thÓ t×m thÊy file nµy ë th môc DATABASE). Chó ý r»ng nªn cÊu h×nh lµm sao ®Ó cho toµn bé vïng nhí SGA n»m trong Physical Memory lµ tèt nhÊt. Cã thÓ thay ®æi kÝch thíc cña SGA th«ng qua viÖc thay ®æi tõng thµnh phÇn cña SGA vµ ®é lín cña SGA chÝnh lµ tæng ®é lín cña ba thµnh phÇn Share Pool + Buffer Cache + Redo Log Buffer.
-
§iÒu chØnh kÝch thíc Share Pool qua th«ng sè shared_pool_size ë trong Parameter File. Trong Share Pool cã ba thµnh phÇn lµ Library cache, Data dictionary cache vµ Session information. KÝch thíc cña Share Pool lµ thÝch hîp khi nã tho¶ m·n c¸c ®iÒu kiÖn díi ®©y.
- Víi ®é lín Library cache thÝch hîp khi mµ tØ lÖ sè lÇn thñ tôc vµ hµm trong th viÖn ®îc thùc hiÖn (PINS) chia cho sè lÇn hµm vµ thñ tôc ®ã ph¶i n¹p tõ ®Üa (RELOADS). TØ lÖ nµy nhá h¬n hoÆc b»ng 1% vµ cµng gÇn 0 cµng tèt. §Ó biÕt ®îc tØ lÖ nµy cÇn thùc hiÖn c©u lÖnh sau:
SELECT (sum(reloads)/sum(pins))*100,’%’ FROM v$librarycache;
KÕt qu¶ thùc hiÖn víi Database Center 0.09366945%, nh vËy bé nhí dµnh cho Library Cache kh¸ nhiÒu.
- §é lín cña Data dictionary cache thÝch hîp khi tØ lÖ sè lÇn lÊy th«ng tin (GETS) chia cho sè lÇn th«ng tin kh«ng cã (GETMISSES) n»m trong kho¶ng 10% ®Õn 15% vµ cµng gÇn 0 cµng tèt. Gi¸ trÞ nµy ®îc biÕt qua c©u lÖnh sau:
SELECT (SUM(GETMISSES)/SUM(GETS))*100,'%' FROM V$ROWCACHE;
KÕt qu¶ thùc hiÖn víi Database Center lµ 2.0352019%, nh vËy vïng bé nhí dµnh cho Data dictionary cache kh¸ nhiÒu.
-
§iÒu chØnh ®é lín cña Database Bufer Cache: Thµnh phÇn nµy ®îc Oracle chia lµm nhiÒu Block mçi Block cã kÝch thíc cè ®Þnh tuú thuéc hÖ ®iÒu hµnh vµ x¸c ®Þnh qua tham sè db_block_size trong Parameter File. B»ng c¸ch thay ®æi sè Block (qua tham sè db_block_buffers) sÏ thay ®æi ®îc kÝch thíc cña Database Bufer Cache.
§é lín cña Database Bufer Cache thÝch hîp khi tØ lÖ sè khèi d÷ liÖu ®îc ®äc tõ ®Üa (physical reads) chia cho tæng sè c¸c khèi ®îc yªu cÇu (db block gets + constent gets). TØ lÖ nµy nªn nhá h¬n 30% ®Õn 40% vµ cµng gÇn 0 cµng tèt. Cã thÓ x¸c ®Þnh ®îc tØ lÖ nµy qua c¸c c©u lÖnh sau.
CREATE TABLE kq (ratio number);
DECLARE
p NUMBER;
d NUMBER;
c NUMBER;
r NUMBER;
BEGIN
SELECT value INTO p FROM v$sysstat WHERE name='physical reads';
SELECT value INTO d FROM v$sysstat WHERE name='db block gets';
SELECT value INTO c FROM v$sysstat WHERE name='consistent gets';
r := p/(d+c);
r := r*100;
INSERT INTO kq VALUES (r);
EXCEPTION
WHEN ZERO_DIVIDE THEN
INSERT INTO kq VALUES (0);
END;
/
SELECT ratio,'%' FROM kq;
DROP TABLE kq;
KÕt qu¶ thùc hiÖn Database Center lµ 64.517194 %, ®iÒu nµy chøng tá vïng bé nhí dµnh cho Database Bufer Cache ®ñ tèt vµ nªn dµnh thªm vïng bé nhí tõ Share Pool sang.
-
KÝch thíc cña Redo Log Buffer cã thÓ ®iÒu chØnh ®îc b»ng tham sè log_buffer trong Parameter File.
4. Tèi u ho¸ sö dông Index
ViÖc Index gióp t¨ng tèc ®é truy nhËp tíi b¶ng tuy nhiªn nã l¹i gi¶m tèc ®é cña qu¸ tr×nh thªm, cËp nhËt d÷ liÖu. Nãi chung nªn t¹o Index khi d÷ liÖu cña cét cã tÝnh chän läc cao (gi¸ trÞ trïng lÆp) kh«ng nhiÒu vµ Index ®Æc biÖt h÷u Ých khi mµ sè lîng hµng t×m ®îc lµ 2% - 4% so víi sè lîng hµng cña b¶ng. Khi sè lîng c¸c hµng tr¶ l¹i lµ nhiÒu th× b¶n th©n viÖc truy nhËp trªn B-tree còng mÊt kh¸ nhiÒu thêi gian v× vËy lóc ®ã dïng ph¬ng ph¸p duyÖt toµn bé cã thÓ l¹i nhanh h¬n. Kh«ng nªn t¹o Index cho c¸c cét chøa qu¸ Ýt gi¸ trÞ kh¸c nhau nh YES vµ NO, tuy nhiªn nÕu c¸c c©u lÖnh thêng xuyªn lµm viÖc víi mét gi¸ trÞ trÞ gi¶ sö lµ gi¸ trÞ YES th× viÖc t¹o Index l¹i t¨ng tèc ®é thùc hiÖn. MÆt kh¸c do cã nhiÒu lo¹i Index víi c¸c u nhîc ®iÓm riªng tuú thuéc vµo tõng ®Æc ®iÓm d÷ liÖu do vËy cÇn chän ph¬ng ph¸p Index thÝch hîp nh Index th«ng thêng tèt khi c©u lÖnh cã tÝnh chän läc cao, Index Bitmap cã t¸c dông khi sè hµng nhiÒu, gi¸ trÞ lÆp l¹i Ýt (tÝnh chän läc thÊp), Cluster thÝch hîp cho c¸c b¶ng cã liªn kÕt ®îc dïng thêng xuyªn.
5. Tèi u b»ng thay ®æi c©u lÖnh SQL
§©y lµ phÇn träng t©m cña qu¸ tr×nh tèi u c©u lÖnh SQL ®Ó cho c¸c c©u lÖnh SQL míi t¬ng ®¬ng c©u lÖnh SQL cò vÒ mÆt kÕt qu¶ nhng cã thêi gian ch¹y nhanh h¬n nhiÒu. MÆc dï Oracle hç trî cho viÖc tèi u c¸c c©u lÖnh SQL ®a vµo tuy nhiªn trong mét sè trêng hîp ngêi ph¸t triÓn phÇn mÒm ph¶i tù chuyÓn c©u lÖnh thµnh c©u lÖnh cã kÕt qu¶ t¬ng ®¬ng cho tèi u h¬n nh c©u lÖnh
SELECT TªnNh©nViªn, L¬ng FROM Nh©nViªn WHERE L¬ng*10>20,000;
thµnh: SELECT TªnNh©nViªn, L¬ng FROM Nh©nViªn WHERE L¬ng>2,000;
Trong phô lôc B sÏ giíi thiÖu vÒ qu¸ tr×nh tèi u b»ng thay ®æi c©u lÖnh trªn view cña phÇn mÒm Tra cøu v¨n b¶n ph¸p qui. Thêi gian thùc hiÖn c©u lÖnh cha tèi u lµ 41.43 gi©y, sau khi tèi u thêi gian thùc hiÖn cßn 2.36 gi©y (b»ng 4.8 %).
Trong phô lôc C sÏ giíi thiÖu vÒ qu¸ tr×nh tèi u b»ng thay ®æi c©u lÖnh kÕt nèi còng cña phÇn mÒm Tra cøu v¨n b¶n ph¸p qui. Thêi gian thùc hiÖn c©u lÖnh cha tèi u lµ 1.16 gi©y, sau khi tèi u thêi gian thùc hiÖn xÊp xØ 0 gi©y.
Nh vËy thùc tÕ lµ qua hai qu¸ tr×nh tèi u th× khi tra cøu th«ng tin vÒ V¨n b¶n ph¸p qui do V¨n phßng chÝnh phñ vµ UBND c¸c tØnh ban hµnh b»ng Web trªn m¹ng th× thêi gian ®¸p øng tõ 41.43 gi©y xuèng xÊp xØ 1.2 gi©y. Thêi gian ®¸p øng n»m ë qu¸ tr×nh Dial up vµ hiÓn thÞ cña tr×nh duyÖt Web.
Mét sè vÝ dô kh¸c vÒ qu¸ tr×nh tèi u sÏ ®îc giíi thiÖu trong phÇn tèi u ho¸ HÖ tÝnh ho¸ ®¬n níc vµ qu¶n lý kh¸ch hµng cña c«ng ty cÊp níc Thµnh phè Hå ChÝ Minh (WSC).
6. Thªm c¸c chØ thÞ thùc hiÖn vµo trong c©u lÖnh
Lý do ®Ó thªm c¸c chØ dÉn: BÊt k× ngêi thiÕt kÕ phÇn mÒm nµo còng biÕt râ vÒ ®Æc ®iÓm vÒ d÷ liÖu h¬n Oracle v× vËy trong mét sè trêng hîp cÇn chØ dÉn cho Oracle thùc hiÖn c©u lÖnh theo híng mong muèn.
VÝ dô:
SELECT * FROM tab1 WHERE col1=’A’;
SELECT * FROM tab1 WHERE col1=’B’;
Gi¶ sö r»ng cét col1 cña b¶ng tab1 chøa c¸c kÝ tù tõ ‘A’ ®Õn ‘Z’ víi sè lîng lµ 1000 dßng trong ®ã 75% sè dßng chøa kÝ tù ‘A’ vµ mçi kÝ tù cßn l¹i chiÕm 1% sè dßng cña b¶ng. Víi c©u lÖnh thø nhÊt dïng ph¬ng ph¸p duyÖt toµn bé sÏ nhanh h¬n sö dông Index cßn trong c©u lÖnh thø hai th× sÏ dïng Index th× l¹i nhanh h¬n duyÖt toµn bé. Nh vËy b»ng viÖc sö dông chØ dÉn Oracle cã thÓ thùc hiÖn c©u lÖnh hiÖu qu¶ h¬n (bé tèi u sÏ sö dông Index cho c¶ hai c©u lÖnh).
C¸c chØ dÉn cã thÓ ¸p dông cho c¸c c©u lÖnh ®¬n SELECT, UPDATE, INSERT vµ viÕt theo có ph¸p sau:
hoÆc
C¸c chØ dÉn ph¶i ®i ngay sau c¸c tõ kho¸ DELETE, UPDATE, INSERT.
DÊu céng (+) lµ chØ thÞ b¸o cho Oracle biÕt r»ng b¾t ®Çu c¸c chØ dÉn th«ng dÞch vµ trong c¸c chØ dÉn nµy cã thÓ cã chøa c¸c chó thÝch. Cã c¸c kiÓu chØ dÉn thùc hiÖn chän luËt tèi u, chän c¸ch truy nhËp, chän thø tù kÕt nèi vµ chän thao t¸c kÕt nèi.
6.1. ChØ dÉn chän luËt tèi u
ALL_ROWS: ChØ ®Én nµy b¸o cho Oracle biÕt ph¶i sö dông luËt tèi u íc lîng gi¸ cho khèi lÖnh sao cho tæng sè tµi nguyªn ®îc sö dông lµ tèi thiÓu (nghÜa lµ sè khèi lÖnh ®îc xö lý ®ång thêi lµ tèi ®a).
VÝ dô:
SELECT /*+ ALL_ROWS */ M·Nh©nViªn,TªnNh©nViªn FROM Nh©nViªn WHERE M·Nh©nViªn=7566;
FIRST_ROWS: ChØ dÉn chän luËt tèi u íc lîng gi¸ víi thêi gian ®¸p øng lµ tèi thiÓu (vµ tèi thiÓu nguån tµi nguyªn ®îc sö dông ®Ó tr¶ l¹i hµng ®Çu tiªn). ChØ dÉn nµy sÏ Ðp Oracle chän ph¬ng thøc truy nhËp b»ng Index thay cho duyÖt toµn bé (nÕu cã s½n Index). NÕu kh«ng cã s½n Index th× Oracle sÏ sö dông ph¬ng thøc truy nhËt b»ng Nested-loop thay cho Merge-sort. ChØ dÉn nµy kh«ng cã t¸c dông khi c©u lÖnh sö dông to¸n tö tËp hîp (UNION, INTERSEC, MINUS, UNION ALL), mÖnh ®Ò GROUP BY, mÖnh ®Ò FOR UPDATE, hµm lµm viÖc víi nhãm hµng (MIN, MAX, SUM, COUNT) vµ to¸n tö DISTINCT.
CHOOSE: ChØ dÉn nµy cho phÐp Oracle chän luËt tèi u dùa trªn th«ng tin trong tõ ®iÓn d÷ liÖu, nÕu cã th«ng tin vÒ c¸c b¶ng th× luËt tèi u íc lîng ®îc ¸p dông cßn ngîc l¹i th× ¸p dông luËt tèi u c¬ b¶n.
RULE: ¸p dông luËt tèi u c¬ b¶n cho c©u lÖnh.
6.2. ChØ dÉn vÒ chän ph¬ng thøc truy nhËp
FULL: Sö dông ph¬ng thøc duyÖt toµn bé víi mét b¶ng ®Æc biÖt b»ng chØ dÉn FULL() vµ nªn sö dông bÝ danh (alias) cho tªn b¶ng.
VÝ dô:
SELECT /*+ FULL(a) Kh«ng sö dông Index cho b¶ng Nh©nViªn cã bÝ danh lµ a */ M·Nh©nViªn, TªnNh©nViªn
FROM Nh©nViªn a
WHERE M·Nh©nViªn=7566;
ROWID: Sö dông duyÖt b¶ng b»ng ROWID cho mét b¶ng ®Æc biÖt b»ng chØ dÉn ROWID().
CLUSTER: Chän ph¬ng thøc duyÖt b»ng Cluster cho mét b¶ng b»ng chØ dÉn CLUSTER()
VÝ dô:
SELECT --+ CLUSTER Nh©nViªn
TªnNh©nViªn, M·Phßng
WHERE M·Phßng=10 AND Nh©nViªn.M·Phßng=Phßng.M·Phßng;
HASH: Chän ph¬ng thøc truy nhËp b¨m (hash scan) cho mét b¶ng b»ng chØ dÉn HASH().
INDEX: Chän c¸ch truy nhËp b»ng Index cho mét b¶ng theo có ph¸p sau
NÕu danh s¸ch Index cã nhiÒu gi¸ trÞ th× Oracle sÏ íc lîng gi¸ cña ph¬ng thøc duyÖt øng víi mçi Index vµ chän ra ph¬ng thøc nµo cã gi¸ nhá nhÊt. NÕu kh«ng Index ®îc chØ ra trong danh s¸ch th× Oracle sÏ tiÕn hµnh íc lîng gi¸ th«ng qua c¸c Index cã s½n trong CSDL ®ang truy nhËp.
VÝ dô:
SELECT /*+ INDEX(Nh©nViªn giíitÝnh_index) sö dông Index trªn cét giíi tÝnh cña b¶ng Nh©nViªn khi mµ cã Ýt n÷ : GiíiTÝnh=0 */
TªnNh©nViªn, L¬ng WHERE GiíiTÝnh=0;
INDEX_ASC: ChØ dÉn chän ph¬ng thøc truy nhËp qua Index vµ nÕu Index ®ã lµ duyÖt cã giíi h¹n (Index Range Scan) th× sÏ theo chiÒu t¨ng dÇn cña gi¸ trÞ ®îc Index.
INDEX_DESC: ChØ dÉn chän ph¬ng thøc truy nhËp qua Index vµ nÕu Index ®ã lµ duyÖt cã giíi h¹n (Index Range Scan) th× sÏ theo chiÒu gi¶m dÇn cña gi¸ trÞ ®îc Index.
AND_EQUAL: Chän ph¬ng thøc truy nhËp b»ng duyÖt trªn nhiÒu Index ®¬n. Tèi thiÓu ph¶i cã hai Index ®¬n vµ tèi ®a lµ n¨m Index ®¬n.
USE_CONCAT: ChØ dÉn nµy buéc ®iÒu kiÖn OR trong mÖnh ®Ò WHERE chuyÓn thµnh query sö dông to¸n tö tËp hîp UNION ALL. Th«ng thêng viÖc chuyÓn nµy chØ ®îc thùc hiÖn khi gi¸ cña viÖc chuyÓn lµ nhá h¬n víi gi¸ cña c©u lÖnh ban ®Çu.
6.3. ChØ dÉn vÒ thø tù kÕt nèi trong c©u lÖnh sö dông kÕt nèi
ORDERED: ChØ dÉn thø tù kÕt nèi tu©n theo thø tù xuÊt hiÖn tªn c¸c b¶ng trong mÖnh ®Ò FROM.
VÝ dô:
SELECT /*+ ORDERED */ tab1.col1, tab2.col2, tab3.col3 FROM tab1, tab2, tab3 WHERE tab1.col1=tab2.col1 AND tab2.col1=tab3.col1
C¸c vÝ dô ®Çy ®ñ h¬n sÏ ®îc giíi thiÖu trong phô lôc D.
-
ChØ dÉn cho qu¸ tr×nh chän thao t¸c kÕt nèi
USE_NL: ChØ dÉn chän thao t¸c kÕt nèi Nested-Loop víi b¶ng néi (inner table) ®îc chØ ra
USE_HASH: ChØ dÉn chän thao t¸c kÕt nèi Hash-Join.
USE_MERGE: ChØ dÉn chän thao t¸c kÕt nèi Merge-Sort.
C¸c chØ dÉn kÕt nèi rÊt quan träng ®Ó ®iÒu khiÓn qu¸ tr×nh kÕt nèi theo ®óng mong muèn cña ngêi lËp tr×nh. Phô lôc D sÏ ®a ra mét vÝ dô cã sö dông chØ dÉn kÕt nèi cña phÇn mÒm Tra cøu v¨n b¶n ph¸p qui ®· gi¶i quyÕt ®îc yªu cÇu ®Æt ra vÒ tèc ®é.
Chia sẻ với bạn bè của bạn: |