Ch¬ng III Ph¬ng ph¸p tèi u ho¸ trong HÖ CSDL Oracle A. C¸c kh¸i niÖm cÇn biÕt ®Ó tèi u ho¸
PhÇn nµy sÏ ®a ra mét sè kh¸i niÖm ®îc sö dông qu¸ tr×nh tèi u ho¸.
Qui íc r»ng tªn c¸c b¶ng còng nh c¸c thuéc tÝnh trong c¸c vÝ dô minh ho¹ sÏ viÕt tiÕng ViÖt cho cho dÔ hiÓu nhng trong thùc tÕ ph¶i bá c¸c dÊu tiÕng ViÖt ®i bëi v× Oracle cha hç trî triÖt ®Ó cho ng«n ng÷ ViÖt.
1. Kh¸i niÖm vÒ tèi u ho¸
Nãi chung c¸c ng«n ng÷ bËc cao (trong ®ã cã ng«n ng÷ SQL) ®ßi hái thùc hiÖn trong m¸y ®Òu rÊt tèn kÐm thêi gian. §Æc biÖt lµ khi d÷ liÖu nhiÒu lªn th× thêi gian thùc hiÖn c¸c c©u lªn sÏ t¨ng theo hÖ sè nh©n, do ®ã cÇn thiÕt ph¶i biÕn ®æi c¸c c©u hái cho hîp lý ®Ó gi¶m thêi gian tÝnh to¸n.
VËy cã thÓ ®Þnh nghÜa kh¸i niÖm tèi u ho¸ nh sau:
Tèi u ho¸ (optimization) c©u lÖnh SQL lµ mét qu¸ tr×nh ®Ó t¹o ®iÒu kiÖn cho c©u lÖnh SQL ®a ra kÕt qu¶ ®¹t hiÖu qu¶ cao nhÊt hiÓu theo nghÜa thêi gian ®¸p øng vµ sö dông tµi nguyªn hÖ thèng lµ nhá nhÊt.
Theo ®Þnh nghÜa nµy th× viÖc tèi u ho¸ c©u lÖnh SQL kh«ng ®¬n thuÇn lµ tèi u m· c©u lÖnh mµ cßn cã thÓ thay c©u lÖnh SQL b»ng c©u lÖnh SQL kh¸c cho ra cïng kÕt qu¶ nhng thùc hiÖn hiÖu qu¶ h¬n, ®iÒu chØnh c¸c tham sè hÖ thèng ®Ó tµi nguyªn dµnh cho c©u lÖnh lµ hîp lý nhÊt, thay ®æi c¸c thùc thÓ vµ quan hÖ gi÷a c¸c thùc thÓ cho c©u lÖnh thùc hiÖn nhanh h¬n.
Chó ý r»ng viÖc tèi u ho¸ kh«ng nhÊt thiÕt ph¶i ®óng lµ “tèi u” trªn mäi kh¶ n¨ng cã thÓ cña c¸c c¸ch cµi ®Æt c¸c c©u hái bëi v× nÕu sö dông tµi nguyªn cµng nhiÒu th× c©u lÖnh cµng cã kh¶ n¨ng thùc hiÖn nhanh tuy nhiªn sÏ gi¶m sè khèi lÖnh ®îc xö lý ®ång thêi vµ ngîc l¹i.
Trong thùc tÕ th× qu¸ tr×nh tèi u ho¸ ph¶i tiÕn hµnh thêng xuyªn trong mäi kh©u s¶n xuÊt phÇn mÒm ®Ó s¶n phÈm ngµy cµng ®îc hoµn thiÖn h¬n, ®iÒu nµy còng lµ mét trong c¸c lý do ra ®êi c¸c phiªn b¶n Version 1.0, Version 2.0 ... cña phÇn mÒm.
2. ChiÕn lîc tèi u trªn c¸c trªn c¸c biÓu thøc quan hÖ
Ullman J.D trong c¸c kÕt qu¶ nghiªn cøu c«ng bè lÇn ®Çu tiªn cña m×nh ®· tr×nh bµy 6 chiÕn lîc tæng quan cho viÖc tèi u ho¸. C¸c chiÕn lîc nµy sÏ ®îc thÓ hiÖn trùc tiÕp hay gi¸n tiÕp trong c¸c bíc tèi u cô thÓ trong Oracle.
Néi dung cña c¸c chiÕn lîc ®ã nh sau:
2.1. Thùc hiÖn phÐp chän cµng sím cµng tèt
BiÕn ®æi c©u hái ®Ó ®a phÐp chän vµo thùc hiÖn tríc nh»m lµm bít kÝch cì cña kÕt qu¶ trung gian vµ do vËy chi phÝ ph¶i tr¶ gi¸ cho viÖc truy nhËp bé nhí thø cÊp còng nh lu tr÷ cña bé nhí chÝnh sÏ nhá ®i.
2.2. Tæ hîp nh÷ng phÐp chän (x¸c ®Þnh víi tÝch §Ò-c¸c) thµnh phÐp kÕt nèi
Nh ®· biÕt, phÐp kÕt nèi, ®Æc biÖt lµ phÐp kÕt nèi b»ng cã thÓ thùc hiÖn ®îc “rΔ h¬n lµ thùc hiÖn phÐp tÝch §Ò-c¸c trªn cïng c¸c quan hÖ. NÕu kÕt qu¶ cña §Ò-c¸c R x S lµ ®èi sè cña phÐp chän vµ phÐp chän liªn quan tíi c¸c phÐp so s¸nh gi÷a c¸c thuéc tÝnh cña R vµ S th× râ rµng phÐp tÝch §Ò-c¸c lµ phÐp kÕt nèi.
2.3. Tæ hîp d·y c¸c phÐp tÝnh mét ng«i nh c¸c phÐp chän vµ phÐp chiÕu
Mét d·y c¸c phÐp mét ng«i nh phÐp chän hoÆc phÐp chiÕu mµ kÕt qu¶ cña chóng phô thuéc vµ c¸c bé cña mét quan hÖ ®éc lËp th× cã thÓ nhãm c¸c phÐp ®ã l¹i.
2.4. T×m c¸c biÓu thøc con chung trong mét biÓu thøc
NÕu kÕt qu¶ cña mét biÓu thøc con chung (biÓu thøc xuÊt hiÖn h¬n mét lÇn) lµ mét quan hÖ kh«ng lín vµ nã cã thÓ ®îc ®äc tõ bé nhí thø cÊp víi Ýt thêi gian th× nªn tÝnh to¸n tríc biÓu thøc ®ã chØ mét lÇn. BiÓu thøc con chung cã lªn quan tíi mét phÐp kÕt nèi th× trong trêng hîp tæng qu¸t kh«ng thÓ ®îc thay ®æi nhê viÖc ®Èy phÐp chän vµo trong.
§iÒu ®¸ng quan t©m h¬n lµ c¸c biÓu thøc con chung cã tÇn sè xuÊt hiÖn lín ®îc biÓu diÔn trong c¸c View (khung nh×n) cña c¸c ngêi dïng v× ®Ó thùc hiÖn c¸c c©u hái ®ã cÇn thay thÕ mét biÓu thøc cè ®Þnh vµo cho View.
2.5. Xö lý c¸c tÖp tríc
Cã hai vÊn ®Ò cÇn xö lý tríc quan träng cho c¸c tÖp sè lµ s¾p xÕp tríc c¸c tÖp vµ thiÕt lËp c¸c tÖp chØ sè. Vµ nh vËy khi thùc hiÖn c¸c phÐp tÝnh cã liªn quan tíi hai tÖp (phÐp tÝnh hai ng«i) sÏ nhanh h¬n rÊt nhiÒu.
2.6. §¸nh gi¸ tríc khi thùc hiÖn tÝnh to¸n
Mét khi cÇn chän tr×nh tù thùc hiÖn c¸c phÐp tÝnh trong biÓu thøc hoÆc chän mét trong hai ®èi sè cña mét phÐp tÝnh hai ng«i cÇn tÝnh to¸n xem chi phÝ thùc hiÖn c¸c phÐp tÝnh ®ã (thêng lµ sè phÐp tÝnh, thêi gian, kÝch thíc bé nhí theo mét tû lÖ gi÷a kÝch cì c¸c quan hÖ ...). Tõ ®ã sÏ cã ®îc c¸c chi phÝ (gi¸ thµnh) ph¶i tr¶ cho c¸c c¸ch kh¸c nhau ®Ó thùc hiÖn c¸c c©u hái.
3. C¸c kiÓu ph©n líp trong CSDL Oracle
Mét trong c¸c th«ng tin quan träng khi tèi u ho¸ lµ chän c¸ch truy nhËp d÷ liÖu dùa trªn ®Æc ®iÓm lu tr÷. Th«ng thêng khi truy xuÊt tíi mét hµng cña b¶ng ph¶i duyÖt tuÇn tù tõ ®Çu cña b¶ng cho tíi hµng cÇn truy xuÊt. Tuy nhiªn mçi hµng cña c¸c b¶ng trong Oracle ®Òu chøa mét ®Þa chØ cña nã gäi lµ ROWID. C¸ch truy xuÊt tuÇn tù rÊt chËm khi d÷ liÖu lín vµ cÇn t×m c¸ch truy xuÊt trùc tiÕp tíi hµng th«ng qua ROWID. Do vËy trong Oracle th× d÷ liÖu ®îc lu tr÷ theo c¸c d¹ng ph©n líp vµ khi cÇn truy xuÊt tíi hµng th× t×m ROWID t¬ng øng ë c¸c ph©n líp vµ truy xuÊt tíi hµng th«ng qua ROWID t×m ®îc:
3.1. Ph©n líp dùa vµo Index
Khi mµ c¸c b¶ng ®îc Index th× cïng víi gi¸ trÞ cña trêng Index cßn cã c¸c ROWID. Tuú theo gi¸ trÞ cña cét Index cã lµ kho¸ duy nhÊt hay kh«ng th× t¬ng øng víi mét kho¸ cña Index cã thÓ cã mét hoÆc cã nhiÒu ROWID. Víi mét gi¸ trÞ kho¸ Index th× sÏ nhËn ®îc ROWID t¬ng øng vµ ROWID sÏ ®îc dïng t×m ra hµng ®îc yªu cÇu trong mét nhãm c¸c hµng cã cïng gi¸ trÞ kho¸ Index. Th«ng thêng c¸c Index trong Oracle ®îc t¹o theo d¹ng “B-tree” tuy nhiªn Oracle cßn cung cÊp mét møc Index kh¸c gäi lµ Bitmap Index. KiÓu Index míi mµ ®Æc biÖt hiÖu qu¶ víi nh÷ng cét mµ sè lîng nhiÒu nhng tËp gi¸ trÞ l¹i Ýt vÝ dô nh cét giíi tÝnh, cét m· khu vùc ch¼ng h¹n. B»ng viÖc ¸nh x¹ vÞ trÝ c¸c cét víi c¸c bit sÏ dÔ dµng nhËn ®îc kÕt cÇn t×m. VÝ dô sau sÏ minh ho¹ ®iÒu nµy.
Gi¶ sö cã b¶ng SinhViªn cã c¸c thuéc tÝnh M·SinhViªn, GiíiTÝnh, KhuVùc cã c¸c gi¸ trÞ nh sau:
M·SinhViªn
|
GiíiTÝnh
|
KhuVùc
|
101
|
N÷
|
KV1
|
102
|
Nam
|
KV2
|
103
|
Nam
|
KV3
|
104
|
N÷
|
KV3
|
105
|
Nam
|
KV2
|
106
|
Nam
|
KV2
|
Khi thùc hiÖn phÐp Index víi cét KhuVùc sÏ thu ®îc b¶ng sau:
KhuVùc=KV1
|
KhuVùc=KV2
|
KhuVùc=KV3
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
0
|
Trong b¶ng Index th× mçi cét øng víi mét ®Ò môc trong cét Index, vÝ dô cét KhuVùc=KV1 th× gi¸ trÞ 1 øng víi hµng cña B¶ng SinhViªn cã KhuVùc=KV1, ngîc l¹i lµ gi¸ trÞ 0.
Gi¶ sö ®Ó lÊy ra mäi thuéc tÝnh cña b¶ng sinh viªn víi ®iÒu kiÖn sinh viªn lµ n÷ ë khu vùc KV2 vµ KV3 víi c©u lÖnh:
SELECT * FROM SinhViªn WHERE GiíiTÝnh=’N÷’ AND KhuVùc IN (‘KV2’, ’KV3’);
B»ng viÖc sö dông Bitmap Index vµ truy nhËp trªn b¶ng Bitmap ®Ó läc ra tËp hîp c¸c hµng tho¶ m·n ®iÒu kiÖn ®· nªu, qu¸ tr×nh ®ã ®îc m« t¶ nh b¶ng díi ®©y:
GiíiTÝnh = ’N÷’
|
KhuVùc = ‘KV2’
|
KhuVùc = ‘KV3’
|
|
|
|
0
1
1 AND (
0
0
1
|
0
1
0 OR
0
1
1
|
0
0
1 ) =
1
0
0
|
0
1
1 AND
0
0
1
|
0
1
1 =
1
1
1
|
0
1
1
0
0
1
| 3.2. Ph©n líp b»ng Cluster
Cluster lµ mét c¸ch thøc lu tr÷ d÷ liÖu cña c¸c b¶ng trong Oracle thµnh mét nhãm vµ gi÷a c¸c b¶ng nµy thêng cã mét sè cét lµ kho¸ ngoµi tham chiÕu tíi nhau. VÝ dô nh b¶ng Nh©nViªn vµ b¶ng Phßng sÏ cã chung mét cét lµ M·Phßng. Khi nhãm b¶ng Nh©nViªn vµ b¶ng Phßng th× Oracle sÏ chøa tÊt c¶ c¸c hµng t¬ng øng víi mét phßng ban cña c¶ hai b¶ng vµo trong cïng mét khèi d÷ liÖu.
Do Cluster chøa c¸c hµng cña c¸c b¶ng cã liªn hÖ víi nhau nªn cã hai u ®iÓm sau:
-
Thêi gian ®äc ®Üa ®îc c¶i thiÖn cho c©u lÖnh kÕt nèi cña c¸c b¶ng trong Cluster bëi v× cÊu tróc cña Cluster ®· chøa s½n mét mèi liªn kÕt gi÷a c¸c b¶ng.
-
Trong mét Cluster th× mçi gi¸ trÞ kho¸ Cluster còng lµ mét thµnh phÇn cña c¸c hµng vµ duy nhÊt chØ cã mét gi¸ trÞ ®îc lu tr÷ cho mét khèi cña Cluster thay mçi hµng ph¶i chøa gi¸ trÞ ®ã. §iÒu nµy sÏ tiÕt kiÖm ®îc kh«ng gian lu tr÷ trªn ®Üa.
§Ó sö dông ®îc Cluster th× cÇn ph¶i t¹o ra Index cho Cluster gäi lµ chØ môc ph©n líp. Kh¸c víi chØ môc th«ng thêng, lo¹i chØ môc nµy cã c¸c ®Æc ®iÓm sau
-
Kho¸ cho c¸c gi¸ trÞ NULL cã chung mét ®Ò môc trong chØ môc ph©n líp.
-
Mçi ®Ò môc trong chØ môc ph©n líp sÏ chØ ®Õn hµng ®Çu tiªn cña khèi d÷ liÖu trong Cluster.
-
D÷ liÖu cña b¶ng ®îc lu tr÷ trong Cluster chØ ®îc truy nhËp nÕu cã chØ môc ph©n líp.
3.3. Ph©n líp dùa vµo kho¸ cña hµm b¨m
Ph©n líp b»ng hµm b¨m (Hash Function) lµ mét c¸ch thøc lu tr÷ d÷ liÖu theo kho¸ b¨m ®Ó tèi u qu¸ tr×nh truy xuÊt d÷ liÖu. Th«ng qua mét hµm b¨m th× mçi hµng cã mét gi¸ trÞ kho¸ b¨m vµ c¸c hµng cã kho¸ b¨m trïng nhau sÏ ®îc n»m trong cïng mét líp. §Ó truy nhËp ®Õn hµng tríc tiªn cÇn sö dông hµm b¨m ®Ó t×m ra kho¸ hµm b¨m cña hµng. Sau ®ã truy nhËp ®Õn b¶ng b¨m th«ng qua kho¸ hµng b¨m vµ lÊy ra ®îc ROWID ®Ó truy nhËp trùc tiÕp ®Õn hµng.
3.4. Kh«ng ph©n líp
NghÜa lµ d÷ liÖu ®îc ghi tù nhiªn nh lóc t¹o do vËy viÖc truy nhËp th«ng tin lu«n ®ßi hái ph¶i dïng duyÖt toµn bé b¶ng.
Do viÖc ®¶m b¶o tÝnh chuÈn ho¸ cña d÷ liÖu mµ c¸c b¶ng sÏ ®îc kÕt nèi víi nhau th«ng qua c¸c kho¸. Mét trong c¸c bíc tèi u ho¸ lµ lùa chän kiÓu kÕt nèi thÝch hîp. Trong Oracle cã c¸c kiÓu kÕt nèi sau:
4.1. KÕt nèi b»ng Nested-Loop
§Ó thùc hiÖn mét kÕt nèi theo kiÓu Nested-Loop, Oracle sÏ chän ra mét b¶ng nh lµ b¶ng ngoµi hay lµ b¶ng dÉn d¾t (outer table hoÆc driving table), b¶ng cßn l¹i ®îc gäi lµ b¶ng néi (inner table). Víi mçi hµng trong b¶ng ngoµi th× Oracle sÏ t×m tÊt c¶ c¸c hµng trong b¶ng néi tho¶ m·n ®iÒu kiÖn kÕt nèi. CÆp hµng tho¶ m·n ®iÒu kiÖn kÕt nèi sÏ ®îc hîp l¹i thµnh mét vµ thªm vµo tËp c¸c hµng kÕt qu¶.
VÝ dô: SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng=Phßng.M·Phßng;
4.2. KÕt nèi b»ng s¾p xÕp trén
§iÒu kiÖn cã thÓ ¸p dông ®îc ph¬ng ph¸p kÕt nèi nµy lµ hai nguån d÷ liÖu ph¶i kÕt nèi theo kiÓu b»ng chø kh«ng thÓ lµ kiÓu kÕt nèi kh¸c.
Oracle sÏ tiÕn hµnh s¾p xÕp mçi nguån d÷ liÖu theo cét ®îc sö dông trong ®iÒu kiÖn kÕt nèi nÕu nh nguån d÷ liÖu cha ®îc s¾p xÕp bëi thao t¸c tríc ®ã.
Oracle sÏ trén hai nguån d÷ liÖu b»ng c¸ch chän ra c¸c cÆp hµng tho¶ m·n ®iÒu kiÖn kÕt nèi vµ ®a chóng vµo tËp c¸c hµng kÕt qu¶.
VÝ dô: SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng=Phßng.M·Phßng;
4.3.KÕt nèi b»ng Cluster
Oracle cã thÓ thùc hiÖn viÖc kÕt nèi ph©n líp víi kÕt nèi b»ng mµ gi÷a hai cét b¶ng n»m trong cïng mét ph©n líp. Trong mét ph©n líp th× c¸c hµng tõ hai b¶ng cã cïng kho¸ ph©n líp sÏ ®îc n»m trong cïng mét khèi, do ®ã Oracle chØ truy nhËp ®Õn c¸c khèi nµy.
VÝ dô: SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng=Phßng.M·Phßng;
4.3. KÕt b»ng sö dông hµm b¨m
Oracle sÏ duyÖt toµn bé c¸c b¶ng vµ chia (b¨m) chóng ra thµnh nhiÒu ®o¹n dùa vµo bé nhí cã s½n.
Oracle x©y dùng mét b¶ng b¨m tõ c¸c ®o¹n nµy (nÕu cã thÓ Oracle sÏ chän mét ®o¹n ®Æt võa vïng bé nhí cã s½n). Oracle sÏ sö dông c¸c ®o¹n t¬ng øng trong mét b¶ng kh¸c ®Ó kh¶o s¸t b¶ng b¨m. C¸c ®o¹n kh¸c mµ kh«ng n»m võa trong bé nhí sÏ ®îc ®Æt trªn ®Üa.
VÝ dô: SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng=Phßng.M·Phßng;
5. C¸c ph¬ng thøc truy nhËp d÷ liÖu
Ph¬ng thøc truy nhËp d÷ liÖu (Acces Path) lµ c¸ch thøc truy nhËp tíi mét hµng cña b¶ng. Díi ®©y lµ b¶ng c¸c ph¬ng thøc truy nhËp s¾p xÕp theo ®é u tiªn cao ®Õn thÊp.
thø tù
|
C¸ch truy nhËp
|
1
|
Chän mét hµng b»ng ROWID
|
2
|
Chän mét hµng b»ng Cluster kÕt nèi
|
3
|
Chän mét hµng b»ng hµm b¨m víi kho¸ duy nhÊt hay kho¸ chÝnh
|
4
|
Chän mét hµng b»ng kho¸ duy nhÊt hay kho¸ chÝnh
|
5
|
Dïng Cluster kÕt nèi
|
6
|
Dïng kho¸ cña hµm b¨m
|
7
|
Dïng kho¸ Index
|
8
|
KÕt hîp c¸c kho¸
|
9
|
Index c¸c cét ®¬n
|
10
|
Giíi h¹n vïng t×m trªn cét ®· Index
|
11
|
Kh«ng giíi h¹n vïng t×m trªn cét ®· Index
|
12
|
S¾p xÕp kÕt nèi b»ng ph¬ng ph¸p trén
|
13
|
MAX hoÆc MIN cña cét ®· Index
|
14
|
ORDER BY trªn c¸c cét Index
|
15
|
DuyÖt toµn bé (Full Table Scan)
|
Oracle chØ cã thÓ chän mét thµnh phÇn truy nhËp trong b¶ng ®· liÖt kª cho mét b¶ng nÕu c©u lÖnh chøa mÖnh ®Ò ®iÒu kiÖn FROM hoÆc nh÷ng cÊu tróc kh¸c lµm cho c¸c c¸ch truy nhËp trë thµnh cã thÓ dïng ®îc.
5.1. Truy nhËp qua ROWID
ROWID lµ ®Þa chØ cña mét hµng cña table trªn ®Üa. Th«ng qua ROWID cã thÓ truy nhËp trùc tiÕp ®Õn hµng ®ã vµ ®©y lµ c¸ch truy nhËp th«ng tin nhanh nhÊt tíi hµng. Ph¬ng ph¸p nµy ®îc sö dông khi trong mÖnh ®Ò FROM cã chøa ROWID hoÆc lµ hµng hiÖn t¹i cña biÕn tËp hîp (CURRENT OF CURSOR).
VÝ dô: SELECT * FROM Nh©nViªn WHERE ROWID = ‘000000DC5.0000.0001’;
5.2. Chän mét hµng b»ng Cluster kÕt nèi
Khi Index trªn trêng kh«ng duy nhÊt gi¸ trÞ th× nhãm c¸c hµng cã cïng gi¸ trÞ kho¸ sÏ cã ROWID chøa trong cïng mét Cluster Index. B»ng c¸ch t×m ROWID trong Cluster Index Oracle sÏ truy nhËp th«ng tin tíi hµng mét c¸ch trùc tiÕp (qua ROWID). Ph¬ng thøc truy nhËp nµy s½n dïng cho c¸c c©u lÖnh mµ nh÷ng table kÕt nèi trong cïng mét Cluster vµ nÕu c¶ hai ®iÒu kiÖn sau cïng ®óng:
-
C©u lÖnh ph¶i cã mÖnh ®Ò FROM chøa ®iÒu kiÖn mµ mçi cét cña Cluster lµ kho¸ cña mét b¶ng kh¸c.
-
MÖnh ®Ò FROM còng ph¶i ®¶m b¶o ®iÒu kiÖn kÕt nèi chØ tr¶ l¹i duy nhÊt mét hµng. Nh÷ng ®iÒu kiÖn nh vËy thêng lµ kho¸ duy nhÊt hoÆc lµ kho¸ chÝnh.
Trong nh÷ng ®iÒu kiÖn ph¶i cã chøa to¸n tö AND ®Ó Oracle cã thÓ x©y dùng thµnh thao t¸c Nested Loops.
VD: Trong b¶ng Nh©nViªn vµ b¶ng Phßng cã chøa cét M·Phßng vµ cét M·Nh©nViªn lµ kho¸ chÝnh cña b¶ng Nh©nViªn.
SELECT * FROM Nh©nViªn, Phßng
WHERE Nh©nViªn.M·Phßng=Phßng.M·Phßng AND Nh©nViªn.M·Nh©nViªn=7900;
5.3. Chän mét hµng b»ng kho¸ b¨m (Hash Key) víi kho¸ duy nhÊt hoÆc kho¸ chÝnh
DuyÖt b¨m (Hash Scans) lµ ph¬ng ph¸p truy nhËp tíi hµng b»ng c¸ch sö dông hµm b¨m (Hash Function). Ph¬ng thøc nµy s½n dïng khi mµ c¶ hai ®iÒu kiÖn sau ®îc tho¶ m·n:
-
C©u lÖnh ph¶i cã mÖnh ®Ò FROM sö dông tÊt c¶ c¸c cét trong kho¸ cña hµm b¨m. MÆt kh¸c ®Ó dïng ®îc kho¸ cña hµm b¨m th× c¸c ®iÒu kiÖn t¬ng øng ph¶i kÕt nèi víi nhau b»ng to¸n tö AND.
-
C©u lÖnh ph¶i ®¶m b¶o chØ tr¶ l¹i mét gi¸ trÞ hµng duy nhÊt bëi v× gi¸ trÞ c¸c cét t¹o thµnh kho¸ cña hµm b¨m còng t¹o ra mét kho¸ duy nhÊt hoÆc lµ kho¸ chÝnh.
§Ó thùc hiÖn c©u lÖnh nµy, Oracle dïng hµm b¨m ®Ó ®Þnh gi¸ trÞ kho¸ b¨m t¬ng øng víi c¸c gi¸ trÞ cung cÊp bëi c©u lÖnh. Gi¸ trÞ kho¸ t×m ®îc sÏ sö dông ®Ó t×m b¶n ghi t¬ng øng trong table.
VÝ dô: Gi¶ sö r»ng trong b¶ng Ho¸§¬n vµ b¶ng NéiDungHo¸§¬n ®îc lu trong mét nhãm hµm b¨m vµ SèHo¸§¬n võa lµ kho¸ chÝnh võa lµ kho¸ hµm b¨m. C©u lÖnh sau sÏ sö dông ph¬ng thøc hµm b¨m.
SELECT * FROM Ho¸§¬n WHERE SèHo¸§¬n = 65118968;
5.4. Chän mét hµng b»ng sö dông kho¸ duy nhÊt hoÆc b»ng kho¸ chÝnh
Ph¬ng thøc nµy chØ dïng ®îc khi c©u lÖnh ph¶i cã mÖnh ®Ò FROM cã sö dông tÊt c¶ c¸c cét cña kho¸ duy nhÊt (hoÆc kho¸ chÝnh) trong ®iÒu kiÖn t¬ng øng. §Ó cã thÓ sö dông ®îc kho¸ th× c¸c ®iÒu kiÖn t¬ng øng víi cét n»m trong kho¸ ph¶i liªn kÕt víi nhau b»ng to¸n tö AND. Th«ng qua b¶ng Index t¬ng øng víi c¸c kho¸ th× Oracle sÏ t×m ®îc ROWID t¬ng øng ®Ó truy nhËp trùc tiÕp tíi hµng.
VD: Gi¶ sö M·Nh©nViªn lµ kho¸ chÝnh cña b¶ng Nh©nViªn, c©u lÖnh sau sÏ sö dông ph¬ng thøc truy nhËp nµy.
SELECT * FROM Nh©nViªn WHERE M·Nh©nViªn = 7900;
5.5. KÕt nèi Cluster (Cluster join)
Ph¬ng thøc nµy s½n dïng khi mµ ®iÒu kiÖn kÕt nèi c¸c b¶ng ®Òu ®îc chøa trong cïng mét nhãm (Cluster) vµ nÕu ®iÒu kiÖn kÕt nèi trong mÖnh ®Ò FROM tho¶ m·n mçi cét trong kÕt nèi lµ kho¸ cña b¶ng nµy vµ lµ cét trong b¶ng kia. Vµ ®Ó sö dông ®îc kho¸ cña kÕt nèi th× c¸c ®iÒu kiÖn ph¶i nèi víi nhau bëi to¸n tö AND. Lóc ®ã Oracle sÏ tiÕn hµnh hoµn thµnh c©u lÖnh Nested-Loop.
VD: SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng = Phßng.M·Phßng;
5.6. Kho¸ cña c¸c hµng cã cïng gi¸ trÞ b¨m
C©u lÖnh ph¶i cã mÖnh ®Ò FROM sö dông tÊt c¶ c¸c cét trong kho¸ cña hµm b¨m. MÆt kh¸c ®Ó dïng ®îc kho¸ cña hµm b¨m th× c¸c ®iÒu kiÖn t¬ng øng ph¶i kÕt nèi víi nhau b»ng to¸n tö AND. Oracle sÏ tiÕn hµnh duyÖt b¶ng dùa trªn kho¸ hµm b¨m t×m ®îc.
VD: Gi¶ sö r»ng trong b¶ng Ho¸§¬n vµ b¶ng NéiDungHo¸§¬n ®îc lu trong mét nhãm hµm b¨m vµ SèHo¸§¬n võa lµ kho¸ chÝnh võa lµ kho¸ hµm b¨m. C©u lÖnh sau sÏ sö dông ph¬ng thøc hµm b¨m.
SELECT * FROM NéiDungHo¸§¬n WHERE SèHo¸§¬n = 65118968;
5.7. Kho¸ cña c¸c hµng cã cïng gi¸ trÞ Index
Khi mµ c¸c b¶ng ®îc Index th× cïng víi gi¸ trÞ cña trêng Index cßn cã c¸c ROWID. NÕu c©u lÖnh chØ sö dông gi¸ trÞ c¸c trêng Index th× c¸c gi¸ trÞ nµy sÏ ®îc lÊy trùc tiÕp tõ b¶ng Index thay v× lÊy tõ b¶ng d÷ liÖu cßn trong trêng hîp lµ c¸c gi¸ trÞ kh¸c th× sÏ truy nhËp ROWID t×m ®îc tõ b¶ng Index.
VD: Gi¶ sö trong b¶ng Nh©nViªn th× M·Phßng ®· ®îc Index.
SELECT * FROM Nh©nViªn WHERE M·Phßng=10;
5.8. Index phèi hîp
Khi cã c©u lÖnh cã sö dông nhiÒu cét ®îc Index phèi hîp vµ trong mÖnh ®Ò FROM vµ c¸c ®iÒu kiÖn nµy ®îc liªn kÕt víi nhau b»ng to¸n tö AND. Oracle sÏ tiÕn hµnh duyÖt trªn c¸c vïng Index ®Ó t×m ra c¸c ROWID , tõ ®ã cã thÓ truy nhËp ®Õn c¸c hµng t¬ng øng.
VD: Gi¶ sö cét NghÒ vµ M·Phßng ®îc Index phèi hîp. C©u lÖnh sau sÏ sö dông Index phèi hîp.
SELECT * FROM Nh©nViªn WHERE NghÒ = 'Th kÝ' AND M·Phßng = 10;
5.9. Sö dông Index ®¬n
Khi c©u lÖnh sö dông c¸c cét cña Index ®¬n th× Oracle sÏ tiÕn hµnh t×m ra c¸c ROWID truy nhËp ®Õn c¸c hµng t¬ng øng.
VD: Gi¶ sö trong b¶ng Nh©nViªn cét NghÒ ®· ®îc Index.
SELECT * FROM Nh©nViªn WHERE NghÒ = 'Th kÝ';
NÕu nh c©u lÖnh cã sö dông nhiÒu cét Index ®¬n th× Oracle sÏ lÊy giao cña tËp hîp c¸c ROWID nhËn ®îc khi duyÖt c¸c Index theo ®iÒu kiÖn. Tõ tËp hîp chung nµy Oracle míi tiÕn hµnh truy nhËp ®Õn c¸c hµng t¬ng øng.
VD: Trong b¶ng Nh©nViªn th× cét NghÒ vµ M·Phßng ®îc Index ®¬n.
SELECT * FROM Nh©nViªn WHERE NghÒ = 'Ph©n tÝch viªn' AND M·Phßng = 20;
5.10. Giíi h¹n tËp hîp Index (Index Range Scan)
Ph¬ng thøc nµy ®îc sö dông khi trong c©u lÖnh cã chøa ®iÒu kiÖn giíi h¹n c¸c Index ®¬n hoÆc thµnh phÇn ®øng tríc trong Index nhiÒu cét cã d¹ng nh sau
=
>[=] AND <[=]
BETWEEN AND
LIKE 'c%'
NÕu nh c©u lÖnh cã tham chiÕu tíi cét Index th× ph¬ng thøc truy nhËp nµy kh«ng ®îc sö dông.
VD: Gi¶ sö cét L¬ng trong b¶ng Nh©nViªn lµ mét Index, c¸c c©u lÖnh sau sÏ sö dông ph¬ng thøc duyÖt dùa trªn giíi h¹n cña Index.
SELECT * FROM Nh©nViªn WHERE L¬ng BETWEEN 2000 AND 3000;
SELECT * FROM Nh©nViªn WHERE TªnNh©nViªn LIKE 'S%';
5.11. Kh«ng giíi h¹n vïng Index
Ph¬ng thøc nµy cã thÓ ®îc sö dông khi trong c©u lÖnh cã chøa ®iÒu kiÖn giíi h¹n c¸c Index ®¬n hoÆc thµnh phÇn ®øng tríc trong Index nhiÒu cét cã d¹ng nh sau
>[=]
<[=]
Trong trêng hîp nµy vïng Index bÞ giíi h¹n vÒ mét phÝa (chÆn trªn hoÆc chÆn díi).
VÝ dô trong trêng hîp Index ®¬n:
SELECT * FROM Nh©nViªn WHERE L¬ng > 2000;
VÝ dô trong trêng hîp Index trªn nhiÒu trêng:
Gi¶ sö cã Index trªn M·Ho¸§¬n vµ DßngHo¸§¬n cña b¶ng NéiDungHo¸§¬n.
SELECT * FROM NéiDungHo¸§¬n WHERE M·Ho¸§¬n > 65118968;
Do M·Ho¸§¬n lµ phÇn ®øng tríc trong Index nhiÒu cét nªn ph¬ng thøc truy nhËp nµy ®îc sö dông. Tuy nhiªn c©u lÖnh sau ®©y v× DßngHo¸§¬n lµ thµnh phÇn ®øng sau trong Index nhiÒu cét nªn ph¬ng thøc truy nhËp nµy kh«ng ®îc sö dông.
SELECT * FROM NéiDungHo¸§¬n WHERE DßngHo¸§¬n <4;
5.12. S¾p xÕp kÕt nèi
NÕu c©u lÖnh ®ßi hái kÕt nèi gi÷a c¸c b¶ng trong cïng mét nhãm hoÆc nÕu ®iÒu kiÖn trong mÖnh ®Ò FROM sö dông mét cét tõ mét b¶ng kh¸c trong ®iÒu kiÖn t¬ng øng. Oracle còng cã thÓ sö c©u lÖnh SELECT ®Ö qui ®Ó thùc hiÖn c©u lÖnh kÕt nèi.
VD khi b¶ng Nh©nViªn vµ b¶ng Phßng kh«ng n»m trong cïng mét Cluster.
SELECT * FROM Nh©nViªn, Phßng WHERE Nh©nViªn.M·Phßng = Phßng.M·Phßng;
5.13. MAX hoÆc MIN cña cét Index
Ph¬ng thøc nµy cã thÓ ®îc dïng nÕu c¸c ®iÒu kiÖn sau tho¶ m·n
-
C©u lÖnh sö dông hµm MAX hoÆc MIN ®Ó chän gi¸ trÞ cña c¸c cét Index ®¬n hoÆc c¸c cét lµ phÇn ®Çu cña Index phøc. C¸c kiÓu Index nµy kh«ng ®îc phÐp lµ Cluster Index (chØ môc ph©n líp)
-
Kh«ng cã biÓu thøc kh¸c trong danh s¸ch chän
-
C©u lÖnh kh«ng chøa mÖnh ®Ò FROM hay mÖnh ®Ò GROUP BY.
Oracle sÏ tiÕn hµnh thùc hiÖn t×m cã khoanh vïng ®èi víi Index ®Ó t×m gi¸ trÞ MAX hoÆc MIN. Khi mµ chØ cã gi¸ trÞ ®îc chän th× Oracle còng kh«ng cÇn thiÕt truy xuÊt ®Õn b¶ng d÷ liÖu n÷a.
5.14. MÖnh ®Ò ORDER BY trªn c¸c cét ®· Index
Ph¬ng thøc truy nhËp nµy ®îc thùc hiÖn khi mµ c¸c ®iÒu kiÖn sau tho¶ m·n:
-
C©u lÖnh chøa mÖnh ®Ò ORDER BY sö dông cét Index ®¬n hoÆc phÇn ®Çu trong Index phøc. KiÓu Index nµy kh«ng thÓ lµ mét Cluster Index.
-
§¶m b¶o ph¶i cã Ýt nhÊt mét cét lµ kho¸ chÝnh hoÆc cét cã gi¸ trÞ NOT NULL trong c¸c cét cã mÆt ë mÖnh ®Ò ORDER BY.
-
Tham sè NSL_SORT ®îc ®Æt gi¸ trÞ lµ BINARY.
Oracle sÏ thùc hiÖn läc ra vïng t×m kiÕm trong Index ®Ó lÊy ra c¸c ROWID råi truy nhËp b»ng ROWID.
VD: Gi¶ sö M·Nh©nViªn lµ kho¸ chÝnh cña b¶ng nh©n viªn.
SELECT * FROM Nh©nViªn ORDER BY M·Nh©nViªn;
5.15. DuyÖt toµn bé
BÊt k× c©u lÖnh nµo còng cã thÓ sö dông ph¬ng thøc truy nhËp nµy mµ kh«ng cÇn quan t©m ®Õn ®iÒu kiÖn sau mÖnh ®Ò WHERE.
VD: SELECT * FROM Nh©nViªn;
Chó ý: C¸c ®iÒu kiÖn sau còng kh«ng t¹o ra ph¬ng thøc truy nhËp b»ng Index.
trong ®ã cét 1 vµ cét 2 lµ cïng mét b¶ng.
-
IS NULL
-
IS NOT NULL
-
NOT IN
-
!=
-
LIKE '%mÉu'
trong ®ã bÊt kÓ lµ cét ®· ®îc Index.
biÓu thøc ë ®©y lµ mét cét víi mét to¸n tö hoÆc mét cét kh¸c bÊt chÊp viÖc cét ®· ®îc Index.
-
NOT EXISTS subquery
-
BÊt k× ®iÒu kiÖn nµo ®èi víi mét cét cha ®îc Index.
C¸c c©u lÖnh cã chøa cÊu tróc nh vËy vµ kh«ng cã cÊu tróc kh¸c ®Ó cã thÓ t¹o ph¬ng thøc truy nhËp b»ng Index th× buéc ph¶i duyÖt toµn bé.
6. C¸c luËt tèi u
Cã hai luËt tèi u trong Oracle lµ luËt tèi u c¬ b¶n vµ luËt tèi u íc lîng gi¸.
6.1. LuËt tèi u c¬ b¶n (rule-based)
Néi dung c¬ b¶n cña luËt nµy lµ chän ra c¸ch thøc truy nhËp tíi hµng dùa trªn møc ®é u tiªn cña c¸c ph¬ng thøc.
Tríc tiªn Oracle sÏ kiÓm tra ®iÒu kiÖn sau mÖnh ®Ò WHERE cña c©u lÖnh ®Ó x¸c ®Þnh nh÷ng ph¬ng thøc nµo c©u lÖnh cã thÓ sö dông ®îc. TiÕp ®ã Oracle sÏ tiÕn hµnh chän ra ph¬ng thøc cã sè thø tù thÊp nhÊt trong b¶ng c¸c ph¬ng thøc. Chó ý r»ng ph¬ng thøc duyÖt toµn bé lµ ph¬ng thøc ®øng cuèi b¶ng cho nªn Oracle sÏ chän ph¬ng thøc truy nhËp cã Index nÕu cã cho dï duyÖt toµn bé cã thÓ nhanh h¬n vµ thø tù c¸c ®iÒu kiÖn trong mÖnh ®Ò WHERE nãi chung sÏ kh«ng ¶nh hëng tíi c¸ch chän ph¬ng thøc truy nhËp.
Gi¶ sö cã b¶ng Nh©nViªn cã nh÷ng rµng buéc sau:
+ Kho¸ chÝnh lµ M·Nh©nViªn vµ Index t¬ng øng lµ PK_MANHANVIEN.
+Cã Index tªn lµ TENNHANVIEN_IND trªn cét TªnNh©nViªn.
+Cã Index tªn lµ LUONG_IND trªn cét L¬ng.
§Ó chän ra nh÷ng m· nh©n viªn cã tªn lµ 'CHUNG' vµ cã l¬ng > 2000 b»ng c©u lÖnh sau:
SELECT M·Nh©nViªn FROM Nh©nViªn WHERE TªnNh©nViªn='CHUNG' AND L¬ng>2000;
Dùa vµo c¸c ®iÒu kiÖn trong mÖnh ®Ò WHERE cña c©u lÖnh SQL vµ c¸c rµng buéc, c¸c Index th× c¸c ph¬ng truy nhËp sau cã thÓ dïng ®îc:
+ Chän ra mét hµng b»ng Index khi sö dông TENNHANVIEN_IND do ®iÒu kiÖn TªnNh©nViªn='CHUNG'. Ph¬ng thøc nµy cã sè thø tù lµ 9.
+ DuyÖt Index kh«ng bÞ giíi h¹n khi sö dông LUONG_IND. Ph¬ng thøc nµy cã sè thø tù lµ 11.
+ DuyÖt toµn bé do ph¬ng thøc nµy s½n dïng cho mäi b¶ng.
Theo luËt tèi u Rule-based th× Oracle sÏ tiÕn hµnh truy nhËp theo ph¬ng ph¸p sö dông Index TENNHANVIEN_IND.
6.2. LuËt tèi u íc lîng gi¸ (Cost-based)
Mçi c¸ch truy nhËp khi thi hµnh sÏ t¬ng øng mét ph©n tÝch cã “gi¸” (cost) nµo ®ã, gi¸ nµy x¸c ®Þnh dùa trªn tµi nguyªn m¸y tÝnh nh truy xuÊt I/O, thêi gian CPU, bé nhí ...
Néi dung c¬ b¶n cña luËt nµy lµ chän ra c¸ch thùc hiÖn c©u lÖnh mµ ph¶i tr¶ gi¸ Ýt nhÊt dùa trªn c¸c th«ng tin vÒ tr¹ng th¸i cña hÖ thèng vµ cña d÷ liÖu. C¸c th«ng tin vÒ tr¹ng th¸i cã thÓ t×m thÊy trong tõ ®iÓn d÷ liÖu vµ thêng sÏ quan t©m ®Õn c¸c th«ng tin sau:
-
§é lín cña quan hÖ R: UR.
-
Sè lîng gi¸ trÞ thuéc tÝnh A trong quan hÖ R: U(A,R).
-
Sè lîng c¸c trang bé nhí ®Ó chøa quan hÖ R cßn rçi: PR.
-
Sè lîng dßng (row) t¬ng øng víi mét trang 1 trang: bR.
-
Sè lîng c¸c trang bé nhí RAM vËt lý cßn rçi: M
-
Møc Index thuéc tÝnh trong quan hÖ R, ®èi víi CSDL Oracle lµ “B-Tree”
Tríc tiªn Oracle sÏ x¸c ®Þnh c¸ch thøc truy nhËp nµo cã thÓ dïng ®îc b»ng c¸ch kiÓm tra ®iÒu kiÖn trong mÖnh ®Ò WHERE. TiÕp ®ã Oracle sÏ ®Þnh gi¸ mçi c¸ch truy nhËp dùa trªn ®Æc ®iÓm cña d÷ liÖu nh tr¹ng th¸i Storage, c¸c Table, c¸c Index, Cluster trong tõ ®iÓn d÷ liÖu (Data Dictionary).
Bé tèi u ho¸ còng quan t©m ®Õn c¸c nh©n tè sau ®©y khi chän ph¬ng thøc truy nhËp:
-
TÝnh chän läc: lµ sè phÇn tr¨m c¸c hµng ®îc chän ra trong b¶ng bëi c©u lÖnh. NÕu nh c©u lÖnh chän ra mét sè phÇn tr¨m nhá cña b¶ng th× ®îc gäi lµ tÝnh chän läc cao, cßn nÕu c©u lÖnh chän ra mét sè lîng hµng lín tõ b¶ng th× ®îc gäi lµ tÝnh chän läc thÊp.
Oracle thêng chän ra ®îc c¸ch truy nhËp chÝnh x¸c cho c¸c c©u lÖnh cã tÝnh chän läc cao h¬n lµ nh÷ng c©u lÖnh cã tÝnh chän läc thÊp. Th«ng thêng th× nh÷ng c¸ch truy nhËp th«ng qua Index lµ nhanh ®èi víi c¸c c©u lÖnh cã tÝnh chän läc cao, tuy nhiªn ph¬ng thøc duyÖt toµn bé l¹i thùc hiÖn nhanh h¬n ®èi víi c©u lÖnh cã tÝnh chän läc thÊp.
TÝnh chän läc cña mét c©u lÖnh ®îc x¸c ®Þnh th«ng qua c¸c ®iÒu kiÖn sau:
-
C¸c to¸n tö ®îc sö dông trong mÖnh ®Ò WHERE
-
Kho¸ duy nhÊt hoÆc kho¸ chÝnh ®îc sö dông trong mÖnh ®Ò WHERE
-
Tr¹ng th¸i cña c¸c b¶ng
Nh÷ng vÝ dô trong phÇn minh ho¹ sÏ lµm râ c¸ch thøc sö dông tÝnh chän läc.
-
Tham sè DB_FILE_MULTIBLOCK_READ_COUNT: DuyÖt toµn bé thêng sö dông ®äc ®a khèi (multi-block), v× vËy gi¸ ph¶i tr¶ víi duyÖt toµn bé lµ sè lîng cña ®a khèi cÇn ®äc, ®ßi hái ®Ó ®äc toµn bé b¶ng tøc lµ sè c¸c khèi ®¬n ®Ó ®äc t¬ng øng víi mét ®a khèi mµ gi¸ trÞ nµy ®îc x¸c ®Þnh bëi tham sè DB_FILE_MULTIBLOCK_READ_COUNT. V× lý do ®ã nªn Oracle thêng chän duyÖt toµn bé khi mµ gi¸ trÞ cña tham sè nµy cao.
VD: C©u lÖnh sau sö dông ®iÒu kiÖn b»ng trong mÖnh ®Ò WHERE ®Ó chän ra tÊt c¶ nh÷ng nh©n viªn cã tªn lµ Chung:
SELECT * FROM Nh©nViªn WHERE TªnNh©nViªn='Chung';
NÕu TªnNh©nViªn lµ mét kho¸ duy nhÊt hay lµ mét kho¸ chÝnh th× Oracle sÏ x¸c ®Þnh ®îc chØ cã mét hµng cã TªnNh©nViªn lµ Chung vµ c©u lÖnh còng chØ tr¶ l¹i cã mét hµng do ®ã Oracle rÊt chÝnh x¸c khi chän ph¬ng thøc truy nhËp duyÖt gi¸ trÞ duy nhÊt trªn Index rµng buéc bëi kho¸ duy nhÊt hay kho¸ chÝnh (ph¬ng thøc nµy cã sè thø tù trong b¶ng lµ 4).
Quay trë l¹i vÝ dô trªn, nÕu nh TªnNh©nViªn kh«ng ph¶i lµ mét kho¸ duy nhÊt hay lµ mét kho¸ chÝnh th× Oracle cã thÓ ®¸nh gi¸ tÝnh chän läc cña c©u lÖnh dùa trªn th«ng tin tõ:
-
Tham sè USER_TAB_COLUMNS.NUM_DISTINCT: Sè lîng tËp gi¸ trÞ kh¸c nhau cho mçi cét.
-
Tham sè USER_TABLES.NUM_ROWS: Sè lîng cét trong mçi b¶ng.
B»ng c¸ch chia sè lîng hµng cña b¶ng Nh©nViªn cho sè lîng c¸c gi¸ trÞ kh¸c nhau cña cét TªnNh©nViªn, Oracle sÏ íc lîng ®îc sè nh©n viªn cïng tªn. Víi gi¶ thiÕt c¸c gi¸ trÞ cña tªn nh©n viªn lµ ®ång ®Òu nªn Oracle sö dông sè phÇn tr¨m nµy ®Ó x¸c ®Þnh tÝnh chän läc cña c©u lÖnh.
VÝ dô 1: SELECT * FROM Nh©nViªn WHERE M·Nh©nViªn < 7500;
§Ó ®¸nh gi¸ tÝnh chän läc cña c©u lÖnh, Oracle lÊy gi¸ trÞ giíi h¹n lµ 7500 tõ c©u lÖnh kÕt hîp víi gi¸ trÞ HIGH_VALUE vµ LOW_VALUE øng víi cét M·Nh©nViªn trong USER_TAB_COLUMNS View. Oracle gi¶ sö r»ng mäi gi¸ trÞ cña M·Nh©nViªn ®îc ph©n bè ®Òu gi÷a gi¸ trÞ cao nhÊt vµ gi¸ trÞ thÊp nhÊt do ®ã sÏ íc lîng ®îc sè phÇn tr¨m hµng ®îc lÊy ra (còng nh ®¸nh gi¸ ®îc tÝnh chän läc cña c©u lÖnh).
VÝ dô 2: SELECT * FROM Nh©nViªn WHERE M·Nh©nViªn < :e1;
Bé tèi u ho¸ kh«ng biÕt gi¸ trÞ cña biÕn côc bé e1. Thùc tÕ th× gi¸ trÞ cña e1 cã thÓ kh¸c nhau víi mçi lÇn thùc hiÖn c©u lÖnh. ChÝnh v× lý do nµy mµ Oracle cã thÓ sö dông c¸ch thøc ®· m« t¶ ë vÝ dô trªn ®Ó x¸c ®Þnh tÝnh chän läc cña c©u lÖnh. Trong trêng hîp nµy Oracle ®a ra pháng ®o¸n lµ gi¸ cét nhËn gi¸ trÞ nhá ®Ó x¸c ®Þnh tÝnh chän läc (bëi v× cét ®îc Index).
SELECT * FROM Nh©nViªn WHERE M·Nh©nViªn>=7500 AND M·Nh©nViªn<=7800;
Oracle sÏ ®¸nh gi¸ tÝnh chän läc dùa vµo hai c©u lÖnh cã ®iÒu kiÖn sau:
M·Nh©nViªn>=7500 cã tÝnh chän läc lµ S1
M·Nh©nViªn<=7800 cã tÝnh chän läc lµ S2
VËy c©u lÖnh ban ®Çu cã tÝnh chän läc lµ S:
S=ABS(S1+S2-1)
Chia sẻ với bạn bè của bạn: |