<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    [摘錄]Oracle數(shù)據(jù)庫執(zhí)行計劃的一些基本概念 (1)


    摘錄地址:http://www.pcdog.com/edu/oracle/2006/11/b174439.html

    一.相關的概念

    Rowid的概念:rowid是一個偽列,既然是偽列,那么這個列就不是用戶定義,而是系統(tǒng)自己給加上的。對每個表都有一個rowid的偽列,但是表中并不物理存儲ROWID列的值。 不過你可以像使用其它列那樣使用它,但是不能刪除改列,也不能對該列的值進行修改、插入。一旦一行數(shù)據(jù)插入數(shù)據(jù)庫,則rowid在該行的生命周期內是唯一的,即即使該行產(chǎn)生行遷移,行的rowid也不會改變。

    Recursive SQL概念:有時為了執(zhí)行用戶發(fā)出的一個sql語句,Oracle必須執(zhí)行一些額外的語句,我們將這些額外的語句稱之為'recursive calls'或'recursive SQL statements'。如當一個DDL語句發(fā)出后,ORACLE總是隱含的發(fā)出一些recursive SQL語句,來修改數(shù)據(jù)字典信息,以便用戶可以成功的執(zhí)行該DDL語句。當需要的數(shù)據(jù)字典信息沒有在共享內存中時,經(jīng)常會發(fā)生Recursive calls,這些Recursive calls會將數(shù)據(jù)字典信息從硬盤讀入內存中。用戶不比關心這些recursive SQL語句的執(zhí)行情況,在需要的時候,ORACLE會自動的在內部執(zhí)行這些語句。當然DML語句與SELECT都可能引起recursive SQL。簡單的說,我們可以將觸發(fā)器視為recursive SQL。

    Row Source(行源):用在查詢中,由上一操作返回的符合條件的行的集合,即可以是表的全部行數(shù)據(jù)的集合;也可以是表的部分行數(shù)據(jù)的集合;也可以為對上2個row source進行連接操作(如join連接)后得到的行數(shù)據(jù)集合。

    Predicate(謂詞):一個查詢中的WHERE限制條件

    Driving Table(驅動表):該表又稱為外層表(OUTER TABLE)。這個概念用于嵌套與HASH連接中。如果該row source返回較多的行數(shù)據(jù),則對所有的后續(xù)操作有負面影響。注意此處雖然翻譯為驅動表,但實際上翻譯為驅動行源(driving row source)更為確切。一般說來,是應用查詢的限制條件后,返回較少行源的表作為驅動表,所以如果一個大表在WHERE條件有有限制條件(如等值限制),則該大表作為驅動表也是合適的,所以并不是只有較小的表可以作為驅動表,正確說法應該為應用查詢的限制條件后,返回較少行源的表作為驅動表。在執(zhí)行計劃中,應該為靠上的那個row source,后面會給出具體說明。在我們后面的描述中,一般將該表稱為連接操作的row source 1。

    Probed Table(被探查表):該表又稱為內層表(INNER TABLE)。在我們從驅動表中得到具體一行的數(shù)據(jù)后,在該表中尋找符合連接條件的行。所以該表應當為大表(實際上應該為返回較大row source的表)且相應的列上應該有索引。在我們后面的描述中,一般將該表稱為連接操作的row source 2。

    組合索引(concatenated index):由多個列構成的索引,如create index idx_emp on emp(col1, col2, col3, ……),則我們稱idx_emp索引為組合索引。在組合索引中有一個重要的概念:引導列(leading column),在上面的例子中,col1列為引導列。當我們進行查詢時可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,這樣的限制條件都會使用索引,但是”where col2 = ? ”查詢就不會使用該索引。所以限制條件中包含先導列時,該限制條件才會使用該組合索引。

    可選擇性(selectivity):比較一下列中唯一鍵的數(shù)量和表中的行數(shù),就可以判斷該列的可選擇性。如果該列的”唯一鍵的數(shù)量/表中的行數(shù)”的比值越接近1,則該列的可選擇性越高,該列就越適合創(chuàng)建索引,同樣索引的可選擇性也越高。在可選擇性高的列上進行查詢時,返回的數(shù)據(jù)就較少,比較適合使用索引查詢。

    二.oracle訪問數(shù)據(jù)的存取方法

    1) 全表掃描(Full Table Scans, FTS)

    為實現(xiàn)全表掃描,Oracle讀取表中所有的行,并檢查每一行是否滿足語句的WHERE限制條件一個多塊讀操作可以使一次I/O能讀取多塊數(shù)據(jù)塊(db_block_multiblock_read_count參數(shù)設定),而不是只讀取一個數(shù)據(jù)塊,這極大的減少了I/O總次數(shù),提高了系統(tǒng)的吞吐量,所以利用多塊讀的方法可以十分高效地實現(xiàn)全表掃描,而且只有在全表掃描的情況下才能使用多塊讀操作。在這種訪問模式下,每個數(shù)據(jù)塊只被讀一次。

    使用FTS的前提條件:在較大的表上不建議使用全表掃描,除非取出數(shù)據(jù)的比較多,超過總量的5% -- 10%,或你想使用并行查詢功能時。

    使用全表掃描的例子:

    SQL> explain plan for select * from dual;
                Query Plan-------------------------------
                SELECT STATEMENT[CHOOSE]
                Cost=TABLE ACCESS FULL DUAL

    2) 通過ROWID的表存取(Table Access by ROWID或rowid lookup)

    行的ROWID指出了該行所在的數(shù)據(jù)文件、數(shù)據(jù)塊以及行在該塊中的位置,所以通過ROWID來存取數(shù)據(jù)可以快速定位到目標數(shù)據(jù)上,是Oracle存取單行數(shù)據(jù)的最快方法。

    這種存取方法不會用到多塊讀操作,一次I/O只能讀取一個數(shù)據(jù)塊。我們會經(jīng)常在執(zhí)行計劃中看到該存取方法,如通過索引查詢數(shù)據(jù)。

    使用ROWID存取的方法:

    SQL> explain plan for select * from dept
                where rowid = 'AAAAyGAADAAAAATAAF';
                Query Plan------------------------------------
                SELECT STATEMENT [CHOOSE] Cost=1
                TABLE ACCESS BY ROWID DEPT [ANALYZED]

    3)索引掃描(Index Scan或index lookup)

    我們先通過index查找到數(shù)據(jù)對應的rowid值(對于非唯一索引可能返回多個rowid值),然后根據(jù)rowid直接從表中得到具體的數(shù)據(jù),這種查找方式稱為索引掃描或索引查找(index lookup)。一個rowid唯一的表示一行數(shù)據(jù),該行對應的數(shù)據(jù)塊是通過一次i/o得到的,在此情況下該次i/o只會讀取一個數(shù)據(jù)庫塊。

    在索引中,除了存儲每個索引的值外,索引還存儲具有此值的行對應的ROWID值。索引掃描可以由2步組成:(1) 掃描索引得到對應的rowid值。 (2) 通過找到的rowid從表中讀出具體的數(shù)據(jù)。每步都是單獨的一次I/O,但是對于索引,由于經(jīng)常使用,絕大多數(shù)都已經(jīng)CACHE到內存中,所以第1步的I/O經(jīng)常是邏輯I/O,即數(shù)據(jù)可以從內存中得到。但是對于第2步來說,如果表比較大,則其數(shù)據(jù)不可能全在內存中,所以其I/O很有可能是物理I/O,這是一個機械操作,相對邏輯I/O來說,是極其費時間的。所以如果多大表進行索引掃描,取出的數(shù)據(jù)如果大于總量的5% -- 10%,使用索引掃描會效率下降很多。如下列所示:

    SQL> explain plan for select empno,
                ename from emp where empno=10;
                Query Plan-------------------------
                SELECT STATEMENT [CHOOSE] Cost=1
                TABLE ACCESS BY ROWID EMP [ANALYZED]
                INDEX UNIQUE SCAN EMP_I1

    但是如果查詢的數(shù)據(jù)能全在索引中找到,就可以避免進行第2步操作,避免了不必要的I/O,此時即使通過索引掃描取出的數(shù)據(jù)比較多,效率還是很高的

    SQL> explain plan for select empno from emp where empno=10;
                -- 只查詢empno列值
                Query Plan------------------------------------
                SELECT STATEMENT [CHOOSE] Cost=1INDEX UNIQUE SCAN EMP_I1

    進一步講,如果sql語句中對索引列進行排序,因為索引已經(jīng)預先排序好了,所以在執(zhí)行計劃中不需要再對索引列進行排序

    SQL> explain plan for select empno,
                ename from empwhere empno > 7876 order by empno;
                Query Plan--------------------------------------
                SELECT STATEMENT[CHOOSE] Cost=1
                TABLE ACCESS BY ROWID EMP [ANALYZED]
                INDEX RANGE SCAN EMP_I1 [ANALYZED]

    從這個例子中可以看到:因為索引是已經(jīng)排序了的,所以將按照索引的順序查詢出符合條件的行,因此避免了進一步排序操作。

    根據(jù)索引的類型與where限制條件的不同,有4種類型的索引掃描:

    索引唯一掃描(index unique scan)

    索引范圍掃描(index range scan)

    索引全掃描(index full scan)

    索引快速掃描(index fast full scan)

    (1) 索引唯一掃描(index unique scan)

    通過唯一索引查找一個數(shù)值經(jīng)常返回單個ROWID。如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話,Oracle經(jīng)常實現(xiàn)唯一性掃描。

    使用唯一性約束的例子:

    SQL> explain plan for
                select empno,ename from emp where empno=10;
                Query Plan
                ------------------------------------
                SELECT STATEMENT [CHOOSE] Cost=1
                TABLE ACCESS BY ROWID EMP [ANALYZED]
                INDEX UNIQUE SCAN EMP_I1

    (2) 索引范圍掃描(index range scan)

    使用一個索引存取多行數(shù)據(jù),在唯一索引上使用索引范圍掃描的典型情況下是在謂詞(where限制條件)中使用了范圍操作符(如>、<、<>、>=、<=、between)

    使用索引范圍掃描的例子:

    SQL> explain plan for select empno,
                ename from empwhere empno > 7876 order by empno;
                Query Plan-------------------------------------
                SELECT STATEMENT[CHOOSE] Cost=1
                TABLE ACCESS BY ROWID EMP [ANALYZED]
                INDEX RANGE SCAN EMP_I1 [ANALYZED]

    在非唯一索引上,謂詞col = 5可能返回多行數(shù)據(jù),所以在非唯一索引上都使用索引范圍掃描。

    使用index rang scan的3種情況:

    (a) 在唯一索引列上使用了range操作符(> < <> >= <= between)

    (b) 在組合索引上,只使用部分列進行查詢,導致查詢出多行

    (c) 對非唯一索引列上進行的任何查詢。

    (3) 索引全掃描(index full scan)

    與全表掃描對應,也有相應的全索引掃描。而且此時查詢出的數(shù)據(jù)都必須從索引中可以直接得到。

    全索引掃描的例子:

    An Index full scan will not perform single block
                i/o's and so it may prove to be inefficient.
                e.g.Index BE_IX is a concatenated index on big_emp (empno, ename)
                SQL> explain plan for select empno, ename from big_emp order by empno,
                ename;Query Plan--------------------------
                SELECT STATEMENT[CHOOSE] Cost=26
                INDEX FULL SCAN BE_IX [ANALYZED]

    (4) 索引快速掃描(index fast full scan)

    掃描索引中的所有的數(shù)據(jù)塊,與 index full scan很類似,但是一個顯著的區(qū)別就是它不對查詢出的數(shù)據(jù)進行排序,即數(shù)據(jù)不是以排序順序被返回。在這種存取方法中,可以使用多塊讀功能,也可以使用并行讀入,以便獲得最大吞吐量與縮短執(zhí)行時間。

    索引快速掃描的例子:

    BE_IX索引是一個多列索引:

    big_emp (empno,ename)
                SQL> explain plan for select empno,
                ename from big_emp;
                Query Plan--------------------------
                SELECT STATEMENT[CHOOSE] Cost=1
                INDEX FAST FULL SCAN BE_IX [ANALYZED]

    只選擇多列索引的第2列:

    SQL> explain plan for select ename from big_emp;
                Query Plan--------------------------------------
                SELECT STATEMENT[CHOOSE] Cost=1
                INDEX FAST FULL SCAN BE_IX [ANALYZED]


    歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人

    posted on 2007-06-05 15:27 見酒就暈 閱讀(164) 評論(0)  編輯  收藏 所屬分類: DB

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統(tǒng)計

    常用鏈接

    留言簿(3)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    BLOG

    FRIENDS

    LIFE

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲精品AAAA片APP| 午夜男人一级毛片免费| 男男黄GAY片免费网站WWW| 亚洲第一精品电影网| 中文字幕人成人乱码亚洲电影| 毛片免费全部播放一级| 99xxoo视频在线永久免费观看| 一级做a爱过程免费视频高清| 亚洲AV无码成人网站在线观看| 亚洲制服丝袜精品久久| 亚洲人成网www| 国产亚洲精品美女久久久| 亚洲国产香蕉人人爽成AV片久久| 在线观看人成视频免费| 成年人网站免费视频| 麻豆高清免费国产一区| 99视频在线免费看| 日本免费久久久久久久网站| 51午夜精品免费视频| 一级一级一级毛片免费毛片| 日韩免费在线中文字幕| 国产午夜亚洲精品不卡| 国产精品亚洲二区在线| 国产精品亚洲精品爽爽| 免费国产高清毛不卡片基地| 相泽南亚洲一区二区在线播放| 国产亚洲精品AAAA片APP| 欧美日韩亚洲精品| 国产亚洲日韩在线a不卡| 免费国产va视频永久在线观看| 杨幂最新免费特级毛片| 一级毛片a免费播放王色电影 | 大地影院MV在线观看视频免费| 成年大片免费高清在线看黄| 日本黄页网址在线看免费不卡| 色老头综合免费视频| 国产乱妇高清无乱码免费| 老司机精品免费视频| 在线毛片片免费观看| 永久黄色免费网站| 欧美a级在线现免费观看|