成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Oracle優(yōu)化中所用到的語(yǔ)句有哪些

數(shù)據(jù)庫(kù) Oracle
以下的文章主要描述的是Oracle優(yōu)化的查詢,本文章主要是通過實(shí)際操作代碼的示例還有相關(guān)實(shí)例的解析的方式來(lái)說(shuō)明其原理。

我們今天是要和大家一起討論的是Oracle優(yōu)化的查詢,我前兩天在相關(guān)網(wǎng)站看見的資料,覺得挺好,就拿出來(lái)供大家分享。如果你對(duì)Oracle優(yōu)化的查詢,心存好奇的話,以下的文章將會(huì)揭開它的神秘面紗。

假設(shè)LARGE_TABLE是一個(gè)較大的表,且username列上沒有索引,則運(yùn)行下面的語(yǔ)句:

  1. SQL> SELECT * FROM LARGE_TABLE where USERNAME = ‘TEST';   
  2. Query Plan   
  3. SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14)   
  4. TABLE ACCESS FULL LARGE_TABLE [:Q65001] [ANALYZED] 

在這個(gè)例子中,TABLE ACCESS FULL LARGE_TABLE是***個(gè)操作,意思是在LARGE_TABLE表上做全表掃描。當(dāng)這個(gè)操作完成之后,產(chǎn)生的row source中的數(shù)據(jù)被送往下一步驟進(jìn)行處理,在此例中,SELECT STATEMENT操作是這個(gè)查詢語(yǔ)句的***一步。

Optimizer=CHOOSE 指明這個(gè)查詢的optimizer_mode,即optimizer_mode初始化參數(shù)指定的值,它并不是指語(yǔ)句執(zhí)行時(shí)真的使用了該優(yōu)化器。決定該語(yǔ)句使用何種優(yōu)化器的唯一方法是看后面的cost部分。例如,如果給出的是下面的形式,則表明使用的是CBO優(yōu)化器,此處的cost表示Oracle優(yōu)化器認(rèn)為該執(zhí)行計(jì)劃的代價(jià):

 

  1. SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14

然而假如執(zhí)行計(jì)劃中給出的是類似下面的信息,則表明是使用RBO優(yōu)化器,因?yàn)閏ost部分的值為空,或者壓根就沒有cost部分。

  1. SELECT STATEMENT Optimizer=CHOOSE Cost=   
  2. SELECT STATEMENT Optimizer=CHOOSE 

這樣我們從Optimizer后面的信息中可以得出執(zhí)行該語(yǔ)句時(shí)到底用了什么樣的Oracle優(yōu)化器。特別的,如果Optimizer=ALL_ROWS| FIRST_ROWS| FIRST_ROWS_n,則使用的是CBO優(yōu)化器;如果Optimizer=RULE,則使用的是RBO優(yōu)化器。

cost屬性的值是一個(gè)在Oracle內(nèi)部用來(lái)比較各個(gè)執(zhí)行計(jì)劃所耗費(fèi)的代價(jià)的值,從而使優(yōu)化器可以選擇***的執(zhí)行計(jì)劃。不同語(yǔ)句的cost值不具有可比性,只能對(duì)同一個(gè)語(yǔ)句的不同執(zhí)行計(jì)劃的cost值進(jìn)行比較。

[:Q65001] 表明該部分查詢是以并行方式運(yùn)行的。里面的數(shù)據(jù)表示這個(gè)操作是由并行查詢的一個(gè)slave進(jìn)程處理的,以便該操作可以區(qū)別于串行執(zhí)行的操作。

[ANALYZED] 表明操作中引用的對(duì)象被分析過了,在數(shù)據(jù)字典中有該對(duì)象的統(tǒng)計(jì)信息可以供CBO使用。

例2:

假定A、B、C都是不是小表,且在A表上一個(gè)組合索引:A(a.col1,a.col2) ,注意a.col1列為索引的引導(dǎo)列。考慮下面的查詢:

  1. select A.col4   
  2. from A , B , C   
  3. where B.col3 = 10 and A.col1 = B.col1 and A.col2 = C.col2 and C.col3 = 5   
  4. Execution Plan   
  5. SELECT STATEMENT Optimizer=CHOOSE   
  6. MERGE JOIN   
  7. SORT (JOIN)   
  8. NESTED LOOPS   
  9. TABLE ACCESS (FULL) OF 'B'   
  10. TABLE ACCESS (BY INDEX ROWID) OF 'A'   
  11. INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)   
  12. SORT (JOIN)   
  13. TABLE ACCESS (FULL) OF 'C'   
  14. Statistics   
  15. 0 recursive calls   
  16. 8 db block gets   
  17. 6 consistent gets   
  18. 0 physical reads   
  19. 0 redo size   
  20. 551  bytes sent via SQL*Net to client   
  21. 430  bytes received via SQL*Net from client   
  22. 2 SQL*Net roundtrips to/from client   
  23. 2 sorts (memory)   
  24. 0 sorts (disk)   
  25. 6 rows processed  

 

在表做連接時(shí),只能2個(gè)表先做連接,然后將連接后的結(jié)果作為一個(gè)row source,與剩下的表做連接,在上面的例子中,連接順序?yàn)锽與A先連接,然后再與C連接:
B  <--->  A  <--->  C
col3=10  col3=5

如果沒有執(zhí)行計(jì)劃,分析一下,上面的3個(gè)表應(yīng)該拿哪一個(gè)作為***個(gè)驅(qū)動(dòng)表?從SQL語(yǔ)句看來(lái),只有B表與C表上有限制條件,所以***個(gè)驅(qū)動(dòng)表應(yīng)該為這2個(gè)表中的一個(gè),到底是哪一個(gè)呢?

B表有謂詞B.col3 = 10,這樣在對(duì)B表做全表掃描的時(shí)候就將where子句中的限制條件(B.col3 = 10)用上,從而得到一個(gè)較小的row source, 所以B表應(yīng)該作為***個(gè)驅(qū)動(dòng)表。而且這樣的話,如果再與A表做關(guān)聯(lián),可以有效利用A表的索引(因?yàn)锳表的col1列為leading column)。

當(dāng)然上面的查詢中C表上也有謂詞(C.col3 = 5),有人可能認(rèn)為C表作為***個(gè)驅(qū)動(dòng)表也能獲得較好的性能。讓我們?cè)賮?lái)分析一下:如果C表作為***個(gè)驅(qū)動(dòng)表,則能保證驅(qū)動(dòng)表生成很小的row source,但是看看連接條件A.col2 = C.col2,此時(shí)就沒有機(jī)會(huì)利用A表的索引,因?yàn)锳表的col2列不為leading column,這樣nested loop的效率很差,從而導(dǎo)致查詢的效率很差。所以對(duì)于NL連接選擇正確的驅(qū)動(dòng)表很重要。

因此上面查詢比較好的連接順序?yàn)?B - - > A) - - > C。如果數(shù)據(jù)庫(kù)是基于代價(jià)的Oracle優(yōu)化器,它會(huì)利用計(jì)算出的代價(jià)來(lái)決定合適的驅(qū)動(dòng)表與合適的連接順序。一般來(lái)說(shuō),CBO都會(huì)選擇正確的連接順序,如果CBO選擇了比較差的連接順序,我們還可以使用Oracle提供的hints來(lái)讓CBO采用正確的連接順序。如下所示:

 

  1. select /*+ ordered */ A.col4   
  2. from B,A,C   
  3. where B.col3 = 10   
  4. and A.col1 = B.col1   
  5. and A.col2 = C.col2   
  6. and C.col3 = 5 

既然選擇正確的驅(qū)動(dòng)表這么重要,那么讓我們來(lái)看一下執(zhí)行計(jì)劃,到底各個(gè)表之間是如何關(guān)聯(lián)的,從而得到執(zhí)行計(jì)劃中哪個(gè)表應(yīng)該為驅(qū)動(dòng)表:在執(zhí)行計(jì)劃中,需要知道哪個(gè)操作是先執(zhí)行的,哪個(gè)操作是后執(zhí)行的,這對(duì)于判斷哪個(gè)表為驅(qū)動(dòng)表有用處。

判斷之前,如果對(duì)表的訪問是通過rowid,且該rowid的值是從索引掃描中得來(lái)得,則將該索引掃描先從執(zhí)行計(jì)劃中暫時(shí)去掉。然后在執(zhí)行計(jì)劃剩下的部分中,判斷執(zhí)行順序的指導(dǎo)原則就是:最右、最上的操作先執(zhí)行。具體解釋如下:

得到去除妨礙判斷的索引掃描后的執(zhí)行計(jì)劃:

  1. Execution Plan  
  2. SELECT STATEMENT Optimizer=CHOOSE   
  3. MERGE JOIN   
  4. SORT (JOIN)   
  5. NESTED LOOPS   
  6. TABLE ACCESS (FULL) OF 'B'   
  7. TABLE ACCESS (BY INDEX ROWID) OF 'A'   
  8. SORT (JOIN)   
  9. TABLE ACCESS (FULL) OF 'C'  
  10.  

 

看執(zhí)行計(jì)劃的第3列,即字母部分,每列值的左面有空格作為縮進(jìn)字符。在該列值左邊的空格越多,說(shuō)明該列值的縮進(jìn)越多,該列值也越靠右。如上面的執(zhí)行計(jì)劃所示:***列值為6的行的縮進(jìn)最多,即該行最靠右;***列值為4、5的行的縮進(jìn)一樣,其靠右的程度也一樣,但是***列值為4的行比***列值為5的行靠上;談?wù)撋舷玛P(guān)系時(shí),只對(duì)連續(xù)的、縮進(jìn)一致的行有效。

從這個(gè)圖中我們可以看到,對(duì)于NESTED LOOPS部分,最右、最上的操作是TABLE ACCESS (FULL) OF 'B',所以這一操作先執(zhí)行,所以該操作對(duì)應(yīng)的B表為***個(gè)驅(qū)動(dòng)表(外部表),自然,A表就為內(nèi)部表了。

從圖中還可以看出,B與A表做嵌套循環(huán)后生成了新的row source ,對(duì)該row source進(jìn)行來(lái)排序后,與C表對(duì)應(yīng)的排序了的row source(應(yīng)用了C.col3 = 5限制條件)進(jìn)行MSJ連接操作。所以從上面可以得出如下事實(shí):B表先與A表做嵌套循環(huán),然后將生成的row source與C表做排序—合并連接。

上述的相關(guān)內(nèi)容就是對(duì)Oracle優(yōu)化查詢的描述,希望會(huì)給你帶來(lái)一些幫助在此方面。

文章出自:http://www.programbbs.com/doc/5047.htm

【編輯推薦】

  1. OraclePL編程語(yǔ)言的優(yōu)點(diǎn)介紹
  2. Oracle導(dǎo)出某些用戶中所有表的實(shí)際操作方法
  3. 不為人知的Oracle控制文件重建
  4. Oracle數(shù)據(jù)庫(kù)的四種基本的啟動(dòng)方式
  5. 如何配置Oracle數(shù)據(jù)庫(kù)
責(zé)任編輯:佚名 來(lái)源: programbbs
相關(guān)推薦

2010-05-05 10:37:40

Oracle優(yōu)化查詢

2010-04-27 09:38:57

Oracle修改表ow

2010-05-12 10:17:59

MySQL數(shù)據(jù)庫(kù)優(yōu)化

2010-05-10 18:38:08

Oracle分頁(yè)語(yǔ)句

2017-08-07 15:52:33

Oracleonnect by優(yōu)化

2010-04-13 15:04:16

Oracle優(yōu)化

2010-05-05 09:33:46

Oracle事務(wù)

2010-03-29 13:33:27

Oracle模式

2011-08-11 17:17:56

Java

2009-01-04 17:41:07

2010-04-20 15:58:15

Oracle 語(yǔ)句

2009-03-04 09:06:56

優(yōu)化sqlOracle

2010-04-27 10:32:54

Oracle優(yōu)化CPU

2010-04-15 10:34:16

Oracle程序開發(fā)

2012-11-14 11:07:24

網(wǎng)絡(luò)優(yōu)化

2010-06-03 09:39:24

優(yōu)化MySQL性能

2010-06-13 15:42:37

MySQL性能優(yōu)化

2010-04-12 10:53:07

Oracle SQL

2010-04-26 14:32:21

Oracle SQL

2010-03-26 11:34:02

Boost.Pytho
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天堂一区二区三区 | 91五月婷蜜桃综合 | 粉嫩av| 国产分类视频 | 国产一级视频在线播放 | 免费中文字幕日韩欧美 | 日韩一区二区在线视频 | 欧美日韩久久久 | 欧美激情综合 | 综合五月婷 | 亚洲一区二区三 | 久久国产一区二区 | 久久成人免费 | 亚洲九色| 久久亚洲免费 | 久久婷婷国产麻豆91 | 欧美高清一区 | 一区二区三区小视频 | 国产免费一区 | 国产精品久久久久久久久久久久午夜片 | 成年免费大片黄在线观看一级 | 午夜精品一区二区三区在线观看 | 久久精品国产亚洲一区二区 | 91 在线 | 99reav| 97久久精品午夜一区二区 | av免费网 | 97色综合 | 青青草免费在线视频 | 日韩国产欧美在线观看 | 欧美a视频| 久久国产高清视频 | 久久精品1 | 亚洲综合天堂网 | 久久区二区 | 亚洲一区精品视频 | 亚洲精品乱码久久久久久久久久 | 超碰地址 | 逼逼网 | 久久国产一区二区三区 | 免费人成激情视频在线观看冫 |