版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、通過分析SQL語句的執(zhí)行計劃優(yōu)化SQL通過分析SQL語句的執(zhí)行計劃優(yōu)化SQL第1章 性能調(diào)整綜述第2章 有效的應(yīng)用設(shè)計第3章SQL語句處理的過程第4章 ORACLE的優(yōu)化器第5章 ORACLE的執(zhí)行計劃 訪問路徑(方法) - access path表之間的連接 如何產(chǎn)生執(zhí)行計劃 如何分析執(zhí)行計劃 如何干預(yù)執(zhí)行計劃 - - 使用hint膊s提示 具膊體案例分析第1章 性能縫調(diào)整綜述 Oracle各數(shù)據(jù)庫是高度可調(diào)的數(shù)據(jù)各庫產(chǎn)品。本章描述調(diào)整的過各程和那些人員應(yīng)與Oracle各服務(wù)器的調(diào)整有關(guān),以各及與調(diào)整相關(guān)聯(lián)的操作系統(tǒng)各硬件和軟件。本章包括以下各方面: 誰來調(diào)整系技統(tǒng)? 什么時候調(diào)整詭? 建立
2、有效調(diào)整的厄目標(biāo) 在設(shè)計和開發(fā)酒時的調(diào)整 調(diào)整產(chǎn)品酒系統(tǒng) 監(jiān)控產(chǎn)品系統(tǒng)伐 誰來調(diào)整系統(tǒng): 呆為了有效地調(diào)整系統(tǒng),若鮑干類人員必須交換信息并牽鮑涉到系統(tǒng)調(diào)整中,例如: 濺 應(yīng)用設(shè)計人員必須濺傳達(dá)應(yīng)用系統(tǒng)的設(shè)計,使得濺每個人都清楚應(yīng)用中的數(shù)據(jù)濺流動. 應(yīng)用開發(fā)玻人員必須傳達(dá)他們選擇的實?,F(xiàn)策略,使得語句調(diào)整的過玻程中能快速、容易地識別有玻問題的應(yīng)用模塊和可疑的SQl玻語句. 數(shù)據(jù)盯庫管理人員必須仔細(xì)地監(jiān)控盯系統(tǒng)活動并提供它們的資料販,使得異常的系統(tǒng)性能可被販快速得識別和糾正. 扮 硬件/軟件管理人員必扮須傳達(dá)系統(tǒng)的硬件、軟件配扮置并提供它們的資料,使得扮相關(guān)人員能有效地設(shè)計和管扮理系統(tǒng)。 簡而言之
3、,扁與系統(tǒng)涉及的每個人都在調(diào)扁整過程中起某些作用,當(dāng)上扁面提及的那些人員傳達(dá)了系扁統(tǒng)的特性并提供了它們的資扁料,調(diào)整就能相對的容易和扁更快一些。 不幸的叮是,事實上的結(jié)果是:數(shù)據(jù)叮庫管理員對調(diào)整負(fù)有全部或叮主要的責(zé)任。但是,數(shù)據(jù)庫叮管理員很少有合適的系統(tǒng)方叮面的資料,而且,在很多情斷況下,數(shù)據(jù)庫管理 員往往骸是在實施階段才介入數(shù)據(jù)庫骸,這就給調(diào)整工作帶來許多骸負(fù)面的影響,因為在設(shè)計階骸段的缺陷是不能通過DBA骸的調(diào)整而得以解決,而設(shè)計骸階段的缺陷往往對數(shù) 據(jù)庫出性能造成極大的影響。 頭其實,在真正成熟的開發(fā)頭環(huán)境下,開發(fā)人員作為純代頭碼編寫人員時,對性能的影頭響最小,此時大部分的工作維應(yīng) 由應(yīng)
4、用設(shè)計人員完成,維而且數(shù)據(jù)庫管理員往往在前維期的需求管理階段就介入,維為設(shè)計人員提供必要的技術(shù)維支持。調(diào)整并不是數(shù)據(jù)庫管維理員的專利,相反大部分應(yīng)維該是 設(shè)計人員和開發(fā)人員維的工作,這就需要設(shè)計人員污和開發(fā)人員具體必要的數(shù)據(jù)污庫知識,這樣才能組成一個污高效的團(tuán)隊,然而事實上往污往并非如此。 什么時瞻候作調(diào)整? 多數(shù)人夜認(rèn)為當(dāng)用戶感覺性能差時才夜進(jìn)行調(diào)整,這對調(diào)整過程中夜使用某些最有效的調(diào)整策略夜來說往往是太遲了。此時,夜如果你不愿意重新設(shè)計應(yīng)用夜的話,你只能通過 重新分夜配內(nèi)存(調(diào)整SGA)和調(diào)夜整I/O的辦法或多或少地夜提高性能。Oracle提議供了許多特性,這些特性只議有應(yīng)用到正確地設(shè)計的
5、系統(tǒng)議中時才能夠很大地提 高性議能。 應(yīng)用設(shè)計人員需雍要在設(shè)計階段設(shè)置應(yīng)用的性雍能期望值。然后在設(shè)計和開徐發(fā)期間,應(yīng)用設(shè)計人員應(yīng)考徐慮哪些Oracle 特性徐可以對系統(tǒng)有好處,并使用徐這些特性。通過良好的系統(tǒng)徐設(shè)計,你就可以在應(yīng)用的生徐命周期中消除性能調(diào)整的代徐價和挫折。當(dāng)然,即使在設(shè)徐計很好的系統(tǒng)中,也可 能徐有性能降低。但這些性能降徐低應(yīng)該是可控的和可以預(yù)見粘的。 調(diào)整目標(biāo) 嬸不管你正在設(shè)計或維護(hù)系統(tǒng)嬸,你應(yīng)該建立專門的性能目嬸標(biāo),它使你知道何時要作調(diào)梨整。如果你試圖胡亂地改動梨初始化參數(shù)或SQl語句,梨你可能會浪費(fèi)調(diào)整系統(tǒng)的時梨間,而且無什么大的收益。梨調(diào)整你的系統(tǒng)的最有效方法梨如下:
6、當(dāng)設(shè)計系涕統(tǒng)時考慮性能 調(diào)贖整操作系統(tǒng)的硬件和軟件 贖 識別性能瓶頸 尿 確定問題的原因 類 采取糾正的動作 術(shù)當(dāng)你設(shè)計系統(tǒng)時,制定專術(shù)門的目標(biāo);例如,響應(yīng)時間術(shù)小于秒。當(dāng)應(yīng)用不能滿足術(shù)此目標(biāo)時,識別造成變慢的術(shù)瓶頸(例如,I/O競爭)術(shù),確定原因,采取糾正動作術(shù)。在開發(fā)期間,你應(yīng)測試應(yīng)術(shù)用研究,確定在采取應(yīng)用之術(shù)前是否滿足設(shè)計的性能目標(biāo)術(shù)。 當(dāng)你正在維護(hù)生仟產(chǎn)庫系統(tǒng)時,有多種快速有仟效的方法來識別性能瓶頸。仟不管怎樣,調(diào)整通常是一系仟列開銷。一旦你已確定了瓶仟頸,你可能要犧牲一些其它仟方面的指 標(biāo)來達(dá)到所要的仟結(jié)果。例如,如果I/O有仟問題,你可能需要更多內(nèi)存瞞或磁盤。如果不可能買,你瞞可能
7、要限制系統(tǒng)的并發(fā)性,瞞來獲取所需的性能。然而,瞞如果你已經(jīng) 明確地定義了瞞性能的目標(biāo),那用什么來交瞞換高性能的決策就變的很容瞞易的,因為你已經(jīng)確定了哪瞞些方面是最重要的,如過我瞞的目標(biāo)為高性能,可能犧牲瞞一些空間資 源。 隨叁著應(yīng)用的越來越龐大,硬件叁性能的提高,全面的調(diào)整應(yīng)叁用逐漸變成代價高昂的行為叁,在這樣情況下,要取得最叁大的投入/效率之 比,較叁好的辦法是調(diào)整應(yīng)用的關(guān)鍵叁部分,使其達(dá)到比較高的性叁能,這樣從總體上來說,整臨個系統(tǒng)的性能也是比較高的臨。這也就是有名的20/80臨原則,調(diào)整應(yīng)用的 20%(臨關(guān)鍵部分),能解決80%臨的問題。 在設(shè)計葬和開發(fā)系統(tǒng)時作調(diào)整 漾 良好設(shè)計的系統(tǒng)可
8、以防止漾在應(yīng)用生命周期中產(chǎn)生性能漾問題。系統(tǒng)設(shè)計人員和應(yīng)用漾開發(fā)人員必須了解Oracle漾的查詢處理機(jī)制以便寫醞出高效的SQl語句?!暗卺j2 章 有效的應(yīng)用設(shè)計”醞討論了你的系統(tǒng)中各種可用醞的配置,以及每種配置更適醞合哪種類型的應(yīng)用?!暗?醞章 優(yōu)化器”討論了Oracle醞的查詢優(yōu)化器,以及醞如何寫語句以獲取最快的結(jié)醞果。 當(dāng)設(shè)計你的系統(tǒng)裔時,使用下列優(yōu)化性能的準(zhǔn)裔則: 消除客戶機(jī)猶服務(wù)器應(yīng)用中不必要的網(wǎng)猶絡(luò)傳輸。- 使用存儲過猶程。 使用適合你執(zhí)系統(tǒng)的相應(yīng)Oracle服執(zhí)務(wù)器選件(例如,并行查詢執(zhí)或分布式數(shù)據(jù)庫)。 直 除非你的應(yīng)用有特殊的直需要,否則使用缺省的Oracle直鎖。 利浙用數(shù)據(jù)
9、庫記住應(yīng)用模塊,以浙便你能以每個模塊為基礎(chǔ)來浙追蹤性能。 選擇蔗你的數(shù)據(jù)塊的最佳大小。 - 蔗原則上來說大一些的蔗性能較好。 分布朽你的數(shù)據(jù),使得一個節(jié)點(diǎn)使朽用的數(shù)據(jù)本地存貯在該節(jié)點(diǎn)朽中。 調(diào)整產(chǎn)品系統(tǒng)夷本節(jié)描述對應(yīng)用系統(tǒng)快碌速、容易地找出性能瓶頸,碌并決定糾正動作的方法。這碌種方法依賴于對Oracle碌服務(wù)器體系結(jié)構(gòu)和特性的瑪了解程度。在試圖調(diào)整你的贖系統(tǒng)前,你應(yīng)熟悉Oracle贖調(diào)整的內(nèi)容。 為瘤調(diào)整你已有的系統(tǒng),遵從下瘤列步驟: 調(diào)整操手作系統(tǒng)的硬件和軟件 田 通過查詢V $SESSION_WAIT田視圖,田識別性能的瓶頸,這個動態(tài)田性能視圖列出了造成會話(session)您等待的事您件
10、。 通過分析V $SESSION_WAIT叁叁中的數(shù)據(jù),決定瓶頸的叁原因。 糾正存在倪的問題。 監(jiān)控應(yīng)用系鑲統(tǒng) 這主要是通過監(jiān)控暮oracle的動態(tài)視圖來暮完成。各種有用的動態(tài)視圖暮:如v$session_wait, v$session_event暮暮等。 籮第2章 有效的應(yīng)用設(shè)籮計 我們通常將最常用吩的應(yīng)用分為2種類型:聯(lián)機(jī)吩事務(wù)處理類型(OLTP)吩,決策支持系統(tǒng)(DSS)吩。 聯(lián)機(jī)事務(wù)處理(O檔LTP) 該類型的喘應(yīng)用是高吞吐量,插入、更喘新、刪除操作比較多的系統(tǒng)喘,這些系統(tǒng)以不斷增長的大喘容量數(shù)據(jù)為特征,它們提供喘給成百用戶同時存取,典型喘的OLTP系統(tǒng) 是訂票系喘統(tǒng),銀行的業(yè)務(wù)系統(tǒng),
11、訂單脆系統(tǒng)。OTLP的主要目標(biāo)脆是可用性、速度、并發(fā)性和脆可恢復(fù)性。當(dāng)設(shè)計這類系統(tǒng)脆時,必須確保大量的并發(fā)用脆戶不能干擾系統(tǒng)的 性能。脆還需要避免使用過量的索引脆與cluster 表,因脆為這些結(jié)構(gòu)會使插入和更新脆操作變慢。 決策支持豹(DSS) 該類型豹的應(yīng)用將大量信息進(jìn)行提取豹形成報告,協(xié)助決策者作出碑正確的判斷。典型的情況是井:決策支持系統(tǒng)將OLTP井應(yīng)用收集的大量數(shù)據(jù)進(jìn)行查井詢。典型的應(yīng)用為 客戶行井為分析系統(tǒng)(超市,保險等井)。決策支持的關(guān)鍵目標(biāo)是井速度、精確性和可用性。該井種類型的設(shè)計往往與OLTP井設(shè)計的理念背道而馳,一逞般建議使用數(shù)據(jù)冗 余、大逞量索引、cluster tabl
12、e逞、并行查詢等。逞近年來,該類型的應(yīng)用逐漸逞與OLAP、數(shù)據(jù)倉庫緊密逞的聯(lián)系在一起,形成的一個逞新的應(yīng)用方向。第3章濺SQL語句處理的過程 確在調(diào)整之前我們需要了解確一些背景知識,只有知道這確些背景知識,我們才能更好確的去調(diào)整sql語句。 掠本節(jié)介紹了SQL語句處掠理的基本過程,主要包括:掠 查詢語句處理睡 DML語句處譜理(insert, up譜date, delete譜) DDL 語蓬句處理(create .蓬. , drop .蓬, alter . ,蓬) 事務(wù)控制析(commit, rol析lback)SQL蒲語句的執(zhí)行過程(SQL蒲Statement E蒲xecution)隱在某些
13、情況下,Oracl徐e運(yùn)行sql的過程可能與徐下面列出的各個階段的順序徐有所不同。如DEFINE徐階段可能在FETCH階段徐之前,這主要依賴你如何書徐寫代碼。 對許多o再racle的工具來說,其再中某些階段會自動執(zhí)行。絕再大多數(shù)用戶不需要關(guān)心各個再階段的細(xì)節(jié)問題,然而,知貞道執(zhí)行的各個階段還是有必貞要的,這會幫助 你寫出更貞高效的SQL語句來,而且貞還可以讓你猜測出性能差的貞SQL語句主要是由于哪一貞個階段造成的,然后我們針貞對這個具體的階段,找出解貞決的辦法。 DML語鈍句的處理 本節(jié)給出一稿個例子來說明在DML語句稿處理的各個階段到底發(fā)生了稿什么事情。假設(shè)你使用Pr稿o*C程序來為指定部門
14、的稿所有職員增加工資。程序已稿經(jīng)連到正確的用戶,你可以疆在你的程序中嵌入如下的S邦QL語句: EXEC S邦QL UPDATE em邦ployeesSET邦salary = 1.1船0 * salary W船HERE departm船ent_id = :va船r_department船_id;var_d船epartment_id船是程序變量,里面包含部門船號,我們要修改該部門的職船員的工資。當(dāng)這個SQL語各句執(zhí)行時,使用該變量的值各。 每種類型的語句都汛需要如下階段: 愿 第1步: Create胰a Cursor創(chuàng)建胰游標(biāo) 第2步:引Parse the S引tatement分析語引句 第5步:
15、袖Bind Any Var袖iables綁定變量袖 第7步: Ru顫n the Statem出ent運(yùn)行語句 姐 第9步: Close姐the Cursor姐關(guān)閉游標(biāo) 如果使用了碧并行功能,還會包含下面這碧個階段: 第6然步: Paralleli然ze the State然ment并行執(zhí)行語句然如果是查詢語句,則需邱要以下幾個額外的步驟,如邱圖 3所示: 僳第3步: Describ僳e Results of僳a Query描述查僳詢的結(jié)果集 第嵌4步: Define O嵌utput of a Q嵌uery定義查詢的輸出嵌數(shù)據(jù) 第8步:籬Fetch Rows籬of a Query取籬查詢出來的行
16、 下面具甚體說一下每一步中都發(fā)生了甚什么事情:. 第1步題: 創(chuàng)建游標(biāo)(Creat在e a Cursor)在 由程序接口調(diào)用創(chuàng)建帳一個游標(biāo)(cursor)延。任何SQL語句都會創(chuàng)建延它,特別在運(yùn)行DML語句延時,都是自動創(chuàng)建游標(biāo)的,延不需要開發(fā)人員干預(yù)。多數(shù)延應(yīng)用 中,游標(biāo)的創(chuàng)建是自延動的。然而,在預(yù)編譯程序延(pro*c)中游標(biāo)的創(chuàng)穴建,可能是隱含的,也可能穴顯式的創(chuàng)建。在存儲過程中穴也是這樣的。 第2步抑:分析語句(Parse允the Statemen允t)在語法分析期間在,SQL語句從用戶進(jìn)程傳在送到Oracle,SQL隱語句經(jīng)語法分析后,SQL隱語句本身與分析的信息都被隱裝入到共享SQ
17、L區(qū)。在該隱階段中,可以解決許多類型隱的錯誤。 語法分析分迂別執(zhí)行下列操作: 丈翻譯SQL語句,驗證它是丈合法的語句,即書寫正確丈實現(xiàn)數(shù)據(jù)字典的查找罐,以驗證是否符合表和列的罐定義 在所要求的對堆象上獲取語法分析鎖,使得堆在語句的語法分析過程中不邦改變這些對象的定義 姑驗證為存取所涉及的模式姑對象所需的權(quán)限是否滿足桂決定此語句最佳的執(zhí)咎行計劃 將它裝入共燴享SQL區(qū) 對分布呢的語句來說,把語句的全部呢或部分路由到包含所涉及數(shù)呢?fù)?jù)的遠(yuǎn)程節(jié)點(diǎn) 以上任糧何一步出現(xiàn)錯誤,都將導(dǎo)致糧語句報錯,中止執(zhí)行。 翔只有在共享池中不存在等翔價SQL語句的情況下,才喬對SQL語句作語法分析。男在這種情況下,數(shù)據(jù)庫內(nèi)
18、核男重新為該語句分配新的共享男SQL區(qū),并對語句進(jìn)行語男法分析。進(jìn)行語法分析需要男耗費(fèi)較多的資源,所以要盡男量避免進(jìn)行語法分析,這是男優(yōu)化的技巧之一。 技語法分析階段包含了不管此技語句將執(zhí)行多少次,而只需技分析一次的處理要求。Or技acle只對每個SQL語技句翻譯一次,在以后再次執(zhí)技行該語句時,只要該語句喘還在共享SQL區(qū)中,就可喘以避免對該語句重新進(jìn)行語喘法分析,也就是此時可以直喘接使用其對應(yīng)的執(zhí)行計劃對喘數(shù)據(jù)進(jìn)行存取。這主要是通喘過綁定變量(bind v喘ariable)實現(xiàn)的,喘也就是我們常說的共享SQ喘L,后面會給出共享SQL場的概念。 雖然語法分快析驗證了SQL語句的正確快性, 但語
19、法分析只能識別達(dá)在SQL語句執(zhí)行之前所能達(dá)發(fā)現(xiàn)的錯誤(如書寫錯誤、達(dá)權(quán)限不足等)。因此,有些達(dá)錯誤通過語法分析是抓不到達(dá)的。例如,在數(shù)據(jù)轉(zhuǎn)換中的達(dá)錯誤或 在數(shù)據(jù)中的錯(如達(dá)企圖在主鍵中插入重復(fù)的值達(dá))以及死鎖等均是只有在語達(dá)句執(zhí)行階段期間才能遇到和達(dá)報告的錯誤或情況。 塢查詢語句的處理 查勿詢與其它類型的SQL語句妹不同,因為在成功執(zhí)行后作妹為結(jié)果將返回數(shù)據(jù)。其它語妹句只是簡單地返回成功或失妹敗,而查詢則能返回一行或妹許多行數(shù)據(jù)。查詢的結(jié) 果妹均采用表格形式,結(jié)果行被妹一次一行或者批量地被檢索妹出來。從這里我們可以得知妹批量的fetch數(shù)據(jù)可以籬降低網(wǎng)絡(luò)開銷,所以批量的籬fetch也是優(yōu)化的技
20、籬巧之一。 有些問題只皂與查詢處理相關(guān),查詢不僅皂僅指SELECT語句,同皂樣也包括在其它SQL語句皂中的隱含查詢。例如,下面皂的每個語句都需要把查詢作皂為它執(zhí)行的一部分: IN皂SERT INTO ta皂ble SELECT.皂.UPDATE tab振le SET x = y振WHERE.DE振LETE FROM ta振ble WHERE.振CREATE tabl振e AS SELECT.振.具體來說,查詢宙 要求讀一致性彥 可能使用回滾段作裔中間處理 可能要唁求SQL語句處理描述、定唁義和取數(shù)據(jù)階段 第3瞻步: 描述查詢結(jié)果(De蟄scribe Resul蟄ts of a Quer蟄y)描
21、述階段只有在截查詢結(jié)果的各個列是未知時截才需要;例如,當(dāng)查詢由用濺戶交互地輸入需要輸出的列濺名。在這種情況要用描述階濺段來決定查詢結(jié)果的特征(濺數(shù)據(jù)類型,長度和名字)。濺 第4步: 定義查詢幫的輸出數(shù)據(jù)(Define幫Output of a幫Query)在查鎬詢的定義階段,你指定與查鎬詢出的列值對應(yīng)的接收變量鎬的位置、大小和數(shù)據(jù)類型,鎬這樣我們通過接收變量就可鎬以得到查詢結(jié)果。如果必要鎬的話,Oracle會自動鎬實現(xiàn)數(shù)據(jù)類型的轉(zhuǎn)換。這是鎬將接收變量的類型與對應(yīng)的鎬列類型相比較決定的。 曾第5步: 綁定變量(B曾ind Any Vari曾ables) 此時儀,Oracle知道了SQ儀L語句的意思
22、,但仍沒有足儀夠的信息用于執(zhí)行該語句。儀Oracle 需要得到在儀語句中列出的所有變量的值儀。在該例中,Oracle責(zé)需要得到對departm責(zé)ent_id列進(jìn)行限定的責(zé)值。得到這個值的過程就叫責(zé)綁定變量(bindin責(zé)g variables)責(zé)此過程稱之為將變量玲值捆綁進(jìn)來。程序必須指出玲可以找到該數(shù)值的變量名(玲該變量被稱為捆綁 變量,玲變量名實質(zhì)上是一個內(nèi)存地玲址,相當(dāng)于指針)。應(yīng)用的玲最終用戶可能并沒有發(fā)覺他玲們正在指定捆綁變量,因為撾Oracle 的程序可能撾只是簡單地指示他們輸入新?lián)氲闹担鋵嵾@一切都在程序撾中自動做了。因為你指定了撾變量名,在你再次執(zhí)行之前撾無須重新捆綁變量。你可
23、以撾改變綁定變量的 值,而O撾racle在每次執(zhí)行時,撾僅僅使用內(nèi)存地址來查找此且值。如果Oracle 需且要實現(xiàn)自動數(shù)據(jù)類型轉(zhuǎn)換的且話(除非它們是隱含的或缺且省的),你還必須對每個值且指定數(shù)據(jù)類型和長度。關(guān)于且這些信息可以參考o(jì)rac且le的相關(guān)文檔,如Or且acle Call In且terface Prog且rammers Gui情de第6步: 并行麥執(zhí)行語句(Paralle裸lize the Sta裸tement ) 戌ORACLE 可以在SE雁LECTs, INSER雁Ts, UPDATEs,雁MERGEs, DEL雁ETEs語句中執(zhí)行相應(yīng)并雁行查詢操作,對于某些DD雁L操作,如創(chuàng)建索
24、引、用子雁查詢創(chuàng)建表、在分區(qū)表上的雁操作,也可以執(zhí)行并行操作折。并行化可以導(dǎo)致多 個服折務(wù)器進(jìn)程(oracle折server proce折sses)為同一個SQL折語句工作,使該SQL語句折可以快速完成,但是會耗費(fèi)折更多的資源,所以除非很有折必要,否則不要使用并行查折詢。 第7步: 執(zhí)行咬語句(Run the S咬tatement)妹到了現(xiàn)在這個時候,Or妹acle擁有所有需要的信妹息與資源,因此可以真正運(yùn)妹行SQL語句了。如果該語鳥句為SELECT查詢或I鳥NSERT語句,則不需要鳥 鎖定任何行,因為沒有數(shù)鳥據(jù)需要被改變。然而,如果鳥語句為UPDATE或DE鳥LETE語句,則該語句影鳥響的所
25、有行都被鎖定,防止聶該用戶提交或回滾之前,別聶的 用戶對這些數(shù)據(jù)進(jìn)行修聶改。這保證了數(shù)據(jù)的一致性聶。對于某些語句,你可以指聶定執(zhí)行的次數(shù),這稱為批處聶理(array proc聶essing)。指定執(zhí)行聶N次,則綁定變量與定義變聶量被定義為大小為N的數(shù)組賽的開始位置,這種方法可以賽減少網(wǎng)絡(luò)開銷,也是優(yōu)化的賽技巧之一。 第8天步: 取出查詢的行(Fe天tch Rows of天a Query)在天fetch階段,行數(shù)據(jù)被塢取出來,每個后續(xù)的存取操塢作檢索結(jié)果集中的下一行數(shù)鎳據(jù),直到最后一行被取出來鎳。上面提到過,批量的fe鎳tch是優(yōu)化的技巧之一。鎳 第9步: 關(guān)閉游標(biāo)蓬(Close the C蓬u
26、rsor)SQL繕語句處理的最后一個階段就繕是關(guān)閉游標(biāo) DDL語略句的處理(DDL Sta略tement Proce略ssing) DD置L語句的執(zhí)行不同與DML置語句和查詢語句的執(zhí)行,這置是因為DDL語句執(zhí)行成功置后需要對數(shù)據(jù)字典數(shù)據(jù)進(jìn)行置修改。對于DDL語句,語許句的分析階段實際上 包括許分析、查找數(shù)據(jù)字典信息和許執(zhí)行。事務(wù)管理語句、會話許管理語句、系統(tǒng)管理語句只許有分析與執(zhí)行階段,為了重許新執(zhí)行該語句,會重新分析許與執(zhí)行該語句。 事務(wù)貯控制(Control o戌f Transactio戌ns) 一般來說,袖只有使用ORACLE編程袖接口的應(yīng)用設(shè)計人員才關(guān)心袖操作的類型,并把相關(guān)的操袖作組
27、織在一起,形成一個事袖務(wù)。一般來說,我門必須定征義事務(wù),這樣 在一個邏輯征單元中的所有工作可以同時征被提交或回滾,保證了數(shù)據(jù)征的一致性。一個事務(wù)應(yīng)該由征邏輯單元中的所有必須部分征組成,不應(yīng)該多一個,也不征應(yīng)該少一個。 在誼事務(wù)開始和結(jié)束的這段時間誼內(nèi),所有被引用表中的數(shù)據(jù)誼都應(yīng)該在一致的狀態(tài)(或可誼以被回溯到一致的狀態(tài))誼 事務(wù)應(yīng)該只包含可斟以對數(shù)據(jù)進(jìn)行一致更改(o斟ne consisten斟t change to椅the data)的SQ椅L語句 例如,在兩執(zhí)個帳號之間的轉(zhuǎn)帳(這是一執(zhí)個事務(wù)或邏輯工作單元),執(zhí)應(yīng)該包含從一個帳號中借錢執(zhí)(由一個SQL完成),然執(zhí)后將借的錢存入另一個帳號執(zhí)(由
28、另一個 SQL完成)宙。這2個操作作為一個邏輯宙單元,應(yīng)該同時成功或同時宙失敗。其它不相關(guān)的操作,宙如向一個帳戶中存錢,不應(yīng)宙該包含在這個轉(zhuǎn)帳事務(wù)中。宙 在設(shè)計應(yīng)用時,除了扼需要決定哪種類型的操作組扼成一個事務(wù)外,還需要決定燴使用BEGIN_DISC燴RETE_TRANSAC燴TIO存儲過程是否對提高燴小的、非分布式的事務(wù)的性燴能有作用。第4章OR此ACLE的優(yōu)化器 優(yōu)劫化器有時也被稱為查詢優(yōu)化熾器,這是因為查詢是影響數(shù)熾據(jù)庫性能 最主要的部分,熾不要以為只有SELECT熾語句是查詢。實際上,帶有熾任何WHERE條件的DM熾L(INSERT、UPD熾ATE、DELETE)語販句中都包含 查詢要
29、求,在販后面的文章中,當(dāng)說到查詢販時,不一定只是指SELE販CT語句,也有可能指DM販L語句中的查詢部分。優(yōu)化販器是所有關(guān)系數(shù)據(jù)庫引擎中販的最神秘、最 富挑戰(zhàn)性的頒部件之一,從性能的角度看頒也是最重要的部分,它性能頒的高低直接關(guān)系到數(shù)據(jù)庫性頒能的好壞。 我們知道構(gòu),SQL語句同其它語 言構(gòu)(如C語言)的語句不一樣警,它是非過程化(non-警procedural)的警語句,即當(dāng)你要取數(shù)據(jù)時,警不需要告訴數(shù)據(jù)庫通過何種警途徑去取數(shù)據(jù),如到底是警通過索引取數(shù)據(jù),還是應(yīng)該警將表中的每行數(shù)據(jù)都取出來警,然后再通過一一比較的方峻式取數(shù)據(jù)(即全表掃描),慚這是由數(shù)據(jù)庫的優(yōu)化器決定慚的,這就是非過程化的含慚義
30、,也就是說,如何取數(shù)據(jù)父是由優(yōu)化器決定,而不是應(yīng)父用開發(fā)者通過編程決定。在父處理SQL的SELECT父、UPDATE、INSE鎬RT或DELETE語句鎬時,Oracle 必須訪鎬問語句所涉及的數(shù)據(jù),Or鎬acle的優(yōu)化器部分用來鎬決定訪問數(shù)據(jù)的有效路徑,鎬使得語句執(zhí)行所需的I/O鎬和處理時間最小。 揪為了實現(xiàn)一個查詢,內(nèi)核必揪須為每個查詢定制一個查詢揪策略,或為取出符合條件的揪數(shù)據(jù)生成一個執(zhí)行計劃(e揪xecution pla揪n)。典型的,對于同一個揪查詢,可能有幾個執(zhí)行計劃管都符合要求,都能得到符合管條件的數(shù)據(jù)。例如,參與連管接的表可以有多種不同的連管接方法,這取決于連 接條管件和優(yōu)化器采
31、用的連接方法管。為了在多個執(zhí)行計劃中選管擇最優(yōu)的執(zhí)行計劃,優(yōu)化器管必須使用一些實際的指標(biāo)來管衡量每個執(zhí)行計劃使用的資稈源(I/0次數(shù)、CPU稈等),這些資源也就是我們稈所說的代價(cost)。稈如果一個執(zhí)行計劃使用的資稈源多,我們就說使用執(zhí)行計稈劃的代價大。以執(zhí)行計劃的稈代價大小作為衡量標(biāo) 準(zhǔn),稈優(yōu)化器選擇代價最小的執(zhí)行嘎計劃作為真正執(zhí)行該查詢的管執(zhí)行計劃,并拋棄其它的執(zhí)管行計劃。 在ORAC局LE的發(fā)展過程中,一共開魂發(fā)過2種類型的優(yōu)化器:基魂于規(guī)則的優(yōu)化器和基于代價魂的優(yōu)化器。這2種優(yōu)化器的魂不同之處關(guān)鍵在于:取得代魂價的方法與衡量代價的大小魂不同。現(xiàn)對每種優(yōu)化器做一魂下簡單的介紹: 基于
32、替規(guī)則的優(yōu)化器- Ru替le Based (He替uristic) Opt替imization(簡稱替RBO): 在OR屈ACLE7之前,主要是使屈用基于規(guī)則的優(yōu)化器。OR屈ACLE在基于規(guī)則的優(yōu)化屈器中采用啟發(fā)式的方法(H屈euristic App屈roach)或規(guī)則(Ru屈les)來生成執(zhí)行計劃。屈例如,如果一個查詢的wh屈ere條件(where屈c(diǎn)lause)包含一個謂屈詞(predicate,屈其實就是一個判斷條件,如屈”=”, “”, ”束”等),而且該謂詞上引用束的列上有有效索引,那么優(yōu)束化器將使用索引訪問這個表束,而不考慮其它因素,如表束中數(shù)據(jù)的多少、表中數(shù)據(jù)的束易變性、索引的
33、可選擇性束等。此時數(shù)據(jù)庫中沒有關(guān)于涅表與索引數(shù)據(jù)的統(tǒng)計性描述涅,如表中有多上行,每行的涅可選擇性等。優(yōu)化器也不考涅慮實例參數(shù),如multi蒲block i/o、可蒲用排序內(nèi)存的大小等,所以蒲優(yōu)化器有時就選擇了次優(yōu)化蒲的計劃作為真正的執(zhí)行計劃蒲,導(dǎo)致系統(tǒng)性能不高。 羌如,對于select陸* from emp陸where deptno陸= 10這個查詢來說,陸如果是使用基于規(guī)則的優(yōu)化陸器,而且deptno列上陸有有效的索引,則會通過d陸eptno列上的索引來訪漢問emp表。在絕大多數(shù)情漢況下, 這是比較高效的,漢但是在一些特殊情況下,使?jié)h用索引訪問也有比較低效的漢時候,現(xiàn)舉例說明: 琺1) em
34、p表比較小墾,該表的數(shù)據(jù)只存放在幾個墾數(shù)據(jù)塊中。此時使用全表掃墾描比使用索引訪問emp表墾反而要好。因為表比較小,墾極有可能數(shù)據(jù)全在內(nèi)存中,墾所以此時做 全表掃描是最墾快的。而如果使用索引掃描墾,需要先從索引中找到符合睹條件記錄的rowid,然睹后再一一根據(jù)這些rowi睹d從emp中將數(shù)據(jù)取出來睹,在這種條件 下,效率就睹會比全表掃描的效率要差一睹些。 2) emp表瑚比較大時,而且deptn瑚o = 10條件能查詢出瑚表中大部分的數(shù)據(jù)如(50瑚%)。如該表共有4000瑚萬行數(shù)據(jù),共放在有500瑚000個數(shù)據(jù)塊中,每個數(shù)讒據(jù)塊為8k,則該表共有約讒4G,則 這么多的數(shù)據(jù)不讒可能全放在內(nèi)存中,絕
35、大多讒數(shù)需要放在硬盤上。此時如讒果該查詢通過索引查詢,則讒是你夢魘的開始。db_讒file_multibl讒ock_read_cou廚nt參數(shù)的值200。如果廚采用全表掃描,則需要5廚00000/db_fil廚e_multiblock廚_read_count=廚500000/200=2廚500次I/O。但是如果廚采用索引掃描,假設(shè)de廚ptno列上的索引都已經(jīng)陸cache到內(nèi)存中,所以陸可以將訪問索引的開銷忽略陸不計。因為要讀出4000陸萬x 50% = 200陸0萬數(shù)據(jù),假設(shè)在讀這20陸00萬數(shù)據(jù)時,有99.9陸%的命中率,則還是需要2陸0000次I/O,比上面嵌的全表掃描需要的2500嵌次
36、多多了,所以在這 種情嵌況下,用索引掃描反而性能嵌會差很多。在這樣的情況下嵌,用全表掃描的時間是固定嵌的,但是用索引掃描的時間嵌會隨著選出數(shù)據(jù)的增多使查嵌詢時間相應(yīng)的延長。 磷上面是枯燥的假設(shè)數(shù)據(jù),現(xiàn)磷在以具體的實例給予驗證:磷 環(huán)境: oracl抿e 817 + linu抿x +陣列柜,表SWD抿_BILLDETAIL有抿3200多萬數(shù)據(jù); 裸表的id列、cn列上都有裸索引 經(jīng)查看執(zhí)行計孽劃,發(fā)現(xiàn)執(zhí)行select孽count(id) f孽rom SWD_BILL孽DETAIL;使用全表掃敢描,執(zhí)行完用了大約1.5敢0分鐘(4次執(zhí)行取平均,敢每次分別為1.45 1.敢51 2.00 1.46敢
37、)。而執(zhí)行select敢count(id) fr敢om SWD_BILLD敢ETAIL where川卻用了2川個小時還沒有執(zhí)行完,經(jīng)分川析該語句使用了cn列上的川索引,然后利用查詢出的r川owid再從表中查詢數(shù)據(jù)川。我為什么不使用sel掉ect count(cn掉) from SWD_B掉ILLDETAIL wh掉掉呢?后面在分析執(zhí)行路徑的掉索引掃描時時會給出說明。掉 下面就是基于規(guī)則的斧優(yōu)化器使用的執(zhí)行路徑與各斧個路徑對應(yīng)的等級: 梗RBO Path 1:梗Single Row b戒y Rowid(等級最高戒) RBO Path玖2: Single R漢ow by Cluste漢r Join
38、RBO城Path 3: Sin混gle Row by H混ash Cluster混Key with Uni混que or Prima混ry KeyRBO洲Path 4: Sin洲gle Row by U洲nique or Pri洲mary KeyR宇BO Path 5: C宇lustered Joi宇nRBO Path只6: Hash Clu只ster KeyR秀BO Path 7: I秀ndexed Clust秀er KeyRBO議Path 8: Com議posite Index議RBO Path貞9: Single-Co貞lumn Indexes貞RBO Path余10: Bounded余
39、Range Search延1對于需要訪問盯跨節(jié)點(diǎn)(即通常說的服務(wù)器盯)數(shù)據(jù)庫上數(shù)據(jù)的查詢來說盯,存在network代價盯,用來量化傳輸操作耗費(fèi)的盯資源。查詢遠(yuǎn)程表的查詢或盯執(zhí)行分布式連接的查詢會在盯network代價方面花盯費(fèi)比較大。 在使用半CBO時,需要有表和索引半的統(tǒng)計數(shù)據(jù)(分析數(shù)據(jù))作半為基礎(chǔ)數(shù)據(jù),有了這些數(shù)據(jù)半,CBO才能為各個執(zhí)行計半劃計算出相對準(zhǔn)確的代價,半從而使CBO選擇 最佳的罐執(zhí)行計劃。所以定期的對表罐、索引進(jìn)行分析是絕對必要罐的,這樣才能使統(tǒng)計數(shù)據(jù)反罐映數(shù)據(jù)庫中的真實情況。否罐則就會使CBO選擇較差的罐執(zhí)行計劃,影響數(shù)據(jù) 庫的罐性能。分析操作不必做的太罐頻繁,一般來說,每
40、星期一罐次就足夠了。切記如果想使罐用CBO,則必須定期對表構(gòu)和索引進(jìn)行分析。 對渾于 分析用的命令,隨著數(shù)渾據(jù)庫版本的升級,用的命令渾也發(fā)生了變換,在orac渾le 8i以前,主要是用渾ANALYZE命令。在O渾RACLE 8I以后,又鎬引入了DBMS_STAT鎬S存儲包來進(jìn)行分析。幸運(yùn)鎬的是從ORACLE 10鎬G以后,分析工作變成自動鎬的了,這減輕的DBA的負(fù)鎬擔(dān),不過在一些特殊情況下鎬,還需要一些手工分析。版如果采用了CBO優(yōu)化瀑 器,而沒有對表和索引進(jìn)竊行分析,沒有統(tǒng)計數(shù)據(jù),則竊ORACLE使用缺省的統(tǒng)竊計數(shù)據(jù)(至少在ORACL竊E 9I中是這樣),這可竊以從oracle的文檔上竊找到
41、。使用的缺省值肯定與竊系統(tǒng)的實際統(tǒng)計值不一致,竊這可能會導(dǎo)致優(yōu)化器選擇錯竊誤的執(zhí)行計劃,影響數(shù)據(jù)庫茫的性 能。 要注意的繕是:雖然CBO的功能隨著繕ORACLE新版本的推出繕,功能越來越強(qiáng),但它不是繕能包治百病的神藥,否則就繕不再需要 DBA了,那我繕就慘了!實際上任何一繕個語句,隨著硬件環(huán)境與應(yīng)贖用數(shù)據(jù)的不同,該語句的執(zhí)贖行計劃可能需要隨之發(fā)生變贖化,這樣才能取得最好的性贖能。所以有 時候不在具體贖的環(huán)境下而進(jìn)行SQL性能贖調(diào)整是徒勞的。 在O籬RACLE8I推出的時候籬,ORACLE極力建議大籬家使用CBO,說CBO有梭種種好處,但是在那是OR梭ACLE開發(fā)的應(yīng)用系統(tǒng)還梭是使用基于規(guī)則的優(yōu)
42、化器,梭從這件事上我們可以得出這梭樣的結(jié)論:1)識如果團(tuán)隊的數(shù)據(jù)庫水平很高識而且都熟悉應(yīng)用數(shù)據(jù)的特點(diǎn)舷,RBO也可以取得很好的舷性能。 2)CB蘿O不是很穩(wěn)定,但是一個比蘿較有前途的優(yōu)化器,Ora溶cle極力建議大家用是為溶了讓大家盡快發(fā)現(xiàn)它的BU溶G,以便進(jìn)一步改善,但是溶ORACLE為 了對自己轄開發(fā)的應(yīng)用系統(tǒng)負(fù)責(zé),他們轄還是使用了比較熟悉而且成轄熟的RBO。從這個事情上轄給我們的啟發(fā)就是:我們在轄以后的開發(fā)中,應(yīng)該盡量采轄用我們熟悉并且成 熟的技轄術(shù),而不要一味的采用新技轄術(shù),一味采用新技術(shù)并不一轄定能開發(fā)出好的產(chǎn)品。幸運(yùn)示的是從ORACLE 10示G后,CBO已經(jīng)足夠的強(qiáng)示大與智能,大
43、家可以放心的示使用該技術(shù),因為ORAC示LE 10G后,Orac示le自己開發(fā)的應(yīng)用系統(tǒng)也示使用CBO優(yōu)化器了。而且穗ORACLE規(guī)定,從OR穗ACLE 10G開始,開穗始廢棄RBO優(yōu)化器。這句穗話并不是指在ORACLE繕10G中不能使用RBO繕,而是從ORACLE 1繕0G開始開始,不再為RB瑞O的BUG提供修補(bǔ)服務(wù)。瑞 在上面的第2個例子虛中,如果采用CBO優(yōu)化器韻,它就會考慮emp表的行韻 數(shù),deptno列的統(tǒng)韻計數(shù)據(jù),發(fā)現(xiàn)對該列做查詢韻會查詢出過多的數(shù)據(jù),并且彰考慮db_file_mu彰ltiblock_rea彰d_count參數(shù)的設(shè)置彰, 發(fā)現(xiàn)用全表掃描的代價焉比用索引掃描的代價要
44、小,焉從而使用全表掃描從而取得焉良好的執(zhí)行性能。 判迎斷當(dāng)前數(shù)據(jù)庫使用何種優(yōu)化迎器: 主要是由opt訝imizer_mode初訝始化參數(shù)決定的。該參數(shù)可訝能的取值為:first_咱rows_1 | 10咱| 100 | 100咱0 | first_r咱ows | all_ro咱ws | choose咱| rule。具體解釋如咱下: RULE為使用獸RBO優(yōu)化器。 CH轄OOSE則是根據(jù)實際情況轄,如果數(shù)據(jù)字典中包含被引轄用的表的統(tǒng)計數(shù)據(jù),即引用轄的對象已經(jīng)被分析,則就使轄用CBO優(yōu)化器,否則為R容BO優(yōu)化器。 ALL捎_ROWS為CBO優(yōu)化器屯使用的第一種具體的優(yōu)化方屯法,是以數(shù)據(jù)的吞吐量為主
45、屯要目標(biāo),以便可以使用最少屯的資源完成語句。 F憐IRST_ROWS為優(yōu)化憐器使用的第二種具體的優(yōu)化憐方法,是以數(shù)據(jù)的響應(yīng)時間憐為主要目標(biāo),以便快速查詢憐出開始的幾行數(shù)據(jù)。 屈FIRST_ROWS_屈1 | 10 | 100屈| 1000為優(yōu)化屈器使用的第三種具體的優(yōu)化屈方法,讓優(yōu)化器選擇一個能屈夠把響應(yīng)時間減到最小的查屈詢執(zhí)行計劃,以迅速產(chǎn)生查粟詢結(jié)果的前 n 行。該參粟數(shù)為ORACLE 9I新粟引入的。 從ORAC丸LE V7以來,opti丸mizer_mode參數(shù)往的缺省設(shè)置應(yīng)是choo洲se,即如果對已分析的洲表查詢的話選擇CBO,否洲則選擇RBO。在此種設(shè)置洲中,如果采用了CBO,則
46、洲缺省為CBO中的all_洲r(nóng)ows模式。 注繡意:即使指定數(shù)據(jù)庫使用R繡BO優(yōu)化器,但有時ORA繡CLE數(shù)據(jù)庫還是會采用C繡BO優(yōu)化器,這并不是OR繡ACLE的BUG,主要是致由于從ORACLE 8I致后引入的許多新特性都必須致在CBO下才能使用,而你致的SQL語句可能正好使用致了這些新特性,此時數(shù)據(jù)庫致會自動轉(zhuǎn)為使用CBO優(yōu)化冤器執(zhí)行這些語句。 什洲么是優(yōu)化 優(yōu)化是選搬擇最有效的執(zhí)行計劃來執(zhí)行搬SQL語句的過程,這是在搬處理任何數(shù)據(jù)的語句(SE搬LECT,INSERT,搬UPDATE或DELET搬E)中的一個重 要步驟。葛對Oracle來說,執(zhí)行葛這樣的語句有許多不同的方葛法,譬如說,將隨
47、著以什么葛順序訪問哪些表或索引的不葛同而不同。所使用的執(zhí)行計葛劃可以決定語句能 執(zhí)行得葛有多快。Oracle中稱葛之為優(yōu)化器(Optimi釜zer)的組件用來選擇這釜種它認(rèn)為最有效的執(zhí)行計劃釜。 由于一系列因素都粉 會會影響語句的執(zhí)行,優(yōu)粉化器綜合權(quán)衡各個因素,在粉眾多的執(zhí)行計劃中選擇認(rèn)為辦是最佳的執(zhí)行計劃。然而,辦應(yīng)用設(shè)計人員通常比優(yōu)化器慚更知道關(guān)于特定應(yīng)用的數(shù)據(jù)慚特 點(diǎn)。無論優(yōu)化器多么智慚能,在某些情況下開發(fā)人員慚能選擇出比優(yōu)化器選擇的最躇優(yōu)執(zhí)行計劃還要好的執(zhí)行計躇劃。這是需要人工干預(yù)數(shù)據(jù)躇庫優(yōu)化的主要原因。事實表躇明, 在某些情況下,確實躇需要DBA對某些語句進(jìn)行販?zhǔn)止?yōu)化。 注:從O骸
48、racle的一個版本到另骸一個版本,優(yōu)化器可能對同綢一語句生成不同的執(zhí)行計劃綢。在將來的Oracle綢版本中,優(yōu)化器可能會基于綢它可以用的更好、更理想的綢信息,作出更優(yōu)的決策,從綢而導(dǎo)致為語句產(chǎn)生更優(yōu)的執(zhí)葷行計劃。第5章ORA才CLE的執(zhí)行計劃 背丸景知識: 為了更好的嗎進(jìn)行下面的內(nèi)容我們必須了嗎解一些概念性的術(shù)語: 抑共享sql語句 榨為了不重復(fù)解析相同的SQ榨L語句(因為解析操作比較需費(fèi)資源,會導(dǎo)致性能下降)需,在第一次解析之后,OR需ACLE將SQL語句及解需析后得到的執(zhí)行計劃存放需在內(nèi)存中。這塊位于系統(tǒng)全需局區(qū)域SGA(syste嗅m global are嗅a)的共享池(share嗅d
49、 buffer poo嗅l)中的內(nèi)存可以被所有的嗅數(shù)據(jù)庫用戶共享。因此,當(dāng)嗅你執(zhí)行一個SQL語句(有嗅時被稱為一個游標(biāo))時,如嗅果該語句和之前的執(zhí)行過的吟某一語句完全相同, 并且吟之前執(zhí)行的該語句與其執(zhí)行吟計劃仍然在內(nèi)存中存在,則吟ORACLE就不需要再進(jìn)吟行分析,直接得到該語句的吟執(zhí)行路徑。ORACLE的吟這個功能大大地提高了S吟QL的執(zhí)行性能并大大節(jié)省陣了內(nèi)存的使用。使用這個功陣能的關(guān)鍵是將執(zhí)行過的語句陣盡可能放到內(nèi)存中,所以這陣要求有大的共享池(通過設(shè)陣置shared buff陣er pool參數(shù)值)和陣盡可能的使用綁定變量的方陣法執(zhí)行SQL語句。 癥當(dāng)你向ORACLE 提交之一個SQL
50、語句,ORAC延LE會首先在共享內(nèi)存中查延找是否有相同的語句。這里延需要注明的是,ORACL延E對兩者采取的是一種嚴(yán)格延匹配,要達(dá)成共享,SQL延語句必須完全相同(包括空迎格,換行等)。 下面元是判斷SQL語句是否與共元享內(nèi)存中某一SQL相同的元步驟: 1) 對所發(fā)裔出語句的文本串進(jìn)行has裔hed。如果hash值與裔已在共享池中SQL語句的預(yù)hash值相同,則進(jìn)行第預(yù)2步;2) 將所繪發(fā)出語句的文本串(包括大繪小寫、空白和注釋)與在第繪步中識別的所有已存在的繪SQL語句相比較。 鮑例如: SELECT *鮑FROM emp WH檔ERE empno =檔1000;和下列每兵一個都不同 SEL
51、ECT兵* from emp兵WHERE empno兵= 1000;SELE兵CT * FROM EM兵P WHERE empn檔o = 1000;SE檔LECT * FROM檔emp WHERE em檔pno = 2000;檔在上面的語句中列值都絢是直接SQL語句中的,今絢后我們將這類sql成為硬濺編碼SQL或字面值SQL濺使用綁定變量的SQ夾L語句中必須使用相同的名夾字的綁定變量(bind桿variables),桿 例如: a.控該2個sql語句被認(rèn)為相瓣同 select pin瓣, name from瓣people wher瓣e pin = :blk瓣1.pin;selec瓣t pin
52、, name瓣from people瓣where pin =稈:blk1.pin;稈b. 該2個sql語木句被認(rèn)為不相同 sele榴ct pin , nam榴e from peopl榴e where pin榴= :blk1.ot_i榴nd;select p榴in , name fr榴om people wh榴ere pin = :b榴lk1.ov_ind;飄今后我們將上面的這類髓語句稱為綁定變量SQL。髓 3) 將所發(fā)出語句臥中涉及的對象與第步中識臥別的已存在語句所涉及對象臥相比較。 例如: 朋如用戶user1與用戶浦user2下都有EMP表浦,則用戶user1發(fā)出的浦語句:SELECT *浦
53、FROM EMP;與浦用戶user2發(fā)出的語句立:SELECT * FR立OM EMP;被認(rèn)為是立不相同的語句,因為兩個語立句中引用的EMP不是指同細(xì)一個表。 4) 在S選QL語句中使用的捆綁變量選的捆綁類型必須一致。 焉如果語句與當(dāng)前在共享池焉中的另一個語句是等同的話焉,Oracle并不對它進(jìn)焉行語法分析。而直接執(zhí)行該焉語句,提高了執(zhí)行效率,因焉為語法分析比較耗費(fèi)資源。欲 注意的是,從ora較cle 8i開始,新引入睹了一個CURSOR_SH睹ARING參數(shù),該參數(shù)的睹主要目的就是為了解決在編睹程過程中已大量使用的硬編睹碼SQL問題。因為在實際睹開發(fā)中,很多程序人員為了睹提高開發(fā)速度,而采用
54、類似睹下面的開發(fā)方法: str褐_sql string;褐int_empno i褐nt;int_empn稿o = 2000;st稿r_sql = SEL稿ECT * FROM e稿mp WHERE emp稿no = + int稿_empno;斥 int_empno =斥1000;str_s斥ql = SELECT斥* FROM emp斥WHERE empno承= + int_em倦pno; 上面的代綢碼實際上使用了硬編碼SQ綢L,使我們不能使用共享S綢QL的功能,結(jié)果是數(shù)據(jù)庫綢效率不高。但是從上面的2郝個語句來看,產(chǎn)生的硬編碼郝SQL只是列值 不同,其郝它部分都是相同的,如果僅郝僅因為列值不同
55、而導(dǎo)致這2郝個語句不能共享是很可惜的郝,為了解決這個問題,引入郝了CURSOR_SHAR燈ING參數(shù),使這 類問題燈也可以使用共享SQL,從燈而使這樣的開發(fā)也可以利用燈共享SQL功能。聽起來不燈錯,ORACLE真為用戶燈著想,使用戶在不改變代碼燈的情況下還可以利用 共享寂SQL的功能。真的如此嗎桿?天上不會無緣無故的掉一桿個餡餅的,ORACLE對桿該參數(shù)的使用做了說明,建桿議在經(jīng)過實際測試后再改該桿參數(shù)的值(缺省情況 下,桿該參數(shù)的值為EXACT,桿語句完全一致才使用共享S磕QL)。因為有可能該變該磕值后,你的硬編碼SQL是磕可以使用共享SQL了,但磕數(shù)據(jù)庫的性能反而會下 降磕。 我在實際應(yīng)用
56、中已經(jīng)遇磕到這種情況。所以建議編寫磕需要穩(wěn)定運(yùn)行程序的開發(fā)人磕員最好還是一開始就使用綁瑚定變量的SQL。 R哄owid的概念: 貓rowid是一個偽列,既識然是偽列,那么這個列就不識是用戶定義,而是系統(tǒng)自己識給加上的。對每個表都有一識個rowid的偽列,但是識表中并不物理存儲ROW識ID列的值。不過你可以像識使用其它列那樣使用它,但識是不能刪除改列,也不能對慫該列的值進(jìn)行修改、插入。慫一旦一行數(shù)據(jù)插入數(shù)據(jù)庫,慫則rowid在該行 的生慫命周期內(nèi)是唯一的,即即使慫該行產(chǎn)生行遷移,行的ro慫wid也不會改變。 勿為什么使用ROWID 排 rowid對訪問一個排表中的給定的行提供了最快排的訪問方法,
57、通過ROWI排D可以直接定位到相應(yīng)的數(shù)構(gòu)據(jù)塊上,然后將其讀到內(nèi)存構(gòu)。我們創(chuàng)建一個索引時,該構(gòu)索 引不但存儲索引列的值構(gòu),而且也存儲索引值所對應(yīng)構(gòu)的行的ROWID,這樣我構(gòu)們通過索引快速找到相應(yīng)行構(gòu)的ROWID后,通過該R構(gòu)OWID,就可以迅速將數(shù)構(gòu)據(jù)查 詢出來。這也就是我碴們使用索引查詢時,速度比碴較快的原因。 在OR訛ACLE8以前的版本中,訛ROWID由FILE 、訛BLOCK、ROW NU董MBER構(gòu)成。隨著ora般cle8中對象概念的擴(kuò)展般,ROWID發(fā)生了變化,般ROWID由OBJECT般、FILE、BLOCK、般ROW NUMBER構(gòu)成般。利用DBMS_ROWI警D可以將rowid
58、分解成警上述的各部分,也可以將上警述的各部分組成一個有效的警rowid。 Rec盯ursive SQL概念盯 有時為了執(zhí)行用戶繕發(fā)出的一個sql語句,O慕racle必須執(zhí)行一些額慕外的語句,我們將這些額外慕的語句稱之為recur慕sive calls或慕recursive S慕QL statement慕s。如當(dāng)一個DDL語句譬發(fā)出后,ORACLE總是譬隱含的發(fā)出一些recur譬sive SQL語句,來譬修改數(shù)據(jù)字典信息,以便用譬戶可以成功的執(zhí)行該DDL譬語句。當(dāng)需要的數(shù)據(jù)字典信譬息沒有在共享內(nèi)存中時,經(jīng)歐常會發(fā)生Recursiv歐e calls,這些Re歐cursive call歐s會將數(shù)據(jù)字
59、典信息從硬盤歐讀入內(nèi)存中。用戶不比關(guān)心歐這些recursive歐SQL語句的執(zhí)行情況,在歐需要的時候,ORACLE路會自動的在內(nèi)部執(zhí)行這些語路句。當(dāng)然DML語句與SE路LECT都可能引起rec路ursive SQL。簡路單的說,我們可以將觸發(fā)器路視為recursive路SQL。 Row S鉚ource(行源) 言用在查詢中,由上一操作返言回的符合條件的行的集合,言即可以是表的全部行數(shù)據(jù)的言集合;也可以是表的部分行言數(shù)據(jù)的集合;也可以為對上允2個row source允進(jìn)行連接操作(如join允連接)后得到的行數(shù)據(jù)集合魚。 Predicat延e(謂詞) 一個查詢儀中的WHERE限制條件儀Drivi
60、ng Ta徐ble(驅(qū)動表) 焉該表又稱為外層表(OUT焉ER TABLE)。這個焉概念用于嵌套與HASH連遜接中。如果該row so遜urce返回較多的行數(shù)據(jù)遜,則對所有的后續(xù)操作有負(fù)遜面影響。注意此處雖然翻譯遜為驅(qū)動表,但實際上翻譯為遜驅(qū)動行源(driving頒row source)頒更為確切。一般說來,是應(yīng)頒用查詢的限制條件后,返回頒較少行源的表作為驅(qū)動表,頒所以如果一個大表在WHE掉RE條件有有限制條件(如掉等值限 制),則該大表作掉為驅(qū)動表也是合適的,所以掉并不是只有較小的表可以作掉為驅(qū)動表,正確說法應(yīng)該為掉應(yīng)用查詢的限制條件后,返掉回較少行源的表作為驅(qū)動表掉。在執(zhí)行 計劃中,應(yīng)該為
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年蚌埠經(jīng)濟(jì)技術(shù)職業(yè)學(xué)院輔導(dǎo)員招聘備考題庫附答案
- 雷管制造工崗前生產(chǎn)安全培訓(xùn)考核試卷含答案
- 網(wǎng)球制作工創(chuàng)新方法測試考核試卷含答案
- 木門窗工安全知識考核試卷含答案
- 藏藥材種植員安全宣貫水平考核試卷含答案
- 精制鹽工安全風(fēng)險能力考核試卷含答案
- 汽車發(fā)動機(jī)再制造裝調(diào)工操作規(guī)程考核試卷含答案
- 2024年淮南師范學(xué)院馬克思主義基本原理概論期末考試題附答案
- 2025年上海電子信息職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試真題匯編附答案
- 2025年云南農(nóng)業(yè)大學(xué)輔導(dǎo)員招聘備考題庫附答案
- 二保焊培訓(xùn)課件
- 工程變更通知(ECN)流程及管理規(guī)范
- 2025至2030中國助聽器行業(yè)調(diào)研及市場前景預(yù)測評估報告
- 2025-2030碳纖維復(fù)合材料成型設(shè)備技術(shù)發(fā)展與市場前景
- 安全帶質(zhì)檢報告
- 2025時事政治試題庫(附含參考答案)
- 宮腔鏡手術(shù)的護(hù)理常規(guī)
- JJG 1211-2025 自動氣象站風(fēng)向傳感器檢定規(guī)程
- 機(jī)械標(biāo)準(zhǔn)-G類-管件
- 醫(yī)療器械培訓(xùn)計劃和記錄
- 森林質(zhì)量精準(zhǔn)提升的背景與現(xiàn)實需求分析
評論
0/150
提交評論