版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Oracle與sql簡單優(yōu)化與鎖機制淺析系統(tǒng)運營二部徐海濤oracle數(shù)據(jù)庫的基本概念與原理對象的存儲,segment、extent、blockSGA、PGA內(nèi)存域,內(nèi)存與存儲的關(guān)系事務(wù)、undo、redo與ORA-01555關(guān)于鎖機制2023/1/11對象的存儲oracle中的對象以segment的形式存儲。我們可以在dba_segment這張視圖中查詢到所有我們創(chuàng)建的表和索引。segment由extent組成。其擴展是以extent為單位。一張表在初始化時會首先產(chǎn)生至少一個設(shè)定大小的extent,以后如果記錄數(shù)逐漸增多,則需要擴展segment的空間,每次以設(shè)定大小擴展一個extent(即增加一個設(shè)定大小的extent到segment中)。extent由block組成。block是oracle存儲中最基本的單位。一個block上會存儲一條或多條數(shù)據(jù)記錄,讀取一條數(shù)據(jù)記錄時至少需要讀取出這條記錄所在block。在blockheader上記錄了一些非常重要的信息,包含塊的類型(表還是索引)、關(guān)于塊上活動和過時的事務(wù)信息、塊在磁盤上的位置等等。一個segment屬于一個唯一的tablespace,而一個tablespace則可以包含一個或多個數(shù)據(jù)文件。2023/1/11oracle的內(nèi)存結(jié)構(gòu)SGA內(nèi)存域ORACLE使用的所有共享內(nèi)存空間被稱為SGA(systemglobalarea)的內(nèi)存結(jié)構(gòu)SGA主要包含下面的內(nèi)存域:databuffer:用于放置datablock,ORACLE中所有的數(shù)據(jù)操作(增、刪、查、改)都需要在databuffer中完成,讀數(shù)據(jù)時需先將數(shù)據(jù)塊從存儲讀到databuffer,修改數(shù)據(jù)的操作需在databuffer中完成修改然后在回寫存儲。優(yōu)化物理讀的一個辦法就是增大databuffer,使數(shù)據(jù)在databuffer的停留時間變長,提高buffer的命中率,減少物理讀,也就減小了I/O,不過這是不推薦的辦法,最重要的還是要優(yōu)化應(yīng)用。sharedpool:用于放置緩存的sql語句、sql語句的執(zhí)行計劃、數(shù)據(jù)字典視圖等,sql語句執(zhí)行過程中需要保持在sharedpool中的語句本身和其執(zhí)行計劃,dll操作也需要在sharedpool中鎖住相關(guān)的數(shù)據(jù)字典。javapool:用于存放java對象。largepool:用于分配一些大塊的內(nèi)存給進程應(yīng)對一些特殊的需要,如語句的并行執(zhí)行和備份會用到largepool,weblogicconnectionpool連接ORACLE數(shù)據(jù)庫也是使用largepool存放connection的相關(guān)信息。redologbuffer:用于緩存redolog,redolog會先緩存到redologbuffer然后再寫到日志組中。2023/1/11oracle的內(nèi)存結(jié)構(gòu)在oracle中幾乎所有操作都是SGA完成的。不論增、刪、查、改都是將需要的數(shù)據(jù)取到SGA中,在SGA中完成相關(guān)的操作。oracle通過后臺進程(DBWn)將SGA中產(chǎn)生的變化同步到儲存中,本身并不直接在存儲上進行增、刪、查、改的操作。PGA內(nèi)存域針對每個oracle進程(process)分配的獨占內(nèi)存空間被稱為PGA(processglobalarea)的內(nèi)存結(jié)構(gòu),是在SGA之外獨立分配的,一般情況下,session越多也就耗用越多的PGA??傮w而言,PGA中需要關(guān)注的地方不是太多,在9i以上的版本,使用自動內(nèi)存管理,用于hash和排序的內(nèi)存空間從SGA挪到了PGA,為PGA的上限值(pga_aggregate_target)配置一個合理的值對sql語句的效率有較大影響。(oracle中另一部分非常重要的機制就是oracle中的后臺進程,這里我們不作討論,大家可以參看《oracleexpertone-on-one》等相關(guān)的書籍)2023/1/11事務(wù)、undo、redo事務(wù)事務(wù):單個邏輯工作單元執(zhí)行的一系列操作。事務(wù)遵循如下的特性:原子性:一個事務(wù)要么完全發(fā)生,要么完全不發(fā)生一致性:事務(wù)把數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)變到另一個狀態(tài)隔離性:在事務(wù)提交以前,其他事務(wù)察覺不到事務(wù)的影響持久性:一旦事務(wù)提交,它是永久的oracle的事務(wù)是隱式開始的,從第一條dml語句開始(第一條取得TX鎖的語句開始的,后面我們將討論oracle的鎖機制,鎖也是保證事務(wù)性的重要機制,通過鎖保證了不同事務(wù)不能同時修改同一資源),到顯式以commit或者rollback結(jié)束。oracle缺省的事務(wù)隔離級別:readcommitted:只能讀到其他事務(wù)已提交的變更,事務(wù)中的每一條語句都遵從語句級的讀一致性(即只能讀到每條語句開始時其他事務(wù)已提交的變更,執(zhí)行過程中其他事務(wù)提交的變更不被體現(xiàn)),保證不會臟讀。2023/1/11事務(wù)、undo、redo事務(wù)需要注意的是完整性約束檢查的點是在語句執(zhí)行結(jié)束的時候開始的,也就是說只要有一行的修改違反完整性約束,則整體條語句失敗。在oracle中頻繁的commit并不是一個良好的習(xí)慣:oracle的所有變化都是在SGA中完成的,然后通過后臺進程同步到存儲中;但這一同步過程并不是只在commit的時候才發(fā)生,而是有一定量的數(shù)據(jù)被修改就會發(fā)生;實際上每次commit的消耗都是比較小的,因為大量修改的數(shù)據(jù)其實已經(jīng)寫到存儲中了;過于頻繁的commit反而帶來冗余的checkpoint(簡單來講,檢查內(nèi)存和存儲中的信息是否完全一致,不一致則調(diào)用相關(guān)的同步操作)的消耗;只需要在應(yīng)該commit時候(需要被其他事務(wù)可見的時候)commit。2023/1/11事務(wù)、undo、redoredo所謂重做,顧名思義,就是重新做已經(jīng)做過的動作。redolog(重做日志)對于oracle數(shù)據(jù)庫是至關(guān)重要的,數(shù)據(jù)庫中的所有的改變都會記錄到redolog(比如dml、ddl操作等),一旦數(shù)據(jù)庫出現(xiàn)故障,oracle能夠根據(jù)redolog“重做”,恢復(fù)到故障前的情況。
由于重做基本上是不能避免的、也不是浪費,需要注意數(shù)據(jù)庫過于頻繁的dml操作會帶來大量記錄重做日志的消耗。當(dāng)然這通常只能增加redolog的日志組或者提高archivelog的效率來滿足應(yīng)用的需要。2023/1/11事務(wù)、undo、redoundo撤銷:也就是取消之前的操作,回滾到操作前的情況。oracle對于每次數(shù)據(jù)的修改,都會記錄變化前的數(shù)據(jù),這個數(shù)據(jù)會記錄在rollbacksegment(回滾段)中。對應(yīng)的dml操作會在改變的datablock和記錄變更前數(shù)據(jù)的rollbackblock產(chǎn)生一個相對應(yīng)的transactionslot,記錄事務(wù)的相關(guān)信息。如果要回滾一個事務(wù)所做的dml操作,oracle根據(jù)該事務(wù)產(chǎn)生的所有transactionslot中的信息,在rollbacksegment中找到變更前的數(shù)據(jù)并回寫到對應(yīng)的datablock即可。(注意這個過程仍是首先在內(nèi)存中完成,然后通過后臺進程同步到存儲上)如果事務(wù)沒有結(jié)束,那么這個事務(wù)產(chǎn)生的回滾信息就不能被清理。但是如果事務(wù)已經(jīng)提交或者回滾,那么這個事務(wù)產(chǎn)生的回滾信息就能夠被清理重用。2023/1/11事務(wù)、undo、redoORA-01555由于存在回滾段的循環(huán)使用和讀一致性的關(guān)系,這就使得open過長時間的cursor可能產(chǎn)生ORA-01555:snapshottooold的問題。ORA-01555產(chǎn)生的原因是因為不能讀取到查詢開始時的數(shù)據(jù)引起。由于讀一致性,sql語句讀取的數(shù)據(jù)必須是查詢開始時的數(shù)據(jù),在查詢過程中產(chǎn)生的變更不能被這個查詢所讀取。對于cursor而言,就是opencursor的時候為查詢開始的時候,close是查詢結(jié)束。如果在查詢執(zhí)行或者opencursorfetch的過程中,原來查詢的數(shù)據(jù)有被更改,則這個查詢必須到回滾段中取相關(guān)修改前的數(shù)據(jù)。但因為回滾段是循環(huán)使用的,假設(shè)這個查詢執(zhí)行的時間過長或者opencursor的時間過長,就可能導(dǎo)致查詢過程中被修改的數(shù)據(jù)的回滾信息已經(jīng)被重用(因為更改這些數(shù)據(jù)的事務(wù)已經(jīng)提交了,顯然也不會被查詢阻塞),不能找到需要的修改前的數(shù)據(jù),從而發(fā)生ORA-01555。更詳細可以參見文檔《關(guān)于ORA-01555的成因和應(yīng)對措施.doc》或者其他相關(guān)的資料。2023/1/11關(guān)于鎖機制制鎖(lock):oracle中用于保護護資源的共共享機制,,對于任何何資源、對對象的訪問問都需要對對其進行加加鎖,用以以保護對資資源的并發(fā)發(fā)訪問時用用戶在存取取同一數(shù)據(jù)據(jù)庫對象時時的正確性性(即無丟丟失修改、、可重復(fù)讀讀、不讀““臟”數(shù)據(jù)據(jù));鎖也也是保證oracle事務(wù)特性的的重要機制制,通過鎖鎖機制保證證了不同的的事務(wù)不能能同時發(fā)起起對同一資資源的并發(fā)發(fā)修改。在oracle中,鎖簡單單來講有兩兩個維度::一個是鎖的的類別(lock_type),這個維度表表示了是在在哪種資源源、對象上上的鎖,比比如JQ表示在job對象上的鎖鎖、TM表示對象鎖鎖(表鎖)、TX表示事務(wù)鎖鎖(行鎖)、TS表示表空間間(tablespace)的鎖等等等。另一個是鎖鎖的模式(mode),包含0-6。2022/12/31關(guān)于于鎖鎖機機制制鎖的的模模式式(mode)::0::None1::null2::rowshare,,即RS、、行級級共共享享鎖鎖3::rowexclusive,,即RX、、行級級排排它它鎖鎖4::share,,即S、、共享享鎖鎖5::sharerowexclusive,,即SRX、、共享享行行級級排排它它鎖鎖6::exclusive,,即X、、排它它鎖鎖2022/12/31關(guān)于于鎖鎖機機制制不同同的的鎖鎖模模式式(lockmode)的相相容容列列表表見見下下::2022/12/31關(guān)于于鎖鎖機機制制oracle中的的不不同同操操作作需需要要對對不不同同的的對對象象加加不不同同模模式式的的鎖鎖;;通通過過鎖鎖的的類類別別來來表表示示對對某某種種對對象象加加鎖鎖;;而而通通過過不不同同的的鎖鎖的的模模式式的的相相容容規(guī)規(guī)則則,,來來控控制制哪哪些些操操作作可可以以并并行行,,哪哪些些操操作作是是互互斥斥的的;;通通過過這這樣樣的的鎖鎖機機制制來來保保證證每每個個用用戶戶訪訪問問對對象象的的正正確確性性。。一個個操操作作可可能能需需要要對對多多種種對對象象加加鎖鎖(需需要要申申請請一一種種以以上上type的鎖鎖),,同同時時根根據(jù)據(jù)操操作作的的不不同同申申請請不不同同的的鎖鎖模模式式(lockmode)。。比如如::selectforupdate操作作需需要要對對表表申申請請mode=3(即RX)的TM鎖(locktype=TM),,然后后對對選選到到的的行行申申請請mode=6(即X)的TX鎖(locktype=TX)(網(wǎng)上上很很多多文文檔檔說說是是加加mode=2的TM鎖,,是是在在8i庫上上,,在在9i或者者10g的庫庫實實測測加加的的是是mode=3的TM鎖,,如如果果有有分分區(qū)區(qū)則則對對對對應(yīng)應(yīng)分分區(qū)區(qū)增增加加的的是是mode=2的TM鎖);;執(zhí)行行DML操作作也也是是一一樣樣,,需需要要對對表表增增加加mode=3的TM鎖,,對對作作dml操作作的的行行增增加加mode=6的TX鎖。。那么么根根據(jù)據(jù)鎖鎖相相容容的的模模式式,,mode=3的鎖鎖是是相相容容的的(即即RX與RX是相相容容的的),,但mode=6的鎖鎖是是不不相相容容的的(即即X與X是不不相相容容的的);;因此此同同時時在在一一張張表表上上執(zhí)執(zhí)行行dml操作作和和selectforupdate操作作是是不不阻阻塞塞的的(同同時時對對一一張張表表增增加加mode=3的TM鎖是是相相容容的的);;但如如果果涉涉及及到到相相同同的的行行則則會會阻阻塞塞一一方方,,直直到到另另一一方方事事務(wù)務(wù)完完成成(同同時時對對一一行行增增加加mode=6的TX鎖是是不不相相容容的的)。。2022/12/31關(guān)于鎖機機制通過這個個過程,,我們可可以簡單單理解oracle的鎖機制制是如何何控制不不同操作作的相容容和互斥斥。實際際上,oracle的每種操操作都有有不同的的鎖策略略(需要要申請什什么類型型的鎖、、什么模模式的鎖鎖),這些復(fù)雜雜的鎖策策略隨著著不同的的數(shù)據(jù)庫庫版本也也有所變變化;通通過這些些復(fù)雜的的機制,,來保證證用戶訪訪問對象象的正確確性和一一致性。。oracle的dml鎖所有鎖機機制中,,最為常常見也最最為常用用的就是是進行各各種增、、刪、查查、改操操作中的的dml鎖機制。。dml鎖,顧名名思義,,就是在在各種dml操作中產(chǎn)產(chǎn)生的鎖鎖,這里里主要是是出現(xiàn)TX、TM兩種類型型鎖。在dml鎖機制中中,TX鎖會出現(xiàn)現(xiàn)在實際際發(fā)生改改變的部部分用于于保證dml操作的正正確性。。也就是是我們通通常講的的事務(wù)鎖鎖(實際際上這個個事務(wù)所所真正改改變的部部分)或者行鎖鎖,用于鎖定定發(fā)生改改變的行行,從而而保證修修改的正正確性(不同時時被其他他session修改);;就像我我們之前前看到的的是用了了mode=6的鎖從而而阻塞了了其他的的修改操操作。TM鎖在這里里則是一一種意向向鎖,也也就是說說需要修修改某一一個對象象時,對對其上層層對象增增加一個個鎖,表表明修改改其下級級對象意意愿,可可以理解解為一種種操作的的入隊;;就像我我們之前前看到的的,會增增加mode=3的TM鎖鎖定做做dml操作的表表;這個個鎖不會會阻塞其其他session對這張表表同時進進行的增增刪查改改操作,,但會阻阻塞對這這張表的的ddl操作(大大部分,,會使用用獨占的的ddl鎖定,比比如addcolumn等等),,保證對對象的正正確性。。2022/12/31關(guān)于鎖機機制v$lock視圖v$lock視圖記錄錄了每個個session取得鎖或或者等待待鎖的情情況:ID1和ID2標識了鎖鎖定的對對象,在在TM和TX鎖中的含含義如下下:2022/12/31關(guān)于鎖機機制通過v$lock視圖我們們就能查查到session之間持有有和等待待鎖以及及相互阻阻塞的情情況。更詳細的的有關(guān)dml鎖機制的的說明可可以參看看轉(zhuǎn)引網(wǎng)網(wǎng)文《oracle多粒度封封鎖機制制研究((論壇)).doc》》或其他相相關(guān)資料料。本文大量量內(nèi)容引引自該文文檔和《《oracleexpertone-on-one》》相關(guān)內(nèi)容容。關(guān)于死鎖鎖需要注意意的是,,就一般般而言oracle中并不會會長期存存在真正正意義上上的死鎖鎖。oracle會以一個個很短的的時間去去輪循,,檢查是是否有死死鎖,如如果發(fā)現(xiàn)現(xiàn)有死鎖鎖出現(xiàn),,則會中中斷掉其其中一個個session以解除死死鎖,并并拋出ORA-00060錯誤。2022/12/31關(guān)于鎖鎖機制制一個關(guān)關(guān)于外外鍵關(guān)關(guān)聯(lián)在在dml操作中中鎖機機制的的案例例oracle的dml鎖中,,比較較復(fù)雜雜的情情況之之一就就是涉涉及到到外鍵鍵關(guān)聯(lián)聯(lián)的情情況,,由于于存在在完整整性約約束檢檢查,,這里里不僅僅僅會會對發(fā)發(fā)生dml的表本本身產(chǎn)產(chǎn)生鎖鎖,也也會對對有外外鍵關(guān)關(guān)聯(lián)的的表產(chǎn)產(chǎn)生鎖鎖。案例::locksample1.doc2022/12/31簡單的sql優(yōu)化sql語句的執(zhí)行行過程關(guān)于索引與與表掃描關(guān)于表連接接關(guān)于排序2022/12/31sql語句的執(zhí)行行過程sql語句的執(zhí)行行步驟hardparse與softparsesoftparse也會有消耗耗2022/12/31sql語句的執(zhí)行行步驟1、語法分析,,分析語句句的語法是是否符合規(guī)規(guī)范,衡量量語句中各各表達式的的意義。2、語義分分析,檢查查語句中涉涉及的所有有數(shù)據(jù)庫對對象是否存存在,且用用戶有相應(yīng)應(yīng)的權(quán)限。。3、視圖轉(zhuǎn)轉(zhuǎn)換,將涉涉及視圖的的查詢語句句轉(zhuǎn)換為相相應(yīng)的對基基表查詢語語句。4、表達式式轉(zhuǎn)換,將將復(fù)雜的的SQL表達式轉(zhuǎn)換換為較簡單單的等效連連接表達式式。5、選擇優(yōu)優(yōu)化器,不不同的優(yōu)化化器一般產(chǎn)產(chǎn)生不同的的"執(zhí)行計計劃"6、選擇連連接方式,,ORACLE有三種連接接方式,對對多表連接接ORACLE可選擇適當(dāng)當(dāng)?shù)倪B接方方式。7、選擇連連接順序,,對多表表連接ORACLE選擇哪一對對表先連接接,選擇這這兩表中哪哪個表做為為源數(shù)據(jù)表表。8、選擇數(shù)數(shù)據(jù)的搜索索路徑,根根據(jù)以上條條件選擇合合適的數(shù)據(jù)據(jù)搜索路徑徑,如是選選用全表搜搜索還是利利用索引或或是其他的的方式。9、運行"執(zhí)行計劃劃"。2022/12/31hardparse與softparse1-8的步驟也就就是我們通通常所說的的parse,通過parse得到一條語語句的執(zhí)行行計劃,可可以看出parse的過程是一一個比較昂昂貴的消費費,顯然如如果每次執(zhí)執(zhí)行sql都需要進行行一次完整整的parse,那么將是非非常大的消消耗。因此,大部部分數(shù)據(jù)庫庫都提供了了sql的共享的機機制。一條條sql語句如果做做一次完整整的parse并生成全新新的執(zhí)行計計劃,這個個過程被稱稱為hardparse;如果已經(jīng)parse過并仍然存存在于緩存存中的sql語句,再次次執(zhí)行時則則直接使用用已經(jīng)在緩緩存中的執(zhí)執(zhí)行計劃,,不需要再再重新生成成執(zhí)行計劃劃,這個過過程稱為softparse。正是因為這這樣,我們們大量使用用綁定變量量,使得只只是參數(shù)不不同的同構(gòu)構(gòu)sql語句在oracle為同一條sql語句(只是是具體執(zhí)行行時使用的的參數(shù)不一一樣),由由此使得sql語句的執(zhí)行行計劃可以以得到復(fù)用用,減少hardparse,盡量用到softparse,從而減少parse帶來的消耗耗。2022/12/31softparse也會會有有消消耗耗盡管管如如此此,,softparse也并并非非全全無無消消耗耗,,softparse同樣樣需需要要在在sharedpool中取取得得相相關(guān)關(guān)內(nèi)內(nèi)存存空空間間的的latch(鎖住住存存儲儲sql語句句、、執(zhí)執(zhí)行行計計劃劃以以及及需需要要鎖鎖住住的的相相關(guān)關(guān)數(shù)數(shù)據(jù)據(jù)字字典典的的內(nèi)內(nèi)存存空空間間);;而而對對latch的分分配配和和操操作作本本身身就就是是一一個個比比較較耗耗cpu的動動作作,,latch的數(shù)數(shù)量量也也是是有有限限的的,,因因此此過過量量的的并并發(fā)發(fā)執(zhí)執(zhí)行行,,即即使使都都是是softparse依然然會會造造成成很很大大的的消消耗耗。。案例例::實際際上上如如果果能能夠夠在在pga空間間中中的的cursorcache找到到同同樣樣的的語語句句,,則則不不需需要要再再到到sharedpool中查查找找,,這這個個過過程程是是消消耗耗最最小小的的。。默默認認情情況況下下,,oracle并不不會會去去為為session緩存存cursor,,需要要我我們們?nèi)トピO(shè)設(shè)置置session_cashed_cursor來指指定定oracle為session緩存存的的cursor數(shù)量量(當(dāng)當(dāng)然然這這會會消消耗耗pga內(nèi)存存空空間間)。2022/12/31sql語句的的執(zhí)行過程接下來,運行行“執(zhí)行計劃劃”,就是通通常sql性能最重要的的部分;選擇擇了怎樣的執(zhí)執(zhí)行計劃、如如何做表連接接、如何進行行表的掃描、、是否使用索索引、使用什什么索引,等等等問題。應(yīng)該選擇什么么樣的執(zhí)行計計劃,一個比比較基本的看看法,首先應(yīng)應(yīng)關(guān)注那些直直接的查詢條條件(也就是是表的列直接接和帶入?yún)?shù)數(shù)進行比較的的查詢條件),這些查詢詢條件中哪些些能夠首先篩篩選掉較多的的記錄從而有有效的降低結(jié)結(jié)果集,那么么應(yīng)當(dāng)優(yōu)先執(zhí)執(zhí)行這些查詢詢條件,降低低整個sql執(zhí)行過程中需需要處理的結(jié)結(jié)果集。當(dāng)然然實際上sql的執(zhí)行計劃必必須全盤考慮慮整個查詢過過程怎樣才是是較優(yōu)的查詢詢路徑,包括括每個環(huán)節(jié)步步驟選擇什么么索引、什么么掃描方式、、什么表連接接方式。下面我們依次次看看這些問問題。2022/12/31關(guān)于索引與表表掃描BTree索引的數(shù)據(jù)結(jié)結(jié)構(gòu)判斷是否適合合使用索引索引使用不合合理的常見問問題2022/12/31BTree索引的的數(shù)據(jù)據(jù)結(jié)構(gòu)構(gòu)索引,,正如如其名名稱一一樣,,就好好像字字典中中的索索引,,通過過它數(shù)數(shù)據(jù)庫庫能夠夠根據(jù)據(jù)一些些特定定的信信息很很快的的定位位到所所需要要的數(shù)數(shù)據(jù)而而并不不需要要察看看全部部的數(shù)數(shù)據(jù)才才能得得到想想要的的結(jié)果果。BTree索引的的數(shù)據(jù)據(jù)結(jié)構(gòu)構(gòu)是一一個根根據(jù)關(guān)關(guān)鍵字字排序序的B+樹結(jié)構(gòu)構(gòu)(一一個多多層的的N叉樹),由由一群群(關(guān)關(guān)鍵字字、值值)對對組成成;關(guān)關(guān)鍵字字就是是索引引列的的列值值(如如果是是復(fù)合合索引引,則則是多多個列列值),值值就是是對應(yīng)應(yīng)記錄錄的rowid。其中,,根節(jié)節(jié)點存存儲1-N個關(guān)鍵鍵字和和2-N+1個指針針,其其指針針指向向內(nèi)層層節(jié)點點或者者葉結(jié)結(jié)點(如果果索引引足夠夠小);內(nèi)內(nèi)層節(jié)節(jié)點存存儲(N+1)/2-1-N個關(guān)鍵鍵字和和(N+1)/2-N+1個指針針,其其指針針指向向葉節(jié)節(jié)點或或其他他內(nèi)層層節(jié)點點;葉葉節(jié)點點存儲儲(N+1)/2-N個關(guān)鍵鍵字和和(N+1)/2-N+1個指針針,其其最后后一個個指針針指向向下一一個葉葉節(jié)點點;其其余的的指針針指向向?qū)?yīng)應(yīng)的行行記錄錄(也也就是是上面面說的的rowid),,關(guān)鍵字字保存存對應(yīng)應(yīng)記錄錄索引引列的的列值值。2022/12/31BTree索引引的的數(shù)數(shù)據(jù)據(jù)結(jié)結(jié)構(gòu)構(gòu)根節(jié)節(jié)點點和和內(nèi)內(nèi)層層節(jié)節(jié)點點的的關(guān)關(guān)鍵鍵字字表表示示一一個個范范圍圍,,其其指指針針分分別別指指向向了了小小于于該該關(guān)關(guān)鍵鍵字字或或者者大大于于等等于于該該關(guān)關(guān)鍵鍵字字的的節(jié)節(jié)點點群群,,如如下下圖圖::葉節(jié)節(jié)點點的的關(guān)關(guān)鍵鍵字字為為對對應(yīng)應(yīng)的的記記錄錄索索引引列列的的列列值值,,除除最最后后一一個個指指針針指指向向下下一一個個葉葉結(jié)結(jié)點點外外其其余余指指針針則則指指向向了了對對應(yīng)應(yīng)的的記記錄錄(rowid),,如下下圖圖::2022/12/31BTree索引引的的數(shù)數(shù)據(jù)據(jù)結(jié)結(jié)構(gòu)構(gòu)如上上假假設(shè)設(shè)我我們們要要查查找找索索引引列列值值為為75的的記記錄錄,,只只需需要要在在根根節(jié)節(jié)點點中中找找到到57到到81這這個個范范圍圍的的節(jié)節(jié)點點群群,,然然后后依依次次根根據(jù)據(jù)范范圍圍最最終終在在葉葉節(jié)節(jié)點點中中找找到到索索引引列列為為75的的記記錄錄的的rowid。。2022/12/31判斷斷是是否否適適合合使使用用索索引引索引引之之所所以以能能夠夠起起到到優(yōu)優(yōu)化化查查詢詢的的作作用用,,就就在在于于它它將將查查詢詢用用到到的的條條件件(列列)作作為為關(guān)關(guān)鍵鍵字字(其其對對應(yīng)應(yīng)值值指指向向?qū)?yīng)應(yīng)的的記記錄錄)并并組組織織為為一一個個排排序序的的結(jié)結(jié)構(gòu)構(gòu),,這這樣樣我我們們能能在在這這個個排排序序結(jié)結(jié)構(gòu)構(gòu)中中快快速速的的定定位位到到要要查查找找的的記記錄錄而而不不需需要要去去遍遍歷歷全全部部的的數(shù)數(shù)據(jù)據(jù)(就就好好像像查查字字典典一一樣樣,,根根據(jù)據(jù)拼拼音音或或者者筆筆畫畫就就能能很很快快的的查查到到一一個個字字,,而而不不需需要要把把整整個個字字典典翻翻一一遍遍)。。相對對通通過過全全表表掃掃描描找找到到一一條條記記錄錄,,通通過過索索引引避避免免了了很很多多冗冗余余數(shù)數(shù)據(jù)據(jù)的的掃掃描描(我我們們不不需需要要把把整整個個字字典典中中不不是是我我們們要要查查找找的的字字的的頁頁也也翻翻看看一一遍遍)。。但但同同時時我我們們也也看看到到,,對對于于單單獨獨的的一一條條記記錄錄而而言言通通過過索索引引掃掃描描在在讀讀取取這這條條記記錄錄的的花花費費上上增增加加了了掃掃描描索索引引和和通通過過rowid定位位的的操操作作。。因此此不不是是所所有有情情況況下下,,都都適適合合使使用用的的索索引引。。假假設(shè)設(shè)一一個個字字典典記記錄錄了了1000個個字字,,而而我我們們需需要要查查找找其其中中的的900個個字字,,這這種種情情況況下下如如果果還還先先查查索索引引在在找找到到對對應(yīng)應(yīng)的的字字就就不不如如直直接接把把整整個個字字典典翻翻看看一一遍遍來來的的要要快快。。同樣樣的的道道理理,,并并不不是是所所有有的的字字段段都都適適合合建建立立BTree索引引,,如如果果一一個個字字段段的的獨獨立立列列值值非非常常少少,,比比如如100萬萬的的記記錄錄卻卻只只有有10個個獨獨立立列列值值,,那那么么任任意意查查詢詢其其中中一一個個列列值值都都會會查查詢詢出出10萬萬條條記記錄錄(10%),,那那么么這這個個索索引引就就算算使使用用效效率率也也很很低低,,這這個個字字段段不不適適合合建建立立單單列列的的BTree索引。2022/12/31判斷是否否適合使使用索引引而實際上上的經(jīng)驗驗數(shù)據(jù),,當(dāng)通過過索引掃掃描access的記錄數(shù)數(shù)<=總總記錄數(shù)數(shù)的6%的時候候,使用用索引是是有效率率的,可可見掃描描索引的的數(shù)據(jù)結(jié)結(jié)構(gòu)本身身和通過過索引多多次的去去accesstable也有著相相當(dāng)?shù)南摹?實際上上計算索索引掃描描的成本本是用需需要accesstable的block數(shù)來計算算access的次數(shù),,也就是是說,假假設(shè)索引引的順序序和表存存儲的順順序完全全一致(比如sequence作的主鍵鍵索引),則這這個比例例可以擴擴大一些些;但實實際上這這個假設(shè)設(shè)成立的的情況比比較少,,而且即即便如此此這個比比例也不不會很大大)另外需要要注意的的是,BTree索引并不不記錄null值,也就就是說是是用isnull或者isnotnull這樣的條條件是不不可能用用到BTree索引的。。2022/12/31判斷是否適合合使用索引判斷是否應(yīng)該該使用索引或或者說是否使使用到合適的的索引,主要要在于下面幾幾種情況:tab.a=:1,這種情況主要要看:1在整整個a的獨立列值中中占了多少百百分比(也就就是a列取值為:1的記錄數(shù)占占到整個記錄錄數(shù)的比例);這個比例例很低的話則則適合使用a列的索引,反反之oracle就會傾向于使使用全表掃描描。tab.a>=:1andtab.a<=:2,這種情況主要要看:1-:2之之間這個范范圍的記錄數(shù)數(shù)占到總記錄錄數(shù)的比例;;范圍太大(比例比較高高)的話則不不適合使用a列的索引tab.ain(list),,這種情況主要要看inlist中的列值包含含的記錄數(shù)占占到總記錄數(shù)數(shù)的百分比,,這個百分比比較大的話就就不適合使用用a的索引。假設(shè)設(shè)一個列有10個獨立列列值,而inlist中就有5個列列值,那么平平均計算可能能就是50%,顯然這里里并不適合使使用a的索引。tab.a=table.b,通過表table作為驅(qū)動表與與表tab做表連接,連連接條件是table表的b列=tab表的a列,這里主要要看表table用于表連接的的結(jié)果集其每每條記錄的b列值對應(yīng)在tab表的a列能夠選取到到的記錄數(shù)的的總和占tab表記錄數(shù)的百百分比(這里里用tab表a列的索引指的的是使用nestedloop表連接方式的的情況下,使使用hashjoin或其他的表連連接方式,這這個比例的計計算并不適用用,關(guān)于表連連接的方式,,我們在后面面討論),如如果表table用于作為驅(qū)動動表的結(jié)果集集比較小、且且結(jié)果集中b列的列值對應(yīng)應(yīng)tab表中a列的列值能夠夠選取的到的的記錄數(shù)比較較低,則適合合使用tab表上a列的索引。(這里指使用用nestedloop的情況,涉及及到表連接索索引的使用要要跟表連接的的方式一起考考慮,在表連連接的部分我我們再做討論論)2022/12/31索引使用不不合理的常常見問題缺少合適的的索引可用用(選擇更更加優(yōu)化的的字段或者者合理的復(fù)復(fù)合索引首首列)案例1:indexsample1.doc在這個案例例中:語句(1)存在一個個日期范圍圍查詢可以以使用在日日期字段上上的索引,,但是如果果時間范圍圍跨度過大大,這個索索引的效率率也就不高高了;語句(2)能夠有查查詢條件的的字段當(dāng)中中只有一個個區(qū)分度很很低的字段段建了索引引(千萬條條數(shù)據(jù)只有有幾十個獨獨立列值),這個字段是是不適合建建立單列索索引的,查查詢使用這這個索引的的效率也非非常低;這兩個語句句我們通過過分析語句句,都發(fā)現(xiàn)現(xiàn)了有區(qū)分分度比較高高且適用的的查詢條件件字段,只只要在這些些字段建立立索引,就就能優(yōu)化語語句的執(zhí)行行效率。這里我們看看到,過大大的范圍查查詢會影響響索引的效效率;而過過低的區(qū)分分度的列則則并不適合合建立單列列索引。2022/12/31索引引使使用用不不合合理理的的常常見見問問題題缺少少合合適適的的索索引引可可用用(選選擇擇更更加加優(yōu)優(yōu)化化的的字字段段或或者者合合理理的的復(fù)復(fù)合合索索引引首首列列)案例例2::indexsample2.doc在這這個個案案例例中中::表cjk上原原來來有有一一個個復(fù)復(fù)合合索索引引(FZJZH,FBMDM,FSCDM,FGDDM,FZQDM,FHTXH,FMMLB,FCJSJ),,這個個索索引引的的區(qū)區(qū)分分度度很很高高,,本本來來是是很很好好用用的的。。但但問問題題就就出出來來這這兩兩個個查查詢詢語語句句中中,,前前面面幾幾列列使使用用的的都都是是模模糊糊查查詢詢,,而而根根據(jù)據(jù)實實際際情情況況,,往往往往傳傳入入的的都都是是百百分分號號,,導(dǎo)導(dǎo)致致索索引引掃掃描描的的時時候候無無法法根根據(jù)據(jù)關(guān)關(guān)鍵鍵字字的的范范圍圍快快速速的的定定位位到到需需要要的的索索引引結(jié)結(jié)點點,,在在這這里里反反而而使使用用這這個個索索引引效效率率比比全全表表掃掃描描還還要要低低得得多多(實實際際情情況況是是幾幾個個小小時時)。。分析析這這條條兩兩條條語語句句的的查查詢詢條條件件,,發(fā)發(fā)現(xiàn)現(xiàn)FCJSJ這個個查查詢詢條條件件,,實實際際操操作作中中基基本本上上都都是是查查詢詢一一天天的的數(shù)數(shù)據(jù)據(jù),,這這里里只只需需要要建建立立一一個個以以FCJSJ作為為首首列列的的復(fù)復(fù)合合索索引引(fbdsj,fbmdm,fzjzh,fgddm,fscdm,fzqdm),,就可可以以優(yōu)優(yōu)化化語語句句的的效效率率。。由于于BTree索引引是是關(guān)關(guān)鍵鍵字字排排序序,,如如果果復(fù)復(fù)合合索索引引的的首首列列不不能能根根據(jù)據(jù)查查詢詢條條件件有有效效的的篩篩選選,,就就需需要要掃掃描描大大量量冗冗余余的的索索引引結(jié)結(jié)點點;;在在這這個個案案例例中中由由于于前前面面幾幾列列都都出出現(xiàn)現(xiàn)了了%號號的的情情況況,,導(dǎo)導(dǎo)致致幾幾乎乎是是將將整整個個索索引引結(jié)結(jié)點點掃掃描描了了一一遍遍才才得得到到結(jié)結(jié)果果,,效效率率非非常常低低。。所所以以復(fù)復(fù)合合索索引引要要特特別別注注意意首首列列的的選選擇擇。。2022/12/31索引使使用不不合理理的常常見問問題不均勻勻分布布的列列值在在bindpeeking和histogram的影響響下,影響響索引的使用用首先解解釋下下相關(guān)關(guān)名詞詞:bindpeeking::sql語句中中使用用到綁綁定變變量,,在第第一次次執(zhí)行行時會會peeking其綁定定變量量的值,,就相相當(dāng)于于常量量語句句一樣樣,并并根據(jù)據(jù)這個個具體體值解解析計計算成成本,,解釋釋出執(zhí)執(zhí)行計計劃。。這一一特性性是在在oracle9i以后引引入的的。histogram:直方圖圖,對對于不不同列列值更更加準準確的的數(shù)據(jù)據(jù)量的的統(tǒng)計計。對對于列列值分分布不不均勻勻的列列來說說,通通過直直方圖圖,就就能準準確計計算出出不同同列值值的數(shù)數(shù)據(jù)量量,而而不僅僅僅簡簡單的的根據(jù)據(jù)(總記記錄數(shù)數(shù)/獨立列列值數(shù)數(shù))來來計算算其數(shù)數(shù)據(jù)量量(平平均情情況)。2022/12/31索引使使用不不合理理的常常見問問題不均勻勻分布布的列列值在在bindpeeking和histogram的影響響下,影響響索引的使用用以下引引用《《ORACLE數(shù)據(jù)庫庫優(yōu)化化案例例簡報報(第第一期期)》的相相關(guān)內(nèi)內(nèi)容::由于8i還沒有有bindpeeking技術(shù),,使用用綁定定變量量以后后無法法使用用histogram,所以最最好在編編程時時對具具有skew值的列列不使使用bind變量,這樣樣,生生成成計劃劃時,其其可根根據(jù)histogram的值來來估算算返回回的數(shù)數(shù)據(jù)量量,并并生生成合合適的的計劃劃。9i引入了了bindpeeking技術(shù),,使用用綁定定變量量以后后可以以用到到histogram,但是如如果第第一次執(zhí)行行帶入入的變變量值值失誤誤,很很可能能產(chǎn)生生的執(zhí)執(zhí)行計計劃對對以后后的多多次查查詢不不適合合而帶帶來性能問問題。。2022/12/31索引使使用不不合理理的常常見問問題不均勻勻分布布的列列值在在bindpeeking和histogram的影響響下,影響響索引的使用用我們看看看《《ORACLE數(shù)據(jù)庫庫優(yōu)化化案例例簡報報(第第一期期)》所舉舉的這這個案案例::語句::selectpolicy_cert_no,apply_personnel_numfromacc_policy_certwherepolicy_no=:1andcert_type='1'selectpolicy_cert_nofromacc_policy_certwhereinsurance_card_no=:1andpolicy_no=:22022/12/31索引引使使用用不不合合理理的的常常見見問問題題不均均勻勻分分布布的的列列值值在在bindpeeking和histogram的影影響響下下,影影響響索引引的使使用用這兩兩條條語語句句都都是是對對表表acc_policy_cert進行行查查詢詢,,在在policy_no字段段上上有有主主鍵鍵索索引引(復(fù)復(fù)合合索索引引的的首首列列),,正常常的的情情況況下下,,應(yīng)應(yīng)該該走走這這個個索索引引而而不不是是全全表表掃掃描描。。但在在policy_no的列列值值分分布布并并不不均均勻勻,,比比如如policy_no列共共有有100個個不不同同的的值值,,其其中中為為70的的占占了了99%%,,為為其其他他值值的的數(shù)數(shù)據(jù)據(jù)行行僅僅占占1%%((即即選選擇擇性性很很高高)),,則則如如果果不不使使用用綁綁定定變變量量,,借借助助histogram,,oracle能夠夠知知道道,,查查詢詢policy_no=70的時時候候應(yīng)應(yīng)該該走走全全表表掃掃描描效效率率更更高高,,查查詢詢policy_no為其其他他值值的的語語句句應(yīng)應(yīng)該該走走索索引引效效率率更更高高。。問題題就就出出現(xiàn)現(xiàn)了了,,假假設(shè)設(shè)第第一一次次執(zhí)執(zhí)行行時時帶帶入入的的是是70的的這這個個值值,,顯顯然然執(zhí)執(zhí)行行計計劃劃會會走走全全表表掃掃描描,,但但是是由由于于使使用用了了綁綁定定變變量量,,以以后后即即使使是是帶帶入入其其他他值值,,執(zhí)執(zhí)行行計計劃劃依依然然會會走走全全表表掃掃描描。。2022/12/31索引使用用不合理理的常見見問題不均勻分分布的列列值在bindpeeking和histogram的影響下下,影響索引的使用解決辦法法有3個個:1)不使使用綁定定變量,,但是這這樣就會會導(dǎo)致大大量的hardparse,對sharedpool也會產(chǎn)生生大量的的消耗。。2)修改改程序,,針對不不同情況況使用不不同執(zhí)行行計劃(不同的的語句)3)不收收集直方方圖(這這樣就會會按照平平均情況況來計算算數(shù)據(jù)量量)或者使用用hint綁定執(zhí)行行計劃,,使其總總能使用用到索引引,這樣樣就可以以使大部部分情況況得到較較好的效效率,但但對于比比如70這樣的的值就會會效率低低下。關(guān)于這個個問題詳詳細的解解釋和說說明可以以參見《《ORACLE數(shù)據(jù)庫優(yōu)優(yōu)化案例例簡報(第一期期)》中相關(guān)關(guān)內(nèi)容。。2022/12/31關(guān)于表表連接接三種主主要的的表連連接方方式何時使使用哪哪種表表連接接方式式2022/12/31三種主主要的的表連連接方方式nestedloopjoin循環(huán)嵌嵌套連連接::行源源1的的每一一條記記錄,,依次次去匹匹配行行源2的每每條記記錄,,將符符合連連接條條件的的記錄錄放在在結(jié)果果集中中,直直到行行源1的所所有記記錄都都完成成這個個操作作。循循環(huán)嵌嵌套連連接是是最基基本也也是最最古老老的表表連接接方式式。sortmergejoin排序合合并連連接::行源源1和和行源源2的的數(shù)據(jù)據(jù)分別別排序序,然然后將將兩個個排序序的源源表合合并,,符合合連接接條件件的記記錄放放到結(jié)結(jié)果集集中。。由于于排序序需要要內(nèi)存存空間間,sortmergejoin對內(nèi)存存有比比較大大的消消耗,,如果果內(nèi)存存空間間(8i為sort_area_size,,9i及以上上使用用PGA)不足,,則會會使用用臨時時表空空間,,這樣樣會降降低排排序合合并連連接的的效率率。排排序合合并連連接是是最古古老的的表連連接方方式之之一。。hashjoin哈希連連接::將行行源1計算算成一一張基基于連連接鍵鍵的hash表,行行源2的每每條記記錄依依次掃掃描這這張hash表,找找到匹匹配的的記錄錄放到到結(jié)果果集。。計算算hash表需要要內(nèi)存存空間間,hashjoin同樣對對于內(nèi)內(nèi)存有有比較較大的的消耗耗,如如果內(nèi)內(nèi)存空空間(8i為hash_area_size,,9i及以上上使用用PGA)不足,,則會會使用用臨時時表空空間,,這樣樣會降降低哈哈希連連接的的效率率。2022/12/31三種主要的的表連接方方式nestedloopjoin2022/12/31三種種主主要要的的表表連連接接方方式式sortmergejoin2022/12/31三種種主主要要的的表表連連接接方方式式hashjoin2022/12/31何時時使使用用哪哪種種表表連連接接方方式式nestedloopjoin表連連接接方方式式的的適適用用情情況況nestedloopjoin適合合于于::作作為為表表連連接接的的驅(qū)驅(qū)動動表表(也也就就是是之之前前的的行行源源1,,也也稱稱為為外外部部表表)記錄錄數(shù)數(shù)比比較較少少或或者者通通過過直直接接的的查查詢詢條條件件能能篩篩選選出出比比較較少少的的記記錄錄數(shù)數(shù),,被被連連接接表表(也也就就是是之之前前的的行行源源2,,也也稱稱為為內(nèi)內(nèi)部部表表)在在連連接接條條件件上上有有區(qū)區(qū)分分度度很很高高的的索索引引;;驅(qū)驅(qū)動動表表上上的的每每條條記記錄錄通通過過被被連連接接表表在在連連接接條條件件上上的的索索引引能能快快速速的的匹匹配配到到少少量量的的記記錄錄;;整整體體的的結(jié)結(jié)果果集集比比較較小小,,這這樣樣就就比比較較適適合合使使用用nestedloopjoin。nestedloopjoin選擇驅(qū)動表時時應(yīng)優(yōu)先選擇擇記錄數(shù)比較較少的、通過過直接查詢條條件能夠篩選選出比較少記記錄的表作為為驅(qū)動表,這這樣能夠有效效的減少匹配配次數(shù)。例如如這樣的查詢詢語句:select*froma,bwherea.col1=:1anda.col2=b.col2;這里a表有100條條記錄,通過過col1=:1的條件能夠篩篩選出50條條記錄,b表只有10條條記錄;這里里如果以a表作驅(qū)動表的的話,則匹配配次數(shù)是50*10;如如果用b表作為驅(qū)動表表的話,則匹匹配次數(shù)是10*100;顯然應(yīng)該該使用a表作為驅(qū)動表表。如果連接條件件沒有很好的的索引、或者者作為表連接接的兩張表結(jié)結(jié)果集都相當(dāng)當(dāng)大,則并不不適合使用nestedloopjoin。2022/12/31何時使用哪種種表連接方式式sortmergejoin表連接方式的的適用情況sortmergejoin適用于:當(dāng)表表連接的兩張張表的結(jié)果集集都比較大,,或沒有很好好的條件可以以篩選,連接接條件缺少很很好的索引時時,可以選擇擇使用sortmergejoin。。由于sortmergejoin需要對作連接接的兩張表都都作排序,實實際上如果語語句中沒有排排序需求,oracle更加傾向于選選擇hashjoin。但如果語句中中本身就有排排序的需求,,sortmergejoin則有可能省去去單獨的排序序。sortmergejoin對內(nèi)存消耗比比較大,如果果內(nèi)存空間不不足以完成排排序,則需要要用到臨時表表空間,效率率會有較大的的降低。sortmergejoin只能用于等價價連接。2022/12/31何時使用哪種種表連接方式式hashjoin表連接方式的的適用情況hashjoin適用于于:當(dāng)當(dāng)表連連接的的兩張張表的的結(jié)果果集都都比較較大,,或沒沒有很很好的的條件件可以以篩選選,連連接條條件缺缺少很很好的的索引引時,,使用用hashjoin能夠取取得比比較好好的效效率。hashjoin雖然也也需要要將一一張表表的所所有記記錄依依次和和hash表中的的記錄錄進行行匹配配,但但掃描描hash表的速速度要要比掃掃描BTree索引快快的多多,所所以在在大結(jié)結(jié)果集集和缺缺少良良好索索引的的情況況下,,使用用hashjoin能得到到比較較好的的效率率。與sortmergejoin相比,,hashjoin只需要要進行行一次次排序序,因因此大大部分分情況況下,,oracle會更傾傾向于于選擇擇hashjoin。hashjoin需要計計算一一張hashtable,,與sortmergejoin一樣,,需要要消耗耗大量量的內(nèi)內(nèi)存空空間,如果內(nèi)內(nèi)存空空間不不足則則需要要用到到臨時時表空空間,,效率率會有有較大大的降降低。。hashjoin只能CBO優(yōu)化器器下使使用,,只能能用于于等價價連接接。例如語語句::select*froma,bwherea.col1=:1andb.col1=:2anda.col2=b.col2在這個個語句句中,,a表通過過col1=:1和b表通過過col1=:2篩選后后的記記錄數(shù)數(shù)依然然比較較大,,雖然然col2在a表和b表上都都是很很不錯錯的索索引,,但是是因為為作連連接的的結(jié)果果集比比較大大,使使用nestedloop效率不不高,,這時時使用用hashjoin就能得得到較較好的的效率率。2022/12/31何時使使用哪哪種表表連接接方式式案例1:《joinsample1.doc》在這個個案例例中,,原來來的執(zhí)執(zhí)行計計劃,,選擇擇了首首先掃掃描兩兩張小小表SELECT_CONDITION_TMP,,然后與與大表表ASSET_COMBINATION進行nestedloopjoin,,兩張小小表結(jié)結(jié)合起起來的的條件件大概概會形形成一一個幾幾百條條的結(jié)結(jié)果集集,而而與表表ASSET_COMBINATION進行nestedloopjoin也是一一個具具有一一定區(qū)區(qū)分度度的索索引,,看起起來似似乎選選擇nestedloopjoin并沒有有錯。。但仔細細分析析:首首先這這里在在nestedloopjoin時使用用的索索引是是字段段the_date上的索索引,,也就就是說說連接接條件件curno、cmbno并沒有有起到到快速速查找找定位位的作作用;;其次次由于于兩張張小表表SELECT_CONDITION_TMP只是一一些查查詢條條件的的組合合本身身數(shù)據(jù)據(jù)量非非常少少,但但依然然會使使得通通過the_date=:1這個條條件掃掃描ASSET_COMBINATION表會重重復(fù)很很多次次;再再次,,ASSET_COMBINATION這個表表上并并沒有有以curno或cmbno為首列列的索索引,,而以以這兩兩個列列作為為條件件區(qū)分分度并并不是是很高高。分析之之下,,作為為直接接條件件the_date=:1能夠篩篩過濾濾掉大大量的的記錄錄,且且有不不錯的的索引引,有效的的減小小結(jié)果果集,,因此此這里里應(yīng)該該首先先掃描描ASSET_COMBINATION減少冗冗余的的掃描描(不不必像像原執(zhí)執(zhí)行計計劃一一樣重重復(fù)掃掃描很很多次次);然后與與兩張張小表表SELECT_CONDITION_TMP進行連連接時時,因因為這這兩張張表的的數(shù)據(jù)據(jù)比ASSET_COMBINATION通過the_date=:1選出來來的結(jié)結(jié)果集集還要要小很很多,,這里里適合合使用用hashjoin有比較較好的的效率率。2022/12/31何時使使用哪哪種表表連接接方式式案例2:《joinsample2.msg》在這個個案例例,原原語句句因為為唯一一能夠夠首先先過濾濾掉較較多結(jié)結(jié)果集集的條條件TASK_STATUS_ID=‘‘12’’本身仍仍然會會篩選選出數(shù)數(shù)量較較大的的結(jié)果果集,,而PA_TASK_TLR_ADMIN本身是個小小表,因此此優(yōu)先使用用直接條件件篩選掉一一些結(jié)果集集,然后再再與小表使使用hashjoin;看起來這似似乎并沒有有什么問題題。但仔細分析析:表PA_CUSTOMER_CAMPAIGN是個大表,,而TASK_STATUS_ID又是一個區(qū)區(qū)分度很低低條件,首首先使用條條件TASK_STATUS_ID=‘‘12’’查詢表PA_CUSTOMER_CAMPAIGN就是一個效效率不高的的動作。發(fā)發(fā)現(xiàn)在表PA_CUSTOMER_CAMPAIGN上字段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025個人知識產(chǎn)權(quán)質(zhì)押貸款合同范本二零二五3篇
- 2025年度危險化學(xué)品堆放場地租賃及安全管理合同3篇
- 2025年度特色美食街餐飲資源承包合作合同3篇
- 2025年度星級酒店餐飲部承包經(jīng)營合同范本3篇
- 2025年度塔吊設(shè)備租賃、維修及保養(yǎng)綜合服務(wù)合同4篇
- 2025年度生活用品代購委托合同4篇
- 2025年度塔吊司機職業(yè)健康體檢服務(wù)合同范本2篇
- 2024種植業(yè)土地租賃合同
- 2025年度消防安全責(zé)任合同范本詳解3篇
- 2024版內(nèi)部施工合同
- 2025年工程合作協(xié)議書
- 2025年山東省東營市東營區(qū)融媒體中心招聘全媒體采編播專業(yè)技術(shù)人員10人歷年高頻重點提升(共500題)附帶答案詳解
- 2025年宜賓人才限公司招聘高頻重點提升(共500題)附帶答案詳解
- KAT1-2023井下探放水技術(shù)規(guī)范
- 垃圾處理廠工程施工組織設(shè)計
- 天皰瘡患者護理
- 駕駛證學(xué)法減分(學(xué)法免分)題庫及答案200題完整版
- 2024年四川省瀘州市中考英語試題含解析
- 2025屆河南省九師聯(lián)盟商開大聯(lián)考高一數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 撫養(yǎng)權(quán)起訴狀(31篇)
- 2024年“一崗雙責(zé)”制度(五篇)
評論
0/150
提交評論