【正文】
下還是自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。START WITH子句為可選項(xiàng),用來(lái)標(biāo)識(shí)哪個(gè)節(jié)點(diǎn)作為查找樹(shù)型結(jié)構(gòu)的根節(jié)點(diǎn)。若該子句被省略,則表示所有滿(mǎn)足查詢(xún)條件的行作為根節(jié)點(diǎn)。Start with...Connect By子句遞歸查詢(xún)一般用于一個(gè)表維護(hù)樹(shù)形結(jié)構(gòu)的應(yīng)用。創(chuàng)建示例表:CREATE TABLE TBL_TEST(ID NUMBER,NAME VARCHAR2(100 BYTE),PID NUMBER DEFAULT 0)。插入測(cè)試數(shù)據(jù):INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(39。139。,39。1039。,39。039。)。INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(39。239。,39。1139。,39。139。)。INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(39。339。,39。2039。,39。039。)。INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(39。439。,39。1239。,39。139。)。INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(39。539。,39。12139。,39。239。)。從Root往樹(shù)末梢遞歸select * from TBL_TESTstart with id=1connect by prior id = pidorder by pid從末梢往樹(shù)ROOT遞歸select * from TBL_TESTstart with id=5connect by prior pid = idorder by id**************************************************************************CREATE TABLE xxuts_test_start(ID varchar2(100),NAME VARCHAR2(100))。select id,name,level from xxuts_test_startstart with id=39。A39。connect by prior name=idorder by idid name levelA B 1A C 1A D 1B E 2B F 2C H 2E G 3*************************************************************** SELECT transaction_id, primary_quantity, primary_unit_of_measure, source_doc_unit_of_measure, transaction_type, parent_transaction_id FROM rcv_transactions WHERE invoice_status_code 39。INVOICED39。 added trx date range as per gap228 rsk 07/12/07/*AND TRUNC (transaction_date)BETWEEN TRUNC (NVL (to_date(39。2008060139。,39。YYYYMMDD39。), transaction_date))AND TRUNC (NVL (to_date(39。2008062039。,39。YYYYMMDD39。), transaction_date))*/ START WITH transaction_id = 276195 CONNECT BY parent_transaction_id = PRIOR transaction_id。************************************************** SELECT transaction_id INTO l_rcv_transaction_id FROM rcv_transactions WHERE transaction_type = 39。RECEIVE39。 START WITH transaction_id = 116231 CONNECT BY transaction_id = PRIOR parent_transaction_id。 邏輯讀、物理讀、預(yù)讀邏輯讀是指從內(nèi)存中讀,物理讀是指從磁盤(pán)上讀取數(shù)據(jù)。如果內(nèi)存中存在相應(yīng)的讀取數(shù)據(jù),那么直接從內(nèi)存中讀取,邏輯讀的次數(shù)加1,如果不存在,則從磁盤(pán)上讀到內(nèi)存中,再?gòu)膬?nèi)存中讀取,邏輯度次數(shù)加1,物理讀次數(shù)也加1。(physical read)當(dāng)數(shù)據(jù)塊第一次讀取到,就會(huì)緩存到buffer cache 中,而第二次讀取和修改該數(shù)據(jù)塊時(shí)就在內(nèi)存buffer cache 了(buffer read)邏輯讀指的就是從(或者視圖從)Buffer Cache中讀取數(shù)據(jù)塊。按照訪問(wèn)數(shù)據(jù)塊的模式不同,可以分為即時(shí)讀(Current Read)和一致性讀(Consistent Read)。注意:邏輯IO只有邏輯讀,沒(méi)有邏輯寫(xiě)。即時(shí)讀:即時(shí)讀即讀取數(shù)據(jù)塊當(dāng)前的最新數(shù)據(jù)。任何時(shí)候在Buffer Cache中都只有一份當(dāng)前數(shù)據(jù)塊。即時(shí)讀通常發(fā)生在對(duì)數(shù)據(jù)進(jìn)行修改、刪除操作時(shí)。這時(shí),進(jìn)程會(huì)給數(shù)據(jù)加上行級(jí)鎖,并且標(biāo)識(shí)數(shù)據(jù)為“臟”數(shù)據(jù)。一致性讀Oracle是一個(gè)多用戶(hù)系統(tǒng)。當(dāng)一個(gè)會(huì)話開(kāi)始讀取數(shù)據(jù)還未結(jié)束讀取之前,可能會(huì)有其他會(huì)話修改它將要讀取的數(shù)據(jù)。如果會(huì)話讀取到修改后的數(shù)據(jù),就會(huì)造成數(shù)據(jù)的不一致。一致性讀就是為了保證數(shù)據(jù)的一致性。在Buffer Cache中的數(shù)據(jù)塊上都會(huì)有最后一次修改數(shù)據(jù)塊時(shí)的SCN。如果一個(gè)事務(wù)需要修改數(shù)據(jù)塊中數(shù)據(jù),會(huì)先在回滾段中保存一份修改前數(shù)據(jù)和SCN的數(shù)據(jù)塊,然后再更新Buffer Cache中的數(shù)據(jù)塊的數(shù)據(jù)及其SCN,并標(biāo)識(shí)其為“臟”數(shù)據(jù)。當(dāng)其他進(jìn)程讀取數(shù)據(jù)塊時(shí),會(huì)先比較數(shù)據(jù)塊上的SCN和自己的SCN。如果數(shù)據(jù)塊上的SCN小于等于進(jìn)程本身的SCN,則直接讀取數(shù)據(jù)塊上的數(shù)據(jù);如果數(shù)據(jù)塊上的SCN大于進(jìn)程本身的SCN,則會(huì)從回滾段中找出修改前的數(shù)據(jù)塊讀取數(shù)據(jù)。通常,普通查詢(xún)都是一致性讀。小結(jié):邏輯讀:從數(shù)據(jù)緩存中讀取的頁(yè)數(shù)物理讀:從磁盤(pán)中讀取的頁(yè)數(shù)預(yù)讀:為查詢(xún)放入緩存中的頁(yè)數(shù)邏輯讀就是整個(gè)查詢(xún)最終從數(shù)據(jù)緩存中讀取的頁(yè)數(shù)。 物理讀就是從磁盤(pán)讀取的頁(yè)數(shù)。 預(yù)讀就是SQLServer在分析查詢(xún)自己判斷的、在處理查詢(xún)之前預(yù)先從磁盤(pán)中讀取的頁(yè)數(shù). 當(dāng)預(yù)讀的頁(yè)數(shù)提供的數(shù)據(jù)不能滿(mǎn)足查詢(xún)的結(jié)果時(shí),SQLServer就要發(fā)生物理讀,直接從磁盤(pán)再讀取數(shù)據(jù)頁(yè)。邏輯讀是你的語(yǔ)句(select等)產(chǎn)生的讀數(shù)據(jù)頁(yè)的操作,如果這個(gè)數(shù)據(jù)頁(yè)不在緩存里面,這個(gè)邏輯讀就變成物理讀。所以邏輯讀不是越多越好,邏輯讀多只能說(shuō)明你的緩存大而已,像表掃描就表現(xiàn)為大量的邏輯讀。25 / 25