Oracle程序員面試分類模擬44_第1頁(yè)
Oracle程序員面試分類模擬44_第2頁(yè)
Oracle程序員面試分類模擬44_第3頁(yè)
Oracle程序員面試分類模擬44_第4頁(yè)
Oracle程序員面試分類模擬44_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Oracle程序員面試分類模擬44簡(jiǎn)答題1.

什么是綁定變量窺探?正確答案:同一類型的SQL語(yǔ)句若不使用綁定變量,則當(dāng)具體輸入值一旦發(fā)生了變化,目標(biāo)SQL的SQL文本就會(huì)隨之發(fā)生變化,這樣Orac(江南博哥)le就能很容易地計(jì)算出對(duì)應(yīng)Selectivity和Cardinality的值,進(jìn)而據(jù)此來(lái)制定執(zhí)行計(jì)劃。但對(duì)于使用了綁定變量的目標(biāo)SQL而言,情況就完全不一樣了,因?yàn)楝F(xiàn)在無(wú)論對(duì)應(yīng)綁定變量的具體輸入值是什么,目標(biāo)SQL的SQL文本都是一模一樣的。對(duì)于使用了綁定變量的目標(biāo)SQL而言,Oracle可以選擇如下兩種方法來(lái)決定其執(zhí)行計(jì)劃:

1)使用綁定變量窺探(BindPeeking)。

2)如果不使用綁定變量窺探,那么對(duì)于那些可選擇率可能會(huì)隨著具體輸入值的不同而不同的謂詞條件使用默認(rèn)的可選擇率(例如5%)。

綁定變量窺探(BindPeeking)是在Oracle9i中引入的,是否啟用綁定變量窺探受隱含參數(shù)“_OPTIM_PEEK_LHER_BINDS”的控制,該參數(shù)的默認(rèn)值是TRUE,表示在Oracle9i及其后續(xù)的版本中,默認(rèn)啟用綁定變量窺探。

綁定變量窺探的優(yōu)缺點(diǎn)如下所示:

1)優(yōu)點(diǎn):當(dāng)綁定變量窺探被啟用后,每當(dāng)Oracle以硬解析的方式解析使用了綁定變量的目標(biāo)SQL時(shí),Oracle都會(huì)實(shí)際窺探(Peeking)一下對(duì)應(yīng)綁定變量的具體輸入值,并以這些具體輸入值為標(biāo)準(zhǔn),來(lái)決定這些使用了綁定變量的目標(biāo)SQL的WHERE條件的Selectivity和Cardinality的值,并據(jù)此來(lái)選擇該SQL的執(zhí)行計(jì)劃。需要注意的是,這里這個(gè)“窺探(Peeking)”的動(dòng)作只有在硬解析的時(shí)候才會(huì)執(zhí)行,當(dāng)使用了綁定變量的目標(biāo)SQL再次執(zhí)行時(shí)(此時(shí)對(duì)應(yīng)的是軟解析/軟軟解析),即便此時(shí)對(duì)應(yīng)綁定變量的具體輸入值和之前硬解析時(shí)對(duì)應(yīng)的值不同,Oracle也會(huì)沿用之前硬解析時(shí)所產(chǎn)生的解析樹(shù)和執(zhí)行計(jì)劃,而不再重復(fù)執(zhí)行上述“窺探”的動(dòng)作。因?yàn)橛辛私壎ㄗ兞扛Q探,所以,Oracle在計(jì)算目標(biāo)SQL的WHERE條件的Selectivity和Cardinality的值時(shí),就可以避免使用默認(rèn)的可選擇率,這樣就有更大的可能性能得到該SQL準(zhǔn)確的執(zhí)行計(jì)劃。

2)缺點(diǎn):對(duì)于那些執(zhí)行計(jì)劃可能會(huì)隨著對(duì)應(yīng)綁定變量具體輸入值的不同而變化的目標(biāo)SQL而言,一旦啟用了綁定變量窺探,其執(zhí)行計(jì)劃就會(huì)被固定下來(lái),至于這個(gè)固定下來(lái)的執(zhí)行計(jì)劃到底是什么,則完全倚賴于該SQL在硬解析時(shí)傳入的對(duì)應(yīng)綁定變量的具體值。這意味著一旦啟用了綁定變量窺探,目標(biāo)SQL在后續(xù)執(zhí)行時(shí)就只會(huì)沿用之前硬解析所產(chǎn)生的解析樹(shù)和執(zhí)行計(jì)劃,即使當(dāng)時(shí)的執(zhí)行計(jì)劃和解析樹(shù)并不適合于新傳入的值。

關(guān)于綁定變量窺探需要注意以下幾點(diǎn):

1)在Oracle11g中引入自適應(yīng)游標(biāo)共享后,綁定變量窺探這種不管后續(xù)傳入的綁定變量的具體輸入值是什么而一直沿用之前硬解析時(shí)所產(chǎn)生的解析樹(shù)和執(zhí)行計(jì)劃的缺點(diǎn)才有所緩解。

2)在不改變SQL語(yǔ)句文本的情況下,讓SQL語(yǔ)句重新進(jìn)行硬解析的方法有:①對(duì)SQL語(yǔ)句涉及的對(duì)象執(zhí)行DDL操作(例如COMMENT語(yǔ)句)。②執(zhí)行DBMS_SHARED_POOL.PURGE來(lái)刪除共享池中的游標(biāo)。③在重新收集統(tǒng)計(jì)信息時(shí)指定NO_INVALIDATE=>FALSE選項(xiàng)。

2.

B/S與C/S有什么區(qū)別?正確答案:C/S是Client/Server(客戶端朋艮務(wù)器)的縮寫,在C/S架構(gòu)中,服務(wù)器通常采用高性能的PC、工作站或者小型機(jī),而且采用大型數(shù)據(jù)庫(kù)系統(tǒng),如SQLServer、DB2、Oracle或Sybase等。客戶端需要安裝專用的客戶端軟件。

B/S是Brower/Server(瀏覽器/服務(wù)器)的縮寫,客戶端通常只需要安裝一個(gè)瀏覽器(Browser),如Firefox、IE、Chrome等即可,服務(wù)器安裝SQLServer、DB2、Oracle或Sybase等數(shù)據(jù)庫(kù)。在B/S架構(gòu)中,用戶界面完全通過(guò)瀏覽器實(shí)現(xiàn),一部分事務(wù)邏輯在前端實(shí)現(xiàn),主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。瀏覽器通過(guò)Web服務(wù)器同數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互。

具體而言,兩種設(shè)計(jì)結(jié)構(gòu)存在以下幾個(gè)方面的區(qū)別:

(1)硬件要求不同C/S一般建立在專用的網(wǎng)絡(luò)上,是小范圍的網(wǎng)絡(luò)環(huán)境;而B(niǎo)/S一般構(gòu)建于廣域網(wǎng)之上,不需要專門的網(wǎng)絡(luò)硬件環(huán)境,只要能接入網(wǎng)絡(luò)即可。在B/S架構(gòu)的應(yīng)用中,客戶端只需要能夠運(yùn)行瀏覽器就可以了。

(2)架構(gòu)要求不同C/S程序更加注重流程,需要對(duì)權(quán)限多層次校驗(yàn),對(duì)系統(tǒng)運(yùn)行速度可以較少考慮。而B(niǎo)/S對(duì)安全以及訪問(wèn)速度需要多重的考慮,建立在需要更加優(yōu)化的基礎(chǔ)之上,比C/S有更高的要求。

(3)安全要求不同C/S一般面向相對(duì)固定的用戶群,對(duì)信息安全的控制能力很強(qiáng)。一般高度機(jī)密的信息系統(tǒng)適宜采用C/S結(jié)構(gòu),可以通過(guò)B/S發(fā)布部分可以公開(kāi)的信息。B/S構(gòu)建在廣域網(wǎng)之上,對(duì)安全的控制能力相對(duì)弱,可能面向不可知的用戶。

(4)系統(tǒng)維護(hù)不同C/S程序由于整體性導(dǎo)致升級(jí)比較困難,可能需要重做一個(gè)全新的系統(tǒng),而B(niǎo)/S基于構(gòu)件組成,只需要進(jìn)行構(gòu)建局部的更換就可以實(shí)現(xiàn)系統(tǒng)的無(wú)縫升級(jí),將系統(tǒng)維護(hù)開(kāi)銷減到最小,用戶從網(wǎng)上自己下載安裝就可以實(shí)現(xiàn)升級(jí)。

(5)軟件的重用性不同因?yàn)檎w性考慮,C/S程序中構(gòu)件的重用性不如在B/S架構(gòu)下的構(gòu)件的重用性好。因?yàn)锽/S的多重結(jié)構(gòu),要求構(gòu)件相對(duì)獨(dú)立的功能,能夠相對(duì)較好的重用,而C/S則很難做到這一點(diǎn)。

(6)用戶接口不同C/S多是建立在操作系統(tǒng)平臺(tái)上,表現(xiàn)方法有限,而B(niǎo)/S建立在瀏覽器上,有更加豐富和生動(dòng)的表現(xiàn)方式與用戶交流,并且大部分難度小,成本低。

3.

事務(wù)的4種隔離級(jí)別(IsolationLevel)分別是什么?正確答案:當(dāng)多個(gè)線程都開(kāi)啟事務(wù)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)要能進(jìn)行隔離操作,以保證各個(gè)線程獲取數(shù)據(jù)的準(zhǔn)確性,所以,對(duì)于不同的事務(wù),采用不同的隔離級(jí)別會(huì)有不同的結(jié)果。如果不考慮事務(wù)的隔離性,那么會(huì)發(fā)生3種問(wèn)題,見(jiàn)表1。

臟讀和不可重復(fù)讀的區(qū)別為:臟讀是某一事務(wù)讀取了另一個(gè)事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是在同一個(gè)事務(wù)范圍內(nèi)多次查詢同一條數(shù)據(jù)卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔期間,該條數(shù)據(jù)被另一個(gè)事務(wù)修改并提交了。

幻讀和不可重復(fù)讀的區(qū)別為:幻讀和不可重復(fù)讀都是讀取了另一個(gè)事務(wù)中已經(jīng)提交的數(shù)據(jù),不同的是不可重復(fù)讀查詢的都是同一個(gè)數(shù)據(jù)項(xiàng),而幻讀針對(duì)的是一個(gè)數(shù)據(jù)整體(例如,數(shù)據(jù)的條數(shù))。

在SQL標(biāo)準(zhǔn)中定義了4種隔離級(jí)別,每一種級(jí)別都規(guī)定了一個(gè)事務(wù)中所做的修改,哪些是在事務(wù)內(nèi)和事務(wù)間可見(jiàn)的,哪些是不可見(jiàn)的。較低級(jí)別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開(kāi)銷也更低。SQL標(biāo)準(zhǔn)定義的4個(gè)隔離級(jí)別為:ReadUncommitted(未提交讀)、ReadCommitted(提交讀)、RepeatableRead(可重復(fù)讀)、Serializable(可串行化)。下面分別介紹。

1.ReadUncommitted(未提交讀,讀取未提交內(nèi)容)

在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果,即在未提交讀級(jí)別,事務(wù)中的修改,即使沒(méi)有提交,對(duì)其他事務(wù)也都是可見(jiàn)的,該隔離級(jí)別很少用于實(shí)際應(yīng)用。讀取未提交的數(shù)據(jù),也被稱之為臟讀(DirtyRead)。該隔離級(jí)別最低,并發(fā)性能最高。

2.ReadCommitted(提交讀,讀取提交內(nèi)容)

這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變。換句話說(shuō),一個(gè)事務(wù)從開(kāi)始直到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見(jiàn)的。

3.RepeatableRead(可重復(fù)讀)

可重復(fù)讀可以確保同一個(gè)事務(wù),在多次讀取同樣的數(shù)據(jù)的時(shí)候,得到同樣的結(jié)果??芍貜?fù)讀解決了臟讀的問(wèn)題,不過(guò)理論上,這會(huì)導(dǎo)致另一個(gè)棘手的問(wèn)題:幻讀(PhantomRead)。MySQL數(shù)據(jù)庫(kù)中的InnoDB和Falcon存儲(chǔ)引擎通過(guò)MVCC(Multi-VersionConcurrentControl,多版本并發(fā)控制)機(jī)制解決了該問(wèn)題。需要注意的是,多版本只是解決不可重復(fù)讀問(wèn)題,而加上間隙鎖(也就是它這里所謂的并發(fā)控制)才解決了幻讀問(wèn)題。

4.Serializable(可串行化、序列化)

這是最高的隔離級(jí)別,它通過(guò)強(qiáng)制事務(wù)排序,強(qiáng)制事務(wù)串行執(zhí)行,使之不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。實(shí)際應(yīng)用中也很少用到這個(gè)隔離級(jí)別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒(méi)有并發(fā)的情況下,才考慮用該級(jí)別。這是花費(fèi)代價(jià)最高但是最可靠的事務(wù)隔離級(jí)別。

不同的隔離級(jí)別有不同的現(xiàn)象,并有不同的鎖和并發(fā)機(jī)制,隔離級(jí)別越高,數(shù)據(jù)庫(kù)的并發(fā)性就越差,4種事務(wù)隔離級(jí)別分別表現(xiàn)的現(xiàn)象見(jiàn)表2。

4.

ASM文件和OS文件互相轉(zhuǎn)換有哪些方法?正確答案:主要采用setnewname、convertdatafile、dbms_file_transfer.copy_file、backupascopydatafile、alterdatabaserenamefile這幾種辦法。

5.

數(shù)據(jù)庫(kù)的約束有哪些?正確答案:在數(shù)據(jù)庫(kù)表的開(kāi)發(fā)中,約束是必不可少的,使用約束可以更好地保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性。

1.約束(CONSTRAINT)

數(shù)據(jù)的完整性是指數(shù)據(jù)的正確性和一致性,可以在定義表時(shí)定義完整性約束,也可以通過(guò)索引或觸發(fā)器等方式定義完整性約束。約束分為兩類:行級(jí)和表級(jí),二者處理機(jī)制是一樣的。行級(jí)約束放在列后,表級(jí)約束放在表后,多個(gè)列共用的約束放在表后。

完整性約束是一種規(guī)則,不占用任何數(shù)據(jù)庫(kù)空間。它存在數(shù)據(jù)字典中,在執(zhí)行SQL或PL/SQL期間使用。用戶可以指明約束是啟用還是禁用,當(dāng)約束啟用時(shí),它增強(qiáng)了數(shù)據(jù)的完整性,否則,約束始終存在于數(shù)據(jù)字典中。

2.約束類型

約束主要分為以下五種不同類型:主鍵約束、唯一約束、檢查約束、非空約束和外鍵約束。

(1)主鍵約束(PrimaryKey)主鍵是一個(gè)唯一的標(biāo)識(shí),本身不能為空,即主鍵必須非空且唯一。例如:身份證編號(hào)是唯一的,不可重復(fù),不可為空。

(2)唯一約束(UNIQUE)在一個(gè)表中,只允許建立一個(gè)主鍵約束,而對(duì)于其他列,如果不希望出現(xiàn)重復(fù)值的話,那么可以使用唯一約束。

(3)檢查約束(CHECK)檢查一列的內(nèi)容是否合法。例如性別,只能是男或女。

(4)非空約束(NOTNULL)員工生日這樣的字段里面的內(nèi)容就不能為空。

(5)外鍵約束(ForeignKey)在兩張表中進(jìn)行約束操作。主鍵是一個(gè)非空且唯一的約束,外鍵是在兩張表中進(jìn)行約束,外鍵的取值必須是參照的主鍵值或空值。

關(guān)系型數(shù)據(jù)庫(kù)中的一條記錄中有若干個(gè)屬性,如果其中某一個(gè)屬性組(注意是組)能唯一標(biāo)識(shí)一條記錄,那么該屬性組就可以成為一個(gè)主鍵。

例如:學(xué)生表(學(xué)號(hào),姓名,性別,班級(jí))其中,每個(gè)學(xué)生的學(xué)號(hào)是唯一的,學(xué)號(hào)就是一個(gè)主鍵。

課程表(課程編號(hào),課程名,學(xué)分)其中,課程編號(hào)是唯一的,課程編號(hào)就是一個(gè)主鍵。

成績(jī)表(學(xué)號(hào),課程號(hào),成績(jī))其中,成績(jī)表中單一一個(gè)屬性無(wú)法唯一標(biāo)識(shí)一條記錄,學(xué)號(hào)和課程號(hào)的組合才可以唯一標(biāo)識(shí)一條記錄,所以,學(xué)號(hào)和課程號(hào)的屬性組是一個(gè)主鍵。

成績(jī)表中的學(xué)號(hào)不是成績(jī)表的主鍵,但它和學(xué)生表中的學(xué)號(hào)相對(duì)應(yīng),并且學(xué)生表中的學(xué)號(hào)是學(xué)生表的主鍵,則稱成績(jī)表中的學(xué)號(hào)是學(xué)生表的外鍵;同理,成績(jī)表中的課程號(hào)是課程表的外鍵。

表的主鍵和外鍵的作用如下:

1)當(dāng)插入非空值時(shí),若主鍵表中沒(méi)有這個(gè)值,則不能插入。

2)當(dāng)更新外鍵時(shí),不能改為主鍵表中沒(méi)有的值。

3)當(dāng)刪除主鍵表記錄時(shí),可以在創(chuàng)建外鍵約束時(shí)選定外鍵記錄一起級(jí)聯(lián)刪除還是拒絕刪除。

4)當(dāng)更新主鍵記錄時(shí),同樣有級(jí)聯(lián)更新和拒絕執(zhí)行的選擇。

表的主鍵和外鍵就是起約束作用,定義主鍵和外鍵主要是為了維護(hù)關(guān)系型數(shù)據(jù)庫(kù)的完整性,在使用主鍵與外鍵時(shí),通常需要注意以下內(nèi)容:

1)主鍵是能確定一條記錄的唯一標(biāo)識(shí),例如,一條記錄包括身份證號(hào)、姓名和年齡。身份證號(hào)是唯一能確定一個(gè)人的個(gè)人信息,其他信息都可能有重復(fù),但是身份證卻不能重復(fù),所以,身份證號(hào)是主鍵。

2)外鍵用于與另一張表進(jìn)行關(guān)聯(lián)。它能確定另一張表記錄的字段,用于保持?jǐn)?shù)據(jù)的一致性。例如,A表中的一個(gè)字段,是B表的主鍵,那它就是A表的外鍵。

6.

>,<一般情況下會(huì)走索引嗎?正確答案:會(huì),使用的是索引范圍掃描。

7.

imp工具的ignore參數(shù)有什么作用?正確答案:Oracle在恢復(fù)數(shù)據(jù)的過(guò)程中,當(dāng)恢復(fù)某個(gè)表時(shí),如果該表已經(jīng)存在,就要根據(jù)ignore參數(shù)的設(shè)置來(lái)決定如何操作。若ignore為Y時(shí),則Oracle不執(zhí)行CREATETABLE語(yǔ)句,直接將數(shù)據(jù)插入到表中。如果插入的記錄違背了約束條件(例如主鍵約束),那么出錯(cuò)的記錄不會(huì)插入,但合法的記錄會(huì)添加到表中。若ignore為N時(shí),則Oracle不執(zhí)行CREATETABLE語(yǔ)句,同時(shí)也不會(huì)將數(shù)據(jù)插入到表中,而是忽略該表的錯(cuò)誤,繼續(xù)恢復(fù)下一個(gè)表,默認(rèn)值為N。

8.

如何統(tǒng)計(jì)文件a.txt有多少非空行?正確答案:

9.

存儲(chǔ)過(guò)程或函數(shù)如何返回集合類型?正確答案:TABLE()函數(shù)可接受查詢語(yǔ)句或游標(biāo)作為輸入?yún)?shù),并可輸出多行數(shù)據(jù),稱為表函數(shù)。所以,存儲(chǔ)過(guò)程或函數(shù)返回集合類型主要采用的是表函數(shù)和PIPELINED函數(shù)(管道化表函數(shù))及數(shù)組結(jié)合的方式。當(dāng)然,也可以采用存儲(chǔ)過(guò)程返回系統(tǒng)游標(biāo)SYS_REFCURSOR或自定義游標(biāo)的方式。

有關(guān)存儲(chǔ)過(guò)程或函數(shù)返回集合類型的寫法有多種,作者把這多種方式寫成了一個(gè)包,己發(fā)布到博客和公眾號(hào)上,讀者可白行下載閱讀。

10.

什么是存儲(chǔ)過(guò)程?它有什么優(yōu)點(diǎn)?正確答案:存儲(chǔ)過(guò)程是用戶定義的一系列SQL語(yǔ)句的集合,涉及特定表或其他對(duì)象的任務(wù),用戶可以調(diào)用存儲(chǔ)過(guò)程,而函數(shù)通常是數(shù)據(jù)庫(kù)已定義的方法,它接收參數(shù)并返回某種類型的值并且不涉及特定用戶表。

存儲(chǔ)過(guò)程用于執(zhí)行特定的操作,可以接受輸入?yún)?shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集。在創(chuàng)建存儲(chǔ)過(guò)程時(shí),既可以指定輸入?yún)?shù)(IN),也可以指定輸出參數(shù)(OUT),通過(guò)在存儲(chǔ)過(guò)程中使用輸入?yún)?shù),可以將數(shù)據(jù)傳遞到執(zhí)行部分;通過(guò)使用輸出參數(shù),可以將執(zhí)行結(jié)果傳遞到應(yīng)用環(huán)境。存儲(chǔ)過(guò)程可以使對(duì)數(shù)據(jù)庫(kù)的管理、顯示數(shù)據(jù)庫(kù)及其用戶信息的工作更加容易。

存儲(chǔ)過(guò)程存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi),可由應(yīng)用程序調(diào)用執(zhí)行。存儲(chǔ)過(guò)程允許用戶聲明變量并且可包含程序流、邏輯以及對(duì)數(shù)據(jù)庫(kù)的查詢。

具體而言,存儲(chǔ)過(guò)程的優(yōu)點(diǎn)如下:

1)存儲(chǔ)過(guò)程增強(qiáng)了SQL語(yǔ)言的功能和靈活性。存儲(chǔ)過(guò)程可以用流控制語(yǔ)句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和運(yùn)算。

2)存儲(chǔ)過(guò)程可保證數(shù)據(jù)的安全性。通過(guò)存儲(chǔ)過(guò)程可以使沒(méi)有權(quán)限的用戶在權(quán)限控制之下間接地存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),從而保證數(shù)據(jù)的安全。

3)通過(guò)存儲(chǔ)過(guò)程可以使相關(guān)的動(dòng)作在一起發(fā)生,從而維護(hù)數(shù)據(jù)庫(kù)的完整性。

4)在運(yùn)行存儲(chǔ)過(guò)程前,數(shù)據(jù)庫(kù)己對(duì)其進(jìn)行了語(yǔ)法和句法分析,并給出了優(yōu)化執(zhí)行方案。這種已經(jīng)編譯好的過(guò)程可極大地改善SQL語(yǔ)句的性能。由于執(zhí)行SQL語(yǔ)句的大部分工作已經(jīng)完成,所以,存儲(chǔ)過(guò)程能以極快的速度執(zhí)行。

5)可以降低網(wǎng)絡(luò)的通信量,因?yàn)椴恍枰ㄟ^(guò)網(wǎng)絡(luò)來(lái)傳送很多SQL語(yǔ)句到數(shù)據(jù)庫(kù)服務(wù)器。

6)把體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入數(shù)據(jù)庫(kù)服務(wù)器中,以便集中控制。當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),在數(shù)據(jù)庫(kù)中改變存儲(chǔ)過(guò)程即可,無(wú)須修改任何應(yīng)用程序。企業(yè)規(guī)則的特點(diǎn)是要經(jīng)常變化,如果把體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入應(yīng)用程序中,那么當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),就需要修改應(yīng)用程序,工作量非常之大(修改、發(fā)行和安裝應(yīng)用程序)。如果把體現(xiàn)企業(yè)規(guī)則的運(yùn)算放入存儲(chǔ)過(guò)程中,那么當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),只要修改存儲(chǔ)過(guò)程就可以了,應(yīng)用程序無(wú)須任何變化。

在Oracle中,創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)法如下:

說(shuō)明:

1)局部變量的類型可以帶取值范圍,后面接分號(hào)。

2)在判斷語(yǔ)句前最好先用COUNT(*)函數(shù)判斷是否存在該條操作記錄。

3)ORREPLACE選項(xiàng)是當(dāng)此存儲(chǔ)過(guò)程存在時(shí)覆蓋此存儲(chǔ)過(guò)程,參數(shù)部分和過(guò)程定義的語(yǔ)法相同。

4)在創(chuàng)建存儲(chǔ)過(guò)程時(shí),既可以指定存儲(chǔ)過(guò)程的參數(shù),也可以不提供任何參數(shù)。

5)存儲(chǔ)過(guò)程的參數(shù)主要有三種類型:輸入?yún)?shù)(IN)、輸出參數(shù)(OUT)、輸入輸出參數(shù)(INOUT),其中IN用于接收調(diào)用環(huán)境的輸入?yún)?shù),OUT用于將輸出數(shù)據(jù)傳遞到調(diào)用環(huán)境,INOUT不僅要接收數(shù)據(jù),而且要輸出數(shù)據(jù)到調(diào)用環(huán)境。類型可以使用任意Oracle中的合法類型(包括集合類型),存儲(chǔ)過(guò)程參數(shù)不帶取值范圍。

6)在建立存儲(chǔ)過(guò)程時(shí),輸入?yún)?shù)的IN可以省略。

7)創(chuàng)建存儲(chǔ)過(guò)程要有CREATEPROCEDURE或CREATEANYPROCEDURE權(quán)限。如果要運(yùn)行存儲(chǔ)過(guò)程,那么必須是這個(gè)存儲(chǔ)過(guò)程的創(chuàng)建者或者有這個(gè)存儲(chǔ)過(guò)程的EXECUTE權(quán)限(GRANTEXECUTEONLHR.PRO_TEST_LHRTOLHR;)。如果要編輯其他用戶下的存儲(chǔ)過(guò)程或包,那么必須有CREATEANYPROCEDURE權(quán)限(GRANTCREATEANYPROCEDURETOLHR;)。如果要調(diào)試某個(gè)存儲(chǔ)過(guò)程,那么必須有DEBUG權(quán)限(GRANTDEBUGONLHR.PRO_TEST_LHRTOLHR;)。

8)關(guān)于SELECT...INTO...

①在存儲(chǔ)過(guò)程中,當(dāng)SELECT某一字段時(shí),后面必須緊跟INTO。將SELECT查詢的結(jié)果存入到變量中,可以同時(shí)將多個(gè)列存儲(chǔ)多個(gè)變量中,必須有一條記錄,否則拋出異常(若沒(méi)有記錄則拋出NO_DATA_FOUND)。如下:

②在利用SELECT...INTO...時(shí),必須先確保數(shù)據(jù)庫(kù)中有該條記錄,否則會(huì)報(bào)錯(cuò)“nodatafound”??梢栽谠撜Z(yǔ)句之前,先利用“SELECTCOUNT(*)FROMT_LHR;”查看數(shù)據(jù)庫(kù)中是否存在該記錄,若存在,則再利用SELECT...INTO...。

11.

表T1如下:IDCREATETIMENUM_DB_FILESVERSION12016/12/1923:5573

22016/12/200:0073

4012016/12/220:0076

8012016/12/240:0076

8022016/12/250:0076

16012016/12/290:0082

24012017/1/50:0076

26012017/1/6O:0076

28012017/1/70:0076

82022017/3/977

84012017/3/100:0077

請(qǐng)編寫存儲(chǔ)過(guò)程,更新上表中的VERSION列:IDCREATETIMENUM_DB_FILESVERSI0N12016/12/1923:5573122016/12/200:007314012016/12/220:007628012016/12/240:007628022016/12/250:0076216012016/12/290:0082324012017/1/50:0076426012017/1/60:0076428012017/1/70:0076482022017/3/977584012017/3/100:00775正確答案:存儲(chǔ)過(guò)程如下,主要采用游標(biāo)FOR循環(huán)進(jìn)行更新:

需要注意的是,該段程序并沒(méi)有考慮主鍵,索引,表的數(shù)據(jù)量等問(wèn)題。若是數(shù)據(jù)量大的話,可以考慮分批更新。

12.

庫(kù)函數(shù)調(diào)用與系統(tǒng)調(diào)用有什么不同?正確答案:庫(kù)函數(shù)調(diào)用是語(yǔ)言或應(yīng)用程序的一部分,它是高層的,完全運(yùn)行在用戶空間,為程序員提供調(diào)用真正的在幕后完成實(shí)際事務(wù)的系統(tǒng)調(diào)用接口。而系統(tǒng)函數(shù)是內(nèi)核提供給應(yīng)用程序的接口,屬于系統(tǒng)的一部分。函數(shù)庫(kù)調(diào)用是語(yǔ)言或應(yīng)用程序的一部分,而系統(tǒng)調(diào)用是操作系統(tǒng)的一部分。

庫(kù)函數(shù)調(diào)用與系統(tǒng)調(diào)用的區(qū)別見(jiàn)下表。庫(kù)函數(shù)調(diào)用與系統(tǒng)調(diào)用的區(qū)別庫(kù)函數(shù)調(diào)用系統(tǒng)調(diào)用在所有的ANSIC編譯器版本中,C語(yǔ)言庫(kù)函數(shù)是相同的各個(gè)操作系統(tǒng)的系統(tǒng)調(diào)用是不同的它調(diào)用函數(shù)庫(kù)中的一段程序(或函數(shù))它調(diào)用系統(tǒng)內(nèi)核的服務(wù)與用戶程序相聯(lián)系是操作系統(tǒng)的一個(gè)入口點(diǎn)在用戶地址空間執(zhí)行在內(nèi)核地址空間執(zhí)行它的運(yùn)行時(shí)間屬于“用戶時(shí)間”它的運(yùn)行屬于“系統(tǒng)時(shí)間”屬于過(guò)程調(diào)用,調(diào)用開(kāi)銷較小需要在用戶空間和內(nèi)核上下文環(huán)境間切換,開(kāi)銷較大在C函數(shù)庫(kù)libc中有大約300個(gè)函數(shù)在Unix中有大約90個(gè)系統(tǒng)調(diào)用典型的C函數(shù)庫(kù)調(diào)用:system、fprintf和malloc等典型的系統(tǒng)調(diào)用:chdir、fork、write和brk等

庫(kù)函數(shù)調(diào)用通常比行內(nèi)展開(kāi)的代碼慢,因?yàn)樗枰冻龊瘮?shù)調(diào)用的時(shí)間耗費(fèi)。但系統(tǒng)調(diào)用比庫(kù)函數(shù)調(diào)用還要慢很多,因?yàn)樗枰焉舷挛沫h(huán)境切換到內(nèi)核模式。

13.

行鏈接和行遷移有什么區(qū)別?正確答案:當(dāng)一行的數(shù)據(jù)過(guò)長(zhǎng)而不能存儲(chǔ)在單個(gè)數(shù)據(jù)塊中時(shí),可能發(fā)生兩種事情:行鏈接(RowChaining)或行遷移(RowMigration)。

1)行鏈接(RowChaining):當(dāng)?shù)谝淮尾迦胄袝r(shí),由于行太長(zhǎng)而不能容納在一個(gè)數(shù)據(jù)塊中時(shí),就會(huì)發(fā)生行鏈接。在這種情況下,Oracle會(huì)使用與該塊鏈接的一個(gè)或多個(gè)數(shù)據(jù)塊來(lái)容納該行的數(shù)據(jù)。行鏈接經(jīng)常在插入比較大的行時(shí)才會(huì)發(fā)生,例如包含LONG、LONGROW、LOB等類型的數(shù)據(jù)。在這些情況下,行鏈接是不可避免的。行鏈接通常由INSERT操作引起。

2)行遷移(RowMigration):當(dāng)一個(gè)行上的更新操作導(dǎo)致當(dāng)前的數(shù)據(jù)增加以致于不能再容納在當(dāng)前塊,這個(gè)時(shí)候就需要進(jìn)行行遷移,在這種情況下,Oracle將會(huì)遷移整行數(shù)據(jù)到一個(gè)新的數(shù)據(jù)塊中。一個(gè)行遷移意味著整行數(shù)據(jù)都將會(huì)移動(dòng),原始的數(shù)據(jù)塊上僅僅保留的是指向新塊的一個(gè)地址信息。發(fā)生行遷移的時(shí)候行的ROWID不會(huì)改變。行遷移的情況主要是由于表上的PCTFREE參數(shù)設(shè)置過(guò)小導(dǎo)致,所以必須設(shè)置一個(gè)合適的PCTFREE參數(shù)??梢允褂胑xp/imp工具導(dǎo)入導(dǎo)出來(lái)處理行遷移。行遷移通常由UPDATE操作引起。

14.

什么是大文件表空間(BigfileTablespace)?正確答案:Oracle表空間是邏輯結(jié)構(gòu)的最高層次,而物理層面的Oracle數(shù)據(jù)庫(kù)是通過(guò)一系列的文件構(gòu)成。表空間與數(shù)據(jù)文件的關(guān)系是一對(duì)多的關(guān)系,一個(gè)表空間可以對(duì)應(yīng)多個(gè)數(shù)據(jù)文件,一個(gè)數(shù)據(jù)文件則只能歸屬于一個(gè)表空間。從Oracle10g開(kāi)始推出了大文件表空間的概念,即表空間從Oracle10g以后就分為兩種類型,小文件表空間(SmallfileTablespace)和大文件表空間(BigfileTablespace)。所謂大文件表空間最顯著的特點(diǎn)就是一個(gè)表空間只能對(duì)應(yīng)一個(gè)數(shù)據(jù)文件。大文件表空間雖只對(duì)應(yīng)一個(gè)數(shù)據(jù)文件,但數(shù)據(jù)文件對(duì)應(yīng)的最大體積大大增加,可以達(dá)到32TB。傳統(tǒng)的小文件表空間中每個(gè)數(shù)據(jù)文件最大文件大小為32G,但每個(gè)小文件表空間理論上能夠包括1024個(gè)數(shù)據(jù)文件,所以,小文件表空間的最大值為32TB大小。所以,理論上小文件表空間和大文件表空間總?cè)萘肯嗤?/p>

大文件表空間都是為超大型數(shù)據(jù)庫(kù)設(shè)計(jì)的。如果一個(gè)超大型數(shù)據(jù)庫(kù)具有上千個(gè)數(shù)據(jù)文件的話,更新數(shù)據(jù)文件頭部信息的操作就會(huì)花費(fèi)很長(zhǎng)時(shí)間。如果使用了大文件表空間,就可以使用大數(shù)據(jù)文件來(lái)減少數(shù)據(jù)文件的數(shù)量,使更新數(shù)據(jù)文件頭部信息的操作更快一些。

要想創(chuàng)建一個(gè)大文件表空間,可以在CREATE語(yǔ)句中使用BIGFILE關(guān)鍵字。例如:“CREATEBIGFILETABLESPACEmybigtbs01DATAFILE'f:\bigtbs01.dbf'SIZE20G;”。此處,通過(guò)“CREATEBIGFILETABLESPACE”語(yǔ)句建立大文件表空間,需要注意兩方面的問(wèn)題,其一是大文件表空間必須使用本地區(qū)(LOCALEXTENT)管理方式,不允許使用DMT(DictionaryManagedTablespace)。另一方面是段SEGMENT空間使用AUTO自動(dòng)方式,不要使用MANUAL。

SYSTEM和SYSAUX表空間總是被創(chuàng)建為小文件表空間。想要?jiǎng)?chuàng)建一個(gè)小文件表空間,可以在CREATE語(yǔ)句中使用SMALLFILE關(guān)鍵字或者不使用此類關(guān)鍵字。例如:“CREATESMALLFILETEMPORARYTABLESPACElhrtbs01TEMPFILE'e:\tmptbs01_1.dbf'SIZE4MUNIFORMSIZE64K;”。

要想知道系統(tǒng)默認(rèn)創(chuàng)建的是SMALLFILE還是BIGFILE的表空間,可以執(zhí)行如下的查詢:

可以通過(guò)命令“ALTERDATABASESETDEFAULTBIGFILETABLESPACE;”來(lái)修改系統(tǒng)默認(rèn)的表空間類型。建議創(chuàng)建表空間時(shí)最好帶上BIGFILE或SMALLFILE參數(shù),以免參數(shù)設(shè)置導(dǎo)致創(chuàng)建了不合理的表空間。

15.

查詢轉(zhuǎn)換包含哪些類型?正確答案:在Oracle數(shù)據(jù)庫(kù)中,用戶發(fā)給Oracle讓其執(zhí)行的目標(biāo)SQL和Oracle實(shí)際執(zhí)行的SQL有可能是不同的,這是因?yàn)镺racle可能會(huì)對(duì)執(zhí)行的目標(biāo)SQL做等價(jià)改寫,即查詢轉(zhuǎn)換。查詢轉(zhuǎn)換(QueryTransformation),也稱為邏輯優(yōu)化(LogicalOptimization),又稱為查詢改寫(QueryRewrite)或軟優(yōu)化,即查詢轉(zhuǎn)換器在邏輯上對(duì)語(yǔ)句做一些語(yǔ)義等價(jià)轉(zhuǎn)換,它是Oracle在解析目標(biāo)SQL的過(guò)程中的非常重要的一步。查詢轉(zhuǎn)換能使優(yōu)化器將目標(biāo)SQL改寫成語(yǔ)義上完全等價(jià)的SQL語(yǔ)句但生成的執(zhí)行計(jì)劃效率更高。

查詢轉(zhuǎn)換器依據(jù)特定的方式?jīng)Q定是否對(duì)查詢塊進(jìn)行轉(zhuǎn)換。按照其所依賴的方式,轉(zhuǎn)換技術(shù)可以分為兩類:①啟發(fā)式查詢轉(zhuǎn)換(HeuristicQueryTransformation),又稱為基于規(guī)則的查詢轉(zhuǎn)換(RuleBasedQueryTransformarion),啟發(fā)式查詢轉(zhuǎn)換是基于一套規(guī)則對(duì)查詢進(jìn)行轉(zhuǎn)換,一旦滿足規(guī)則所定義的條件,則對(duì)語(yǔ)句進(jìn)行相應(yīng)的轉(zhuǎn)換。啟發(fā)式查詢轉(zhuǎn)換需要從10053事件信息中查找有關(guān)查詢轉(zhuǎn)換的線索,并且許多跟蹤記錄僅能從Oracle11g的跟蹤信息中發(fā)現(xiàn)。②基于代價(jià)的查詢轉(zhuǎn)換(CostBasedQueryTransformation,CBOT)。基于代價(jià)的查詢轉(zhuǎn)換是否對(duì)語(yǔ)句進(jìn)行轉(zhuǎn)換則取決于語(yǔ)義等價(jià)語(yǔ)句之間的代價(jià)對(duì)比,即采用代價(jià)最小的一種。大多數(shù)基于代價(jià)的查詢轉(zhuǎn)換可以從執(zhí)行計(jì)劃的概要數(shù)據(jù)中找到線索。Oracle提供了一個(gè)隱含參數(shù)“_OPTIMIZER_COST_BASED_TRANSFORMATION”用以控制是否進(jìn)行基于代價(jià)的查詢轉(zhuǎn)換,以及如何進(jìn)行基于代價(jià)的查詢轉(zhuǎn)換,從而限制其對(duì)資源的消耗。

Oracle中常見(jiàn)的查詢轉(zhuǎn)換分類如圖所示。

常見(jiàn)的查詢轉(zhuǎn)換分類

Oracle中常見(jiàn)的查詢轉(zhuǎn)換分類詳解見(jiàn)表。

關(guān)于上表中的內(nèi)容需要注意以下幾點(diǎn):

1)子查詢展開(kāi)通常都會(huì)提高原SQL的執(zhí)行效率,因?yàn)槿绻璖QL不進(jìn)行子查詢展開(kāi),那么通常情況下該子查詢就會(huì)在其執(zhí)行計(jì)劃的最后一步才被執(zhí)行,并且會(huì)以FILTER類型的執(zhí)行計(jì)劃,這也就意味

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論