®¹i häc quèc gia hµ néi Tr­êng §¹i Häc Khoa Häc Tù Nhiªn Khoa c ng nghÖ Th ng tin


Ch­¬ng III Ph­¬ng ph¸p tèi ­u ho¸ trong HÖ CSDL Oracle



tải về 0.52 Mb.
trang4/8
Chuyển đổi dữ liệu10.08.2016
Kích0.52 Mb.
#16975
1   2   3   4   5   6   7   8

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 nh­ng trong thùc tÕ ph¶i bá c¸c dÊu tiÕng ViÖt ®i bëi v× Oracle ch­a 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¶ nh­ng 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­ l­u 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 l­u 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 l­u 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 nh­ng 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



KV1

102

Nam

KV2

103

Nam

KV3

104



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 l­u 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 l­u 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 l­u 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 l­u 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 l­u 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.

4. C¸c kiÓu kÕt nèi trong Oracle


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 ch­a ®­î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 l­u 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 l­u 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 ch­a ®­î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)



tải về 0.52 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6   7   8




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương