第一篇:湖北電信Oracle數(shù)據(jù)庫(kù)的優(yōu)化淺探
湖北電信Oracle數(shù)據(jù)庫(kù)優(yōu)化淺探
葉小敏 湖北電信隨州分公司 企業(yè)信息化部(441300)
摘要:在目前的湖北電信計(jì)費(fèi)系統(tǒng)中,所有的賬務(wù)稽查都是通過(guò)編寫(xiě)SQL語(yǔ)句向數(shù)據(jù)庫(kù)提交需求的,面對(duì)全省同時(shí)提交的數(shù)百個(gè)數(shù)據(jù)需求,服務(wù)器接收的任務(wù)過(guò)多,往往會(huì)出現(xiàn)任務(wù)被吊起,長(zhǎng)時(shí)間不響應(yīng)的現(xiàn)象,甚至影響了賬務(wù)結(jié)算工作。經(jīng)過(guò)核查,造成死鎖的原因很多時(shí)候是因?yàn)樘峤坏恼Z(yǔ)句存在各種語(yǔ)法或者邏輯問(wèn)題,易造成死鎖,極大的浪費(fèi)了系統(tǒng)資源。
本文作者根據(jù)多年計(jì)費(fèi)工作經(jīng)驗(yàn)提出了一種優(yōu)化Oracle數(shù)據(jù)庫(kù)的方法。Oracle中SQL語(yǔ)句的執(zhí)行過(guò)程可分為解析(Parse)、執(zhí)行(Execute)和提取結(jié)果(Fetch)三步,該方法是通過(guò)對(duì)SQL語(yǔ)句在Oracle數(shù)據(jù)庫(kù)中優(yōu)化執(zhí)行的三個(gè)過(guò)程來(lái)提高Oracle數(shù)據(jù)庫(kù)的性能。減少系統(tǒng)資源被無(wú)效占用和損耗,這是提高湖北電信計(jì)費(fèi)賬務(wù)結(jié)算稽核效率、按期完成工作的有力保證。
關(guān)鍵詞:數(shù)據(jù)庫(kù); 掃描; 多表聯(lián)結(jié); 子查詢(xún)
1.如何優(yōu)化Parse 1.1 SQL語(yǔ)句的Parse處理步驟:
1)計(jì)算語(yǔ)句值
2)共享池中有無(wú)與此語(yǔ)句值相同的語(yǔ)句?
3)共享池中有與此語(yǔ)句字符完全匹配的語(yǔ)句? 4)準(zhǔn)備要運(yùn)行的SQL語(yǔ)句
5)為新語(yǔ)句在共享池中創(chuàng)建空間 6)將語(yǔ)句存放在共享池中
7)修改共享池圖,標(biāo)明語(yǔ)句的值和在共享池中的位置 8)執(zhí)行準(zhǔn)備好的SQL語(yǔ)句
最理想的是,語(yǔ)句只執(zhí)行1、2、3和8步來(lái)進(jìn)行處理。不經(jīng)過(guò)2、3步來(lái)測(cè)試被傳給Oracle的語(yǔ)句要使用1~8步進(jìn)行處理。只經(jīng)過(guò)1、2、3、8的SQL語(yǔ)句要比經(jīng)過(guò)1~8步的語(yǔ)句更為有效。
1.2 在共享池中重用SQL語(yǔ)句
當(dāng)SQL語(yǔ)句被傳遞給Oracle處理時(shí),其秘訣是重復(fù)使用已經(jīng)在共享池中的語(yǔ)句,而不是讓Oracle在接受語(yǔ)句時(shí)去準(zhǔn)備新的語(yǔ)句。
Oracle提供在數(shù)據(jù)庫(kù)中存儲(chǔ)代碼的能力,當(dāng)應(yīng)用系統(tǒng)開(kāi)始運(yùn)行時(shí),從數(shù)據(jù)庫(kù)中讀取代碼傳遞到共享池中去處理。從數(shù)據(jù)庫(kù)中取出的代碼是編譯過(guò)的并駐留在共享池中。當(dāng)SQL語(yǔ)句被傳遞給Oracle處理是,如果Oracle接受了一個(gè)與共享池中語(yǔ)句一致的語(yǔ)句。就重用共享池中的語(yǔ)句。兩條SQL語(yǔ)句必須是語(yǔ)法、文本完全相同,才能市委可以共享的SQL,利用Oracle共享區(qū)。
湖北電信賬務(wù)稽核工作由全省各本地網(wǎng)人員共同參與,人員較多且語(yǔ)句編寫(xiě)思想均存在差異,但最終的需求是一致的,依據(jù)共享原則,由省公司賬務(wù)處理部門(mén)按照稽核要求和內(nèi)容,規(guī)定稽核點(diǎn)和稽核方法,下發(fā)經(jīng)過(guò)整理的具有標(biāo)準(zhǔn)格式、大小寫(xiě)以及相同變量等遵循規(guī)定的稽核語(yǔ)句和過(guò)程,從而可以最大限度的重用共享池中的語(yǔ)句和過(guò)程,從而可以最大限度的重用共享池中的SQL語(yǔ)句。如何優(yōu)化Execute和Fetch 2.1避免無(wú)計(jì)劃的全表掃描
全表掃描連續(xù)從表讀取所有數(shù)據(jù),而不管數(shù)據(jù)是否與查詢(xún)有關(guān)。避免不必要的全表掃描有兩個(gè)充足理由:1全表掃描沒(méi)有選擇性。2通過(guò)全表掃描讀取的數(shù)據(jù)很快從SGA的緩沖區(qū)移走(如果正在掃描的表不是“高速存儲(chǔ)”的表)
在基于規(guī)則優(yōu)化的情況下,如果下列任何條件在SGA語(yǔ)句出現(xiàn),就要對(duì)一個(gè)表進(jìn)行全表掃描。1)該表無(wú)索引
2)對(duì)返回的行無(wú)任何限定條件(如無(wú)Where語(yǔ)句)
3)對(duì)數(shù)據(jù)表與任何索引主列相對(duì)應(yīng)的行無(wú)限定條件。例如,在City-State-Zip列上創(chuàng)建了三列復(fù)合索引,那么僅對(duì)State列有限定條件的查詢(xún)不能使用這個(gè)索引,因?yàn)镾tate不是索引的主列。
4)對(duì)索引主列的行有限定條件,但條件或者是NULL或者是不相等。例如,City列上存在索引,在所有下列情況下都不會(huì)使用索引。Where city is null Where city is not null Where city!= ‘jilin’
5)對(duì)索引主列的行有限定條件,但條件在表達(dá)式里使用。例如,如果在City列上索引,那么限定條件
Where City = ‘jilin’
可以使用索引。然而,如果限定條件是 Where UPPER(City)=’liaoning’
那么不會(huì)使用City列上的索引,因?yàn)镃ity列在UPPER函數(shù)里。如果將City列與文本字符串聯(lián)結(jié)在一起,也不會(huì)使用索引。例如,如果限定條件是 Where City||’x’ like ‘jilin%’
那么不會(huì)使用City列上的索引。
6)對(duì)索引主列的行有限定條件,但條件使用Like操作以及值以‘%’開(kāi)始或者值是一個(gè)賦值變量。例如,在所有下列情況下都不會(huì)使用索引: Where City like ‘%aonin%’
Where City like :City_Bind_Variable 如果表小、索引列無(wú)選擇性,基于開(kāi)銷(xiāo)的優(yōu)化器可能決定使用全表掃描。2.2只使用選擇性索引
索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。如果表有1000個(gè)記錄,表索引列有950個(gè)不同值,那么這個(gè)索引的選擇性就是950/1000或者0.95。最好的可能性選擇是1.0。依據(jù)非空值列的唯一索引,通常其選擇性為1.0。
如果使用基于開(kāi)銷(xiāo)的最優(yōu)化,優(yōu)化器不應(yīng)該使用選擇性不好的索引。
索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。如果表有1000個(gè)記錄,表索引列有950個(gè)不同值,那么這個(gè)索引的選擇性就是950/1000或者0.95。最好的可能性選擇是1.0。依據(jù)非空值列的唯一索引,通常其選擇性為1.0。
2.3管理多表聯(lián)結(jié)
Oracle提供了3個(gè)聯(lián)結(jié)操作:NESTED LOOPS、HASH JOIN和MERGE JOIN。MERGE JOIN是一組操作,在所有行被處理完之前,它不返任何記錄給下一操作。NESTED LOOPS和HASH JOIN是行操作,因此會(huì)很快將第一批記錄返回給下一個(gè)操作。
在每個(gè)聯(lián)結(jié)選項(xiàng)里,必須執(zhí)行一些步驟以獲取最好的聯(lián)結(jié)性能。如果沒(méi)有適當(dāng)?shù)貎?yōu)化聯(lián)結(jié)操作,那么聯(lián)結(jié)所需的時(shí)間也許隨著表的增長(zhǎng)而呈指數(shù)級(jí)地增長(zhǎng)。
2.4管理包含視圖的SQL語(yǔ)句
如果查詢(xún)包含視圖,優(yōu)化器有兩種執(zhí)行查詢(xún)的方法:首先解決視圖然后執(zhí)行查詢(xún),或者把視圖文本集成到查詢(xún)里去。如果首先執(zhí)行視圖,那么首先完成全部的結(jié)果集,然后用其余的查詢(xún)條件做過(guò)濾器。
首先解決視圖會(huì)導(dǎo)致查詢(xún)性能下降的問(wèn)題,這取決于所涉及表的相對(duì)大小。如果視圖被集成到查詢(xún)里,那么查詢(xún)的條件也可以應(yīng)用于視圖里,并且可以使用一個(gè)小一些的結(jié)果集。然而在一些情況下,也許可以通過(guò)視圖分離組操作提高查詢(xún)性能。
如果一個(gè)視圖包含集合的操作(如Group by、SUM、COUNT或者DISTINCT),那么視圖不能被集成到查詢(xún)里去。不使用組或者沒(méi)有集合操作的視圖的SQL語(yǔ)法可以被集成到大的查詢(xún)里去。
2.5優(yōu)化子查詢(xún)
當(dāng)使用自查詢(xún)時(shí),也許會(huì)碰到幾個(gè)獨(dú)特的問(wèn)題。涉及子查詢(xún)的查詢(xún)潛在問(wèn)題如下: a)也許在執(zhí)行完查詢(xún)的剩余部分前執(zhí)行子查詢(xún)(與執(zhí)行分組功能的視圖相似)。b)子查詢(xún)也許要求特定的提示,但這些提示不直接與調(diào)用該子查詢(xún)的查詢(xún)有關(guān)。c)可以作為單個(gè)查詢(xún)執(zhí)行的子查詢(xún)也許被代替寫(xiě)成幾個(gè)不同的子查詢(xún)。
d)也許在使用not in子句或者not exists子句時(shí),不能在最有效的方式下進(jìn)行子查詢(xún)的存在查詢(xún)。
1)當(dāng)執(zhí)行子查詢(xún)時(shí)
如果一個(gè)查詢(xún)包含子查詢(xún),那么優(yōu)化器有兩種完成查詢(xún)的方法:首先完成子查詢(xún),然后完成查詢(xún)(“視圖的方法”),或者將子查詢(xún)集成到查詢(xún)里去(“聯(lián)結(jié)”的方法)。如果首先解決子查詢(xún),那么整個(gè)子查詢(xún)的結(jié)果集將首先被計(jì)算,并且用查詢(xún)條件的剩余部分做過(guò)濾器。如果沒(méi)有使用子查詢(xún)?nèi)ミM(jìn)行存在檢查,那么“聯(lián)結(jié)”方法將通常要比“視圖”方法完成得好 2)如何組合子查詢(xún)
一個(gè)查詢(xún)可以包含多個(gè)子查詢(xún),使用的子查詢(xún)?cè)蕉?,集成或者重?xiě)它們到大的聯(lián)結(jié)里就越困難。既然有多個(gè)子查詢(xún)使集成困難,就應(yīng)該盡可能地組合多個(gè)子查詢(xún)。3)怎樣進(jìn)行存在檢查
有時(shí)子查詢(xún)不返回行(記錄),但可以進(jìn)行數(shù)據(jù)正確性檢查。在相關(guān)表里的記錄或者存在或者不存在的邏輯檢查,稱(chēng)為存在檢查。可以使用exists和not exists子句提高存在檢查的性能。
2.6管理對(duì)非常巨大的表的訪(fǎng)問(wèn)
隨著表增長(zhǎng)到比SGA的數(shù)據(jù)塊高速緩沖區(qū)存儲(chǔ)器的空間顯著大時(shí),需要從另一些角度優(yōu)化對(duì)這個(gè)表的查詢(xún)。
1)當(dāng)表和它的索引小的時(shí)候,在SGA里可以有高度的數(shù)據(jù)共享。多用戶(hù)讀表或索引范圍掃描可以反復(fù)使用同一個(gè)塊。隨著表的增長(zhǎng),表的索引也在增長(zhǎng)。隨著表和它的索引增長(zhǎng)到比SGA里提供的空間大時(shí),范圍掃描需要的下一行將在SGA里找到的可能性變小,數(shù)據(jù)庫(kù)的命中率將減小。最后,每一個(gè)邏輯讀將要求一個(gè)單獨(dú)的物理讀。對(duì)使用非常大的表的優(yōu)化方法著眼于特別的索引技術(shù)和有關(guān)索引的選擇。
2)管理數(shù)據(jù)接近,在訪(fǎng)問(wèn)非常大的表期間,如果傾向于繼續(xù)使用索引,那么應(yīng)該關(guān)注數(shù)據(jù)接近,即邏輯相關(guān)記錄的物理關(guān)系。為了使數(shù)據(jù)最大限度地接近,應(yīng)該連續(xù)往表里插入記錄。記錄按通常在表的范圍掃描里使用的列排序。
3)避免沒(méi)有幫助的索引掃描,如果要對(duì)大表使用索引掃描,那么不能假定索引掃描將比全表掃描執(zhí)行得更好。不緊跟表訪(fǎng)問(wèn)的索引唯一掃描或范圍掃描執(zhí)行得比較好,但緊跟通過(guò)RowID的表訪(fǎng)問(wèn)的索引范圍掃描也許執(zhí)行得差。隨著表增長(zhǎng)到比數(shù)據(jù)塊高速緩沖存儲(chǔ)器大得多,最終,索引掃描和全表掃描間的平衡點(diǎn)打破。
4)創(chuàng)建充分索引的表,如果表中的數(shù)據(jù)相當(dāng)穩(wěn)定,充分索引一個(gè)表是很有用的。創(chuàng)建一個(gè)復(fù)合索引,它包括所有在查詢(xún)期間通常選擇的列。在查詢(xún)期間,查詢(xún)要求的所有數(shù)據(jù)可以通過(guò)索引訪(fǎng)問(wèn)提供,不需要任何表訪(fǎng)問(wèn)。5)并行選項(xiàng),可以把一個(gè)數(shù)據(jù)庫(kù)任務(wù),比如Select語(yǔ)句,分為多個(gè)單元的工作,由多個(gè)Oracle進(jìn)程同時(shí)執(zhí)行。這種能夠允許數(shù)據(jù)庫(kù)的單個(gè)查詢(xún)活動(dòng)由多個(gè)協(xié)調(diào)的進(jìn)程透明地進(jìn)行處理的能力,稱(chēng)為并行查詢(xún)選項(xiàng)(PQO)。并行選項(xiàng)調(diào)用多個(gè)進(jìn)程來(lái)利用空閑的系統(tǒng)資源,以減少完成任務(wù)所需要的時(shí)間。并行選項(xiàng)并不減少處理過(guò)程所要求的資源數(shù)量,而是把處理的任務(wù)分散給多個(gè)CPU。
2.7使用UNION ALL而不是UNION 在湖北電信賬務(wù)稽核中,往往需要把符合條件的幾部分?jǐn)?shù)據(jù)匯總,形成一個(gè)新的結(jié)果表。
最常用的集操作是UNION操作,UNION操作使多個(gè)記錄集聯(lián)結(jié)成為單個(gè)集。UNION操作的數(shù)學(xué)定義是返回記錄的單個(gè)集并且沒(méi)有重復(fù)的行,所以在合并結(jié)果集里,Oracle只返回不同的記錄。
當(dāng)UNION操作用作SQL語(yǔ)句的一部分時(shí),唯一性要求強(qiáng)迫Oracle移走重復(fù)的記錄。Oracle的移走重復(fù)記錄的功能是SORT UNIQUE操作,它與使用DISTINCT子句時(shí)執(zhí)行的操作類(lèi)似。
UNION ALL操作允許重復(fù)。UNION ALL不要求SORT UNIQUE操作,從而節(jié)省了開(kāi)銷(xiāo)。UNION ALL是一個(gè)行操作,所以當(dāng)其變?yōu)橛行Ь头祷亟o用戶(hù)。而UNION包括SORT UNIQUE集操作,在全部記錄的集的排序結(jié)束前,不返回任何記錄給用戶(hù)。
當(dāng)UNION ALL操作產(chǎn)生巨大的結(jié)果集時(shí),不需要任何排序便返回記錄給應(yīng)用的事實(shí)意味著第一行檢索的響應(yīng)時(shí)間更快,并且在許多情況下,可以不用臨時(shí)段完成操作。
在有些情況下,UNION ALL和UNION不返回同樣的結(jié)果。如果在應(yīng)用環(huán)境中,結(jié)果集并不包含任何重復(fù)的記錄,則可以把UNION轉(zhuǎn)換成UNION ALL。
經(jīng)過(guò)筆者實(shí)際賬務(wù)工作驗(yàn)證,采用UNION ALL操作往往能獲得更快的響應(yīng)速度。
2.8避免在SQL里使用PL/SQL功能調(diào)用
對(duì)于增加PL/SQL的使用,許多用戶(hù)試圖利PL/SQL功能的優(yōu)勢(shì)產(chǎn)生可重復(fù)使用的代碼。其中一個(gè)強(qiáng)迫重復(fù)使用PL/SQL功能的方法是在SQL語(yǔ)句里使用。例如,可以創(chuàng)建一個(gè)將國(guó)際貨幣轉(zhuǎn)換為US$的函數(shù)。這個(gè)函數(shù)稱(chēng)為US$。示例如下:
select transaction_type, US$(amount, currency)from international_transaction where US$(amount, currency)> 1000;執(zhí)行前面的SQL語(yǔ)句沒(méi)有所期望的那樣好。在測(cè)試時(shí),它的性能大約比下面得出相同結(jié)果的SQL語(yǔ)句慢大約幾十倍。
select transaction_type,amount*exchange_rate US$ from exchange_rate er, international_transaction it where er.currency = it.currency and amount*exchange_rate > 1000;響應(yīng)時(shí)間不同的原因是混合PL/SQL和SQL時(shí),Oracle使用的機(jī)制不同。在SQL查詢(xún)里嵌入PL/SQL功能時(shí),在執(zhí)行時(shí),Oracle將調(diào)用分成兩部分:用帶有賦值變量的SQL語(yǔ)句代替功能調(diào)用以及對(duì)每一個(gè)函數(shù)調(diào)用的無(wú)名PL/SQL塊。
select transaction_type, :a1 from international_transaction where :a1 > 1000 和 BEGIN :a1 := US$(:amount, :currency);END 對(duì)在international_transaction表里的每一行,將執(zhí)行在前面示例里顯示的無(wú)名塊兩次。無(wú)名塊調(diào)用導(dǎo)致查詢(xún)響應(yīng)時(shí)間的劇增。應(yīng)該避免在SQL語(yǔ)句里使用PL/SQL功能調(diào)用。
3.結(jié)語(yǔ)
本文依據(jù)作者在湖北電信計(jì)費(fèi)系統(tǒng)多年工作經(jīng)驗(yàn),結(jié)合ORACLE數(shù)據(jù)庫(kù),簡(jiǎn)單論述了一些Oracle數(shù)據(jù)庫(kù)優(yōu)化的一些操作方法,為湖北電信計(jì)費(fèi)工作同仁提供了一些Oracle數(shù)據(jù)庫(kù)優(yōu)化查詢(xún)和運(yùn)行的解決方案,希望籍此對(duì)湖北電信賬務(wù)和計(jì)費(fèi)處理工作帶來(lái)具體的幫助。
參考文獻(xiàn)
[1] 甕正科,王新英著.Oracle8.X For Windows NT實(shí)用教程[M].北京:清華大學(xué)出版社,1999.[2] 薩師萱,王珊著.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,2000.2.[3] Eyal Aronoff,Kevin Loney,Noorali Sonawalla著, 李逸波、王華駒、馬賽紅、曲寧等譯.Oracle8性能優(yōu)化和管理手冊(cè)[M].北京:電子工業(yè)出版社,2000.1.[4] Peter Koletzke,Dr.Paul Dorsey著, 劉曉霞、孫登峰、曲京、何粼等譯.Oracle Designer信息系統(tǒng)開(kāi)發(fā)[M].北京:機(jī)械工業(yè)出版社,1999.8
第二篇:Oracle DBA優(yōu)化數(shù)據(jù)庫(kù)性能心得體會(huì)
Oracle DBA優(yōu)化數(shù)據(jù)庫(kù)性能心得體會(huì)
很多的時(shí)侯,做Oracle DBA的我們,當(dāng)應(yīng)用管理員向我們通告現(xiàn)在應(yīng)用很慢、數(shù)據(jù)庫(kù)很慢的時(shí)侯,我們到數(shù)據(jù)庫(kù)時(shí)做幾個(gè)示例的Select也發(fā)現(xiàn)同樣的問(wèn)題時(shí),有些時(shí)侯我們會(huì)無(wú)從下手,因?yàn)槲覀冋J(rèn)為數(shù)據(jù)庫(kù)的各種命種率都是滿(mǎn)足Oracle文檔的建議。實(shí)際上如今的優(yōu)化己經(jīng)向優(yōu)化等待(waits)轉(zhuǎn)型了,實(shí)際中性能優(yōu)化最根本的出現(xiàn)點(diǎn)也都集中在IO,這是影響性能最主要的方面,由系統(tǒng)中的等待去發(fā)現(xiàn)Oracle庫(kù)中的不足、操作系統(tǒng)某些資源利用的不合理是一個(gè)比較好的辦法,下面把我的一點(diǎn)實(shí)踐經(jīng)驗(yàn)與大家分享一下,本文測(cè)重于Unix環(huán)境。
一、通過(guò)操作系統(tǒng)的一些工具檢查系統(tǒng)的狀態(tài),比如CPU、內(nèi)存、交換、磁盤(pán)的利用率,根據(jù)經(jīng)驗(yàn)或與系統(tǒng)正常時(shí)的狀態(tài)相比對(duì),有時(shí)系統(tǒng)表面上看起來(lái)看空閑這也可能不是一個(gè)正常的狀態(tài),因?yàn)閏pu可能正等待IO的完成。除此之外我們還應(yīng)觀注那些占用系統(tǒng)資源(cpu、內(nèi)存)的進(jìn)程。
1、如何檢查操作系統(tǒng)是否存在IO的問(wèn)題?使用的工具有sar,這是一個(gè)比較通用的工具。
Rp1#sar-u 2 10
即每隔2秒檢察一次,共執(zhí)行20次,當(dāng)然這些都由你決定了。
示例返回:
HP-UX hpn2 B.11.00 U 9000/800 08/05/03
18:26:32 %usr %sys %wio %idle
注:我在redhat下查看是這種結(jié)果,不知%system就是所謂的%wio。
Linux 2.4.21-20.ELsmp(YY075)05/19/2005
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
10:36:17 AM CPU %user %nice %system %idle
10:36:19 AM all 0.00 0.00 0.00 100.00
10:36:21 AM all 0.00 0.00 0.00 100.00
10:36:23 AM all 0.00 0.00 0.00 100.00
10:36:25 AM all 0.00 0.00 0.00 100.00
其中的%usr指的是用戶(hù)進(jìn)程使用的cpu資源的百分比,%sys指的是系統(tǒng)資源使用cpu資源的百分比,%wio指的是等待io完成的百分比,這是值得我們觀注的一項(xiàng),%idle即空閑的百分比。如果wio列的值很大,如在35%以上,說(shuō)明你的系統(tǒng)的IO存在瓶頸,你的CPU花費(fèi)了很大的時(shí)間去等待IO的完成。Idle很小說(shuō)明系統(tǒng)CPU很忙。像我的這個(gè)示例,可以看到wio平均值為11說(shuō)明io沒(méi)什么特別的問(wèn)題,而我的idle值為零,說(shuō)明我的cpu已經(jīng)滿(mǎn)負(fù)荷運(yùn)行
了。
當(dāng)你的系統(tǒng)存在IO的問(wèn)題,可以從以下幾個(gè)方面解決:
*聯(lián)系相應(yīng)的操作系統(tǒng)的技術(shù)支持對(duì)這方面進(jìn)行優(yōu)化,比如hp-ux在劃定卷組時(shí)的條帶化等方面。
*查找Oracle中不合理的sql語(yǔ)句,對(duì)其進(jìn)行優(yōu)。
*對(duì)Oracle中訪(fǎng)問(wèn)量頻繁的表除合理建索引外,再就是把這些表分表空間存放以免訪(fǎng)問(wèn)上產(chǎn)生熱點(diǎn),再有就是對(duì)表合理分區(qū)。
常用的工具便是vmstat,對(duì)于hp-unix來(lái)說(shuō)可以用glance,Aix來(lái)說(shuō)可以用topas,當(dāng)你發(fā)現(xiàn)vmstat中pi列非零,memory中的free列的值很小,glance,topas中內(nèi)存的利用率多于80%時(shí),這時(shí)說(shuō)明你的內(nèi)存方面應(yīng)該調(diào)節(jié)一下了,方法大體有以下幾項(xiàng)。
*?jiǎng)澖oOracle使用的內(nèi)存不要超過(guò)系統(tǒng)內(nèi)存的1/2,一般保在系統(tǒng)內(nèi)存的40%為益。
*為系統(tǒng)增加內(nèi)存。
*如果你的連接特別多,可以使用MTS的方式。
*打全補(bǔ)丁,防止內(nèi)存漏洞。
3、如何找到點(diǎn)用系用資源特別大的Oracle的session及其執(zhí)行的語(yǔ)句。
Hp-unix可以用glance,top,IBM AIX可以用topas,此外可以使用ps的命令。通過(guò)這些程序我們可以找到點(diǎn)用系統(tǒng)資源特別大的這些進(jìn)程的進(jìn)程號(hào),我們就可以通過(guò)以下的sql語(yǔ)句發(fā)現(xiàn)這個(gè)pid正在執(zhí)行哪個(gè)sql,這個(gè)sql最好在pl/sql developer,toad等軟件中執(zhí)行, 把<>中的spid換成你的spid就可以了。
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text from v$session a,v$process b,v$sqltext c WHERE b.spid='ORCL' AND b.addr=a.paddr AND
a.sql_address=c.address(+)order BY c.piece
我們就可以把得到的這個(gè)sql分析一下,看一下它的執(zhí)行計(jì)劃是否走索引,對(duì)其優(yōu)化避免全表掃描,以減少I(mǎi)O等待,從而加快語(yǔ)句的執(zhí)行速度。
提示:我在做優(yōu)化sql時(shí),經(jīng)常碰到使用in的語(yǔ)句,這時(shí)我們一定要用exists把它給換掉,因?yàn)镺racle在處理In時(shí)是按Or的方式做的,即使使用了索引也會(huì)很慢。
比如:
SELECT col1,col2,col3 FROM table1 a
WHERE a.col1 not in(SELECT col1 FROM table2)
可以換成:
SELECT col1,col2,col3 FROM table1 a
WHERE not exists
(SELECT 'x' FROM table2 b
WHERE a.col1=b.col1)
4、另一個(gè)有用的腳本:查找前十條性能差的sql。
SELECT * FROM(select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
order BY disk_reads DESC)where ROWNUM<10;
二、迅速發(fā)現(xiàn)Oracle Server的性能問(wèn)題的成因,我們可以求助于v$session_wait這個(gè)視圖,看系統(tǒng)的這些session在等什么,使用了多少的IO。以下是我提供的參考腳本:
腳本說(shuō)明:查看占io較大的正在運(yùn)行的session。
SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program,se.MODULE,、se.sql_address,st.event,st.p1text,si.physical_reads,si.block_changes FROM v$session se,v$session_wait st,v$sess_io si,v$process pr WHERE st.sid=se.sid AND st.sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC
對(duì)檢索出的結(jié)果的幾點(diǎn)說(shuō)明:
1、我是按每個(gè)正在等待的session已經(jīng)發(fā)生的物理讀排的序,因?yàn)樗c實(shí)際的IO相關(guān)。
2、你可以看一下這些等待的進(jìn)程都在忙什么,語(yǔ)句是否合理?
Select sql_address from v$session where sid=;
Select * from v$sqltext where address=;
執(zhí)行以上兩個(gè)語(yǔ)句便可以得到這個(gè)session的語(yǔ)句。你也以用alter system kill session 'sid,serial#';把這個(gè)session殺掉。
3、應(yīng)觀注一下event這列,這是我們調(diào)優(yōu)的關(guān)鍵一列,下面對(duì)常出現(xiàn)的event做以簡(jiǎn)要的說(shuō)
明:
a、buffer busy waits,free buffer waits這兩個(gè)參數(shù)所標(biāo)識(shí)是dbwr是否夠用的問(wèn)題,與IO很大相關(guān)的,當(dāng)v$session_wait中的free buffer wait的條目很小或沒(méi)有的時(shí)侯,說(shuō)明你的系統(tǒng)的dbwr進(jìn)程決對(duì)夠用,不用調(diào)整;free buffer wait的條目很多,你的系統(tǒng)感覺(jué)起來(lái)一定很慢,這時(shí)說(shuō)明你的dbwr已經(jīng)不夠用了,它產(chǎn)生的wio已經(jīng)成為你的數(shù)據(jù)庫(kù)性能的瓶頸,這時(shí)的解決辦法如下:
a.1增加寫(xiě)進(jìn)程,同時(shí)要調(diào)整db_block_lru_latches參數(shù)。
示例:修改或添加如下兩個(gè)參數(shù)
db_writer_processes=4
db_block_lru_latches=8
a、2開(kāi)異步IO,IBM這方面簡(jiǎn)單得多,hp則麻煩一些,可以與Hp工程師聯(lián)系。
b、db file sequential read,指的是順序讀,即全表掃描,這也是我們應(yīng)該盡量減少的部分,解決方法就是使用索引、sql調(diào)優(yōu),同時(shí)可以增大db_file_multiblock_read_count這個(gè)參數(shù)。
c、db file scattered read,這個(gè)參數(shù)指的是通過(guò)索引來(lái)讀取,同樣可以通過(guò)增加db_file_multiblock_read_count這個(gè)參數(shù)來(lái)提高性能。
d、latch free,與栓相關(guān)的了,需要專(zhuān)門(mén)調(diào)節(jié)。
e、其他參數(shù)可以不特別觀注。
其他的優(yōu)化手段似乎主要集中在SQL查詢(xún)語(yǔ)句上面,Oracle本身也提供了優(yōu)化器。看來(lái)DBA的學(xué)問(wèn)不少啊。
第三篇:Oracle數(shù)據(jù)庫(kù)實(shí)驗(yàn)報(bào)告
中南林業(yè)科技大學(xué)
實(shí)驗(yàn)報(bào)告
課程名稱(chēng):
Oracle數(shù)據(jù)庫(kù) 專(zhuān)業(yè)班級(jí): 姓名:
學(xué)號(hào):
****年**月**日
實(shí)驗(yàn)一
安裝和使用Oracle數(shù)據(jù)庫(kù)
【實(shí)驗(yàn)?zāi)康摹?/p>
1.掌握Oracle軟件安裝過(guò)程,選擇安裝組件 2.掌握建立Oracle數(shù)據(jù)庫(kù),配置網(wǎng)絡(luò)連接 3.掌握Oracle企業(yè)管理器的基本操作 4.使用SQL*Plus,登錄到實(shí)例和數(shù)據(jù)庫(kù) 5.掌握命令方式的關(guān)閉和啟動(dòng)實(shí)例及數(shù)據(jù)庫(kù) 【實(shí)驗(yàn)內(nèi)容】
1.查看已安裝的Oracle組件
2.查看服務(wù),記錄下和數(shù)據(jù)庫(kù)有關(guān)的服務(wù)名,將他們?cè)O(shè)為手動(dòng)方式,啟動(dòng)相關(guān)服務(wù)。
3.配置監(jiān)聽(tīng)器,查看是否在服務(wù)中有LISTENER,是否能啟動(dòng)。4.配置本地net服務(wù),提示:設(shè)置正確的服務(wù)器地址和端口號(hào)。5.打開(kāi)SQL*Plus,用SYS和SYSTEM用戶(hù)名和密碼登錄。6.思考題:有幾種打開(kāi)SQL*Plus的方法?分別是什么? 7.用命令關(guān)閉實(shí)例和數(shù)據(jù)庫(kù),記錄命令
8.用命令以NOMOUNT的方式啟動(dòng)實(shí)例,再加載數(shù)據(jù)庫(kù),打開(kāi)數(shù)據(jù)庫(kù)。
【實(shí)驗(yàn)結(jié)論】
1.查看已安裝的Oracle組件
2.查看服務(wù),記錄下和數(shù)據(jù)庫(kù)有關(guān)的服務(wù)名,將他們?cè)O(shè)為手動(dòng)方式,啟動(dòng)相關(guān)服務(wù)。
3.配置監(jiān)聽(tīng)器,查看是否在服務(wù)中有LISTENER,是否能啟動(dòng)。
4.配置本地net服務(wù),提示:設(shè)置正確的服務(wù)器地址和端口號(hào)。
5.打開(kāi)SQL*Plus,用SYS和SYSTEM用戶(hù)名和密碼登錄。
6.思考題:有幾種打開(kāi)SQL*Plus的方法?分別是什么?(1)直接打開(kāi) sql plus 即窗口方式(2)cmd 命令行方式
(3)WEB 頁(yè)面中 iSQL*Plus 方式 7.用命令關(guān)閉實(shí)例和數(shù)據(jù)庫(kù),記錄命令 SQL>shutdown immediate
8.用命令以NOMOUNT的方式啟動(dòng)實(shí)例,再加載數(shù)據(jù)庫(kù),打開(kāi)數(shù)據(jù)庫(kù)。
sql>startup nomount sql>alter database mount;sql>alter database open;sql>startup
(1).用SQLplus 命令:show parameters參數(shù)名
(2).用select [列名] from 表名
2.初始化文件有幾種?默認(rèn)的保存位置在哪里?
初始化文件有三種:數(shù)據(jù)文件,日志文件,控制文件; 默認(rèn)的保存位置E:oracleproduct10.2.0oradataorcl
4.打開(kāi)OEM,查看三類(lèi)物理文件信息
三類(lèi)物理文件:數(shù)據(jù)文件、控制文件、日志文件 數(shù)據(jù)文件:.DBF存儲(chǔ)表、索引及數(shù)據(jù)結(jié)構(gòu)信息
日志文件:.LOG記錄對(duì)數(shù)據(jù)庫(kù)的所有修改信息,用于恢復(fù)
控制文件:.CTL二進(jìn)制文件,記錄數(shù)據(jù)庫(kù)名、文件標(biāo)識(shí)、檢查點(diǎn)
5.分別用select命令查詢(xún)V$parameter動(dòng)態(tài)性能視圖,用show命令查看全局?jǐn)?shù)據(jù)庫(kù)名、實(shí)例名、是否啟動(dòng)自動(dòng)歸檔、標(biāo)準(zhǔn)數(shù)據(jù)塊大小這四個(gè)參數(shù)的值,記錄命令和結(jié)果。用select命令查詢(xún)V$parameter動(dòng)態(tài)性能視圖
用show命令查看全局?jǐn)?shù)據(jù)庫(kù)名、實(shí)例名
用show命令查看是否啟動(dòng)自動(dòng)歸檔、標(biāo)準(zhǔn)數(shù)據(jù)塊大小
6.如何用命令查看數(shù)據(jù)文件、控制文件的文件名、存儲(chǔ)位置和狀態(tài)信息?
(1).查看數(shù)據(jù)文件的文件名、存儲(chǔ)位置和狀態(tài)信息
(2).查看控制文件的文件名、存儲(chǔ)位置和狀態(tài)信息
0
和服務(wù)器型文件都要找到),查看各類(lèi)默認(rèn)位置并記錄下來(lái)(包括物理文件所在目錄,該數(shù)據(jù)庫(kù)相關(guān)的各個(gè)目錄等),登錄到mydb數(shù)據(jù)庫(kù)。
2.用命令方式手工創(chuàng)建數(shù)據(jù)庫(kù)testorcl
(1)創(chuàng)建批處理文件,建立必需的各級(jí)目錄,參考第一題MYDB數(shù)據(jù)庫(kù)的默認(rèn)目錄。
(4)運(yùn)行數(shù)據(jù)庫(kù)建立腳本,更改相關(guān)服務(wù)為手動(dòng)啟動(dòng)方式
(5)運(yùn)行數(shù)據(jù)字典等創(chuàng)建腳本
3.在DBCA中刪除MYDB數(shù)據(jù)庫(kù)。
Enter valuefor 4:runner Specify log path as parameter 5: Enter valuefor 5: D:oracleproduct10.2.0db_2RDBMSlog
二、完成下面的查詢(xún),記錄查詢(xún)命令和結(jié)果。1.查詢(xún)HR方案種有哪些表,列出表名 2.設(shè)置行寬為160,每頁(yè)行數(shù)為40 3.查詢(xún)employees表中所有薪水在3000到6000元之間的員工編號(hào)、姓、名、受聘日期、工作代號(hào)、薪水、經(jīng)理代號(hào)、部門(mén)號(hào),按部門(mén)號(hào)升序排列,同一部門(mén)按員工編號(hào)降序排列
4.查詢(xún)每個(gè)部門(mén)的人數(shù)、平均薪水、最高薪水、最低薪水,按部門(mén)編號(hào)升序排列
5.查詢(xún)first_name的第三個(gè)字母是t的員工編號(hào),first_name,電話(huà)號(hào)碼,部門(mén)編號(hào),部門(mén)名稱(chēng)
6.在job_history表中查詢(xún)?nèi)温殨r(shí)間超過(guò)1年的員工編號(hào),任職歷時(shí)月份(保留整數(shù)),工作代號(hào),部門(mén)代號(hào)。
7.查詢(xún)每個(gè)部門(mén)經(jīng)理的員工編號(hào)、姓名、薪水、部門(mén)號(hào)。
【實(shí)驗(yàn)結(jié)論】
一、需要訪(fǎng)問(wèn)HR示例方案中的表,如果機(jī)器上沒(méi)有該示例方案,則運(yùn)行相關(guān)包和相應(yīng)配置裝入HR方案。
1.將hr.rar解壓到D:oracleproduct10.2.0db_2demoschema human_resources目錄下,然后在SQL*PLUS 中執(zhí)行 hr_main.sql
二、完成下面的查詢(xún),記錄查詢(xún)命令和結(jié)果。1.查詢(xún)HR方案種有哪些表,列出表名
5.查詢(xún)first_name的第三個(gè)字母是t的員工編號(hào),first_name,電話(huà)號(hào)碼,部門(mén)編號(hào),部門(mén)名稱(chēng)
738
實(shí)驗(yàn)五
PL/SQL編程
【實(shí)驗(yàn)?zāi)康摹?/p>
1.熟悉PL/SQL的數(shù)據(jù)類(lèi)型和書(shū)寫(xiě)規(guī)則 2.熟悉控制結(jié)構(gòu)和游標(biāo)的使用 3.編寫(xiě)和運(yùn)行函數(shù)、過(guò)程和觸發(fā)器 【實(shí)驗(yàn)內(nèi)容】
編寫(xiě)腳本文件,調(diào)試運(yùn)行腳本文件,并記錄結(jié)果。
1.在SQL*Plus中編寫(xiě)一個(gè)PL/SQL塊,功能用于打印學(xué)生信息 在DECLARE部分完成:
(2)建立學(xué)生信息記錄類(lèi)型stu_record_type,包括學(xué)號(hào),姓名,性別,籍貫,學(xué)習(xí)成績(jī)和活動(dòng)成績(jī)。均為可變長(zhǎng)字符類(lèi)型(3)編寫(xiě)本地子過(guò)程:學(xué)生信息打印過(guò)程PrintStuRecord,把(1)中定義的記錄類(lèi)型作為參數(shù)(4)定義學(xué)生信息記錄變量stu_record 在BEGIN…END部分完成:
(1)為stu_record變量的各個(gè)元素賦值如下: 學(xué)號(hào):‘2001001’ 姓名:’李新’
性別:‘m’
籍貫:‘黑龍江省哈爾濱市’ 學(xué)習(xí)成績(jī):‘Excellent’
0
(1)建立學(xué)生信息記錄類(lèi)型stu_record_type,包括學(xué)號(hào),姓名,性別,籍貫,學(xué)習(xí)成績(jī)和活動(dòng)成績(jī)。均為可變長(zhǎng)字符類(lèi)型
set serveroutput on declare type stu_record_type is record
(s_no varchar2(8), s_name varchar2(10), s_sex varchar2(2), s_address varchar2(20), s_studyscore varchar2(10), s_activescore varchar2(10));(2)編寫(xiě)本地子過(guò)程:學(xué)生信息打印過(guò)程PrintStuRecord,把中定義的記錄類(lèi)型作為參數(shù)
procedure PrintStuRecord as begin dbms_output.put_line('學(xué)號(hào):'|| stu_record.s_no);dbms_output.put_line('姓名 :'|| stu_record.s_name);dbms_output.put_line('性別:'|| stu_record.s_sex);dbms_output.put_line('籍貫:'|| stu_record.s_address);dbms_output.put_line('學(xué)習(xí)成績(jī):'|| stu_record.s_studyscore);dbms_output.put_line('活動(dòng)成績(jī):'|| stu_record.s_activescore);end PrintStuRecord;(3)定義學(xué)生信息記錄變量stu_record stu_record stu_record_type;在BEGIN…END部分完成:
(4)為stu_record變量的各個(gè)元素賦值如下: 學(xué)號(hào):‘2001001’ 姓名:’李新’
性別:‘m’
籍貫:‘黑龍江省哈爾濱市’
2.建立對(duì)bookinfo表的DML觸發(fā)器,一旦bookinfo表發(fā)生了任何變化,立即觸發(fā),對(duì)bookinfo表的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),結(jié)果存儲(chǔ)在數(shù)據(jù)統(tǒng)計(jì)表中
(1)如果沒(méi)有則建立bookinfo表,選擇建立在scott用戶(hù)下,表結(jié)構(gòu)為(bookno varchar2(36)Primary key, bookname varchar2(40)not null, authorname varchar2(10)not null, publishtime date, bookprice float)
create table bookinfo(bookno varchar2(36)Primary key,4
Selectcount(bookno),count(distinct authorname)from bookinfo;end;/
(4)在bookinfo表中插入、刪除和更新信息,再查看major_stats表中數(shù)據(jù)的變化 <1>插入
647
實(shí)驗(yàn)六
模式對(duì)象管理與安全管理
【實(shí)驗(yàn)?zāi)康摹?/p>
1.了解模式對(duì)象的類(lèi)型
2.掌握在OEM中操作模式對(duì)象的方法
3.掌握命令方式建立表、視圖、索引等常見(jiàn)對(duì)象的方法 4.熟悉Oracle中權(quán)限分類(lèi)和設(shè)置,理解系統(tǒng)提供用戶(hù)的角色和權(quán)限
5.熟練使用建立用戶(hù)、角色,為用戶(hù)授權(quán)、授予角色的命令
【實(shí)驗(yàn)內(nèi)容】
1.創(chuàng)建一個(gè)TESTUSET用戶(hù),密碼為test,默認(rèn)表空間為user表空間
2.創(chuàng)建用戶(hù)后為其授予登錄數(shù)據(jù)庫(kù)和創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象的權(quán)限 3.用TESTUSER用戶(hù)登錄數(shù)據(jù)庫(kù)
4.創(chuàng)建學(xué)生信息表(學(xué)號(hào),姓名,性別,入學(xué)成績(jī)),定義主鍵和輸入數(shù)據(jù)(至少5條數(shù)據(jù)),提交添加的數(shù)據(jù)。并完成下面的題目:
(1)再繼續(xù)添加2條數(shù)據(jù),設(shè)置一個(gè)保存點(diǎn)savepoint,再添加1條數(shù)據(jù),執(zhí)行回退到保存點(diǎn)的回退命令。查看此時(shí)表中數(shù)據(jù)(2)查詢(xún)?nèi)雽W(xué)成績(jī)大于480的學(xué)生信息(3)建立男生信息視圖
(4)在“成績(jī)”字段上建立B-樹(shù)索引
5.創(chuàng)建一個(gè)表簇,名為empl_dep,容納empl表和dep表,有公
第四篇:ORACLE數(shù)據(jù)庫(kù)學(xué)習(xí)心得
ORACLE數(shù)據(jù)庫(kù)結(jié)課論文
一個(gè)好的程序,必然聯(lián)系著一個(gè)龐大的數(shù)據(jù)庫(kù)網(wǎng)路...今年我們學(xué)習(xí)了 oracle數(shù)據(jù)庫(kù)這門(mén)課程,起初的我,對(duì)這個(gè)字眼是要多陌生有多陌生,后來(lái)上課的時(shí)候聽(tīng)一會(huì)老師講課,偶爾再跟上上機(jī)課,漸漸的學(xué)會(huì)了不少東西,但我感覺(jué),我學(xué)到的仍是一些皮毛而已,懷著疑惑和求知的心態(tài),我在網(wǎng)上搜索了關(guān)于 oracle數(shù)據(jù)庫(kù)的一些知識(shí)。
1.ORACLE的特點(diǎn): 可移植性 ORACLE采用C語(yǔ)言開(kāi)發(fā)而成,故產(chǎn)品與硬件和操作系統(tǒng)具有很強(qiáng)的獨(dú)立性。從大型機(jī)到微機(jī)上都可運(yùn)行ORACLE的產(chǎn)品??稍赨NIX、DOS、Windows等操作系統(tǒng)上運(yùn)行。可兼容性 由于采用了國(guó)際標(biāo)準(zhǔn)的數(shù)據(jù)查詢(xún)語(yǔ)言SQL,與IBM的SQL/DS、DB2等均兼容。并提供讀取其它數(shù)據(jù)庫(kù)文件的間接方法。
可聯(lián)結(jié)性 對(duì)于不同通信協(xié)議,不同機(jī)型及不同操作系統(tǒng)組成的網(wǎng)絡(luò)也可以運(yùn)行ORAˉCLE數(shù)據(jù)庫(kù)產(chǎn)品。
2.ORACLE的總體結(jié)構(gòu)
(1)ORACLE的文件結(jié)構(gòu) 一個(gè)ORACLE數(shù)據(jù)庫(kù)系統(tǒng)包括以下5類(lèi)文件:ORACLE RDBMS的代碼文件。
數(shù)據(jù)文件 一個(gè)數(shù)據(jù)庫(kù)可有一個(gè)或多個(gè)數(shù)據(jù)文件,每個(gè)數(shù)據(jù)文件可以存有一個(gè)或多個(gè)表、視圖、索引等信息。
日志文件 須有兩個(gè)或兩個(gè)以上,用來(lái)記錄所有數(shù)據(jù)庫(kù)的變化,用于數(shù)據(jù)庫(kù)的恢復(fù)??刂莆募?可以有備份,采用多個(gè)備份控制文件是為了防止控制文件的損壞。參數(shù)文件 含有數(shù)據(jù)庫(kù)例程起時(shí)所需的配置參數(shù)。
(2)ORACLE的內(nèi)存結(jié)構(gòu) 一個(gè)ORACLE例程擁有一個(gè)系統(tǒng)全程區(qū)(SGA)和一組程序全程區(qū)(PGA)。
SGA(System Global Area)包括數(shù)據(jù)庫(kù)緩沖區(qū)、日志緩沖區(qū)及共享區(qū)域。
PGA(Program Global Area)是每一個(gè)Server進(jìn)程有一個(gè)。一個(gè)Server進(jìn)程起動(dòng)時(shí),就為其分配一個(gè)PGA區(qū),以存放數(shù)據(jù)及控制信息。
(3)ORACLE的進(jìn)程結(jié)構(gòu)ORACLE包括三類(lèi)進(jìn)程: ①用戶(hù)進(jìn)程 用來(lái)執(zhí)行用戶(hù)應(yīng)用程序的。
②服務(wù)進(jìn)程 處理與之相連的一組用戶(hù)進(jìn)程的請(qǐng)求。
③后臺(tái)進(jìn)程 ORACLE為每一個(gè)數(shù)據(jù)庫(kù)例程創(chuàng)建一組后臺(tái)進(jìn)程,它為所有的用戶(hù)進(jìn)程服務(wù),其中包括: DBWR(Database Writer)進(jìn)程,負(fù)責(zé)把已修改的數(shù)據(jù)塊從數(shù)據(jù)庫(kù)緩沖區(qū)寫(xiě)到數(shù)據(jù)庫(kù)中。LGWR(Log Writer)進(jìn)程,負(fù)責(zé)把日志從SGA中的緩沖區(qū)中寫(xiě)到日志文件中。
SMON(System Moniter)進(jìn)程,該進(jìn)程有規(guī)律地掃描SAG進(jìn)程信息,注銷(xiāo)失敗的數(shù)據(jù)庫(kù)例程,回收不再使用的內(nèi)存空間。PMON(Process Moniter)進(jìn)程,當(dāng)一用戶(hù)進(jìn)程異常結(jié)束時(shí),該進(jìn)程負(fù)責(zé)恢復(fù)未完成的事務(wù),注銷(xiāo)失敗的用戶(hù)進(jìn)程,釋放用戶(hù)進(jìn)程占用的資源。ARCH(ARCHIVER)進(jìn)程。每當(dāng)聯(lián)機(jī)日志文件寫(xiě)滿(mǎn)時(shí),該進(jìn)程將其拷貝到歸檔存儲(chǔ)設(shè)備上。另外還包括分布式DB中事務(wù)恢復(fù)進(jìn)程RECO和對(duì)服務(wù)進(jìn)程與用戶(hù)進(jìn)程進(jìn)行匹配的Dnnn進(jìn)程等。
3.ORACLE的邏輯結(jié)構(gòu)
構(gòu)成ORACLE的數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)包括:(1)表空間
(2)5種類(lèi)型的段(segment)
①數(shù)據(jù)段;②索引段;③回滾(rollbock)段;④臨時(shí)段;⑤自舉(bootstrap)段。
段的分配單位叫范圍(Extent)
表空間(Tablespace)一個(gè)數(shù)據(jù)庫(kù)劃分成的若干邏輯部分稱(chēng)為表空間。一個(gè)數(shù)據(jù)庫(kù)可以有一個(gè)或多個(gè)表空間,初始的表空間命名為SYSTEM,每一個(gè)邏輯表空間對(duì)應(yīng)于一個(gè)或多個(gè)物理文件。DBA使用表空間做以下工作: 控制數(shù)據(jù)庫(kù)對(duì)象,如表、索引和臨時(shí)段的空間分配。為數(shù)據(jù)庫(kù)用戶(hù)設(shè)置空間配額。
利用個(gè)別表空間的在線(xiàn)或離線(xiàn),控制數(shù)據(jù)的可用性。后備或恢復(fù)數(shù)據(jù)。
通過(guò)分配空間,以改進(jìn)性能。
在每個(gè)數(shù)據(jù)庫(kù)中都存在SYSTEM表空間,它在建立數(shù)據(jù)庫(kù)時(shí)自動(dòng)建立。在該表空間中,包含數(shù)據(jù)庫(kù)的數(shù)據(jù)字典,其中存儲(chǔ)全部數(shù)據(jù)庫(kù)對(duì)象的名字和位置。SYSTEM表空間總是在線(xiàn)的,像其它表空間一樣,可以通過(guò)增加新的數(shù)據(jù)庫(kù)文件來(lái)擴(kuò)大。一個(gè)表空間可包含許多表和索引。但一個(gè)表和索引不能跨越表空間,可跨越組成表空間的文件。在DB的打開(kāi)的情況下,DBA利用ALTER TABLESPACE語(yǔ)句,可以實(shí)施表空間的在線(xiàn)或離線(xiàn)。SYSTEM表空間必須在線(xiàn)。表空間離線(xiàn)有下列原因: 一般為了使部分?jǐn)?shù)據(jù)庫(kù)不能使用,而允許正常存取數(shù)據(jù)庫(kù)其余部分。執(zhí)行表空間離線(xiàn)備份。
一個(gè)離線(xiàn)的表空間,不能被應(yīng)用用戶(hù)讀或編輯。
可以增加數(shù)據(jù)文件擴(kuò)大已有的表空間,也可增加新的表空間使數(shù)據(jù)庫(kù)容量增大,或分配空間給某個(gè)應(yīng)用。使用ALFER TABLESPACE ADD FILE語(yǔ)句將另一個(gè)數(shù)據(jù)文件加入到已存在表空間中。使用CREATE TABLESPACE語(yǔ)句可建立一個(gè)新的表空間。段(segment)表空間中的全部數(shù)據(jù)存儲(chǔ)在以段劃分的數(shù)據(jù)庫(kù)空間中。一個(gè)段是分配給數(shù)據(jù)庫(kù)用于數(shù)據(jù)存儲(chǔ)的范圍的集合。數(shù)據(jù)可以是表、索引或RDBMS所需要的臨時(shí)數(shù)據(jù)。段是表空間的下一個(gè)邏輯存儲(chǔ)的級(jí)別。一個(gè)段不能跨越一個(gè)表空間,但可跨越表空間內(nèi)的文件。一個(gè)數(shù)據(jù)庫(kù)最多需要五種段類(lèi)型: 數(shù)據(jù)段 一個(gè)包含一個(gè)表(或聚集)的全部數(shù)據(jù),一個(gè)表(或聚集)總有一個(gè)單個(gè)數(shù)據(jù)段。
索引段 一個(gè)索引段包含對(duì)一個(gè)表(或聚集)建立的一個(gè)索引的全部索引數(shù)據(jù)。一個(gè)表可以有一個(gè)、多個(gè)或者沒(méi)有索引段,取決于它所擁有的索引個(gè)數(shù)。一個(gè)聚集必須至少有一個(gè)索引段,即在聚集碼上建立聚集索引。
回滾段 每個(gè)DB有一個(gè)或多個(gè)回滾段。一個(gè)回滾段是DB的一部分,它記錄在某一情況下被撤消的動(dòng)作。回滾段用于事務(wù)控制和恢復(fù)。
臨時(shí)段 在處理查詢(xún)時(shí),ORACLE需要臨時(shí)工作空間,用于存儲(chǔ)語(yǔ)句處理的中間結(jié)果,這個(gè)區(qū)稱(chēng)為臨時(shí)段。
自舉段 自舉段在SYSTEM表空間中,在數(shù)據(jù)庫(kù)建立時(shí)建立。它包括數(shù)據(jù)字典定義,在數(shù)據(jù)庫(kù)打開(kāi)時(shí)裝入。
4.用戶(hù)數(shù)據(jù)庫(kù)對(duì)象
由用戶(hù)建立的對(duì)象駐留在表空間中,含有真正的數(shù)據(jù)。數(shù)據(jù)庫(kù)對(duì)象有表、視圖、聚集、索引、偽列和序號(hào)生成器。
(1)聚集(Cluster)聚集是存儲(chǔ)數(shù)據(jù)的一種可選擇的方法。聚集包括存儲(chǔ)在一起的一組表,它們共享公共列并經(jīng)常一起使用。由于內(nèi)容相關(guān)并且物理地存儲(chǔ)在一起,存取時(shí)間得到改進(jìn),存儲(chǔ)空間可以減少。聚集是一種優(yōu)化措施。
聚集對(duì)性能的改進(jìn),依賴(lài)于數(shù)據(jù)的分布和SQL操作的內(nèi)容。特別是使用聚集對(duì)連接非常有利。可以明顯地提高連接的速度。建立聚集命令的基本格式: SQL>CREATE CLUSTER〈聚集名〉(列定義[,…]);利用聚集建立表命令基本格式: SQL>CREATE TABLE〈新表名〉(列定義[,…]CLUSTER〈聚集名〉(聚集列);在聚集碼上必須建立一個(gè)聚集索引,對(duì)于每一數(shù)據(jù)塊上每個(gè)聚集碼值有一索引項(xiàng)。這個(gè)索引必須在DML語(yǔ)句對(duì)聚集表操作前建立。建立索引的語(yǔ)句是:CREATE INDEX索引名ON CLUSTER聚集名;(2)序號(hào)生成器 序號(hào)(SEQUENCE)生成器為表中的單列或多列生成順序號(hào)。利用序號(hào)可自動(dòng)地生成唯一主碼。使用SQL語(yǔ)句定義序號(hào),給出一些信息(如序號(hào)名、是升序或降序、每個(gè)序號(hào)間的間隔和其它信息)。所有序號(hào)存儲(chǔ)在數(shù)據(jù)字典表中。
所有序號(hào)定義存儲(chǔ)在數(shù)據(jù)字典的SEQUENCE表中。用戶(hù)可以通過(guò)字典視圖
USER-SE-QUENCES、ALL-SEQUENCES
和DBA-SEQUENCES查詢(xún)和存取。建立序號(hào)生成器的語(yǔ)句是: CREATE SEQUENCE序號(hào)生成器名 其它選項(xiàng)。
一旦序號(hào)生成器S被定義??捎肧.Currval來(lái)引用S序號(hào)生成器的當(dāng)前值。用S.nextval產(chǎn)生下一個(gè)新的序號(hào)并加以引用。
(3)偽列 偽列的行為像表的一列,但不真正存在于表中,在查詢(xún)時(shí)可引用偽列,但偽列不能插入、刪除或修改。
5.數(shù)據(jù)字典
數(shù)據(jù)字典ORACLE RDBMS最重要的部分之一。數(shù)據(jù)字典含有一組系統(tǒng)定義的表,只能讀,是關(guān)于數(shù)據(jù)庫(kù)的引用指南。它可提供以下信息:ORACLE用戶(hù)的用戶(hù)名;每個(gè)用戶(hù)被授予的權(quán)限和角色;實(shí)體的名字和定義;完整性約束 為數(shù)據(jù)庫(kù)實(shí)體分配的空間;通用的數(shù)據(jù)庫(kù)結(jié)構(gòu);審計(jì)信息;觸發(fā)子程序等的存儲(chǔ)。數(shù)據(jù)字典是以表和視圖構(gòu)成的,像其它數(shù)據(jù)庫(kù)數(shù)據(jù)一樣,可用SQL語(yǔ)言查詢(xún)數(shù)據(jù)字典。
數(shù)據(jù)字典在DB建立時(shí)建立。每當(dāng)DB進(jìn)入操作,數(shù)據(jù)字典就由ORACLE RDBMS負(fù)責(zé)修改。數(shù)據(jù)庫(kù)建立時(shí)有兩個(gè)默認(rèn)DBA用戶(hù):SYS、SYSTEM。SYS持有基本表中的數(shù)據(jù)。數(shù)據(jù)字典包含一組基表和相關(guān)的視圖,可分為以下幾類(lèi): 類(lèi)
描 述
DBA-××× 只有DBA可存取的視圖,給出數(shù)據(jù)庫(kù)中定義的任何實(shí)體的信息
USER-××× 對(duì)任何用戶(hù)可用的視圖,給出他們自己的實(shí)體的信息
ALL-×××
對(duì)任何用戶(hù)可用的視圖,給出用戶(hù)可存取的所有實(shí)體的信息
其中×××代表表名或視圖名
下面列出的是一些常用的表或視圖的名稱(chēng)。(1)DTAB 描述了組或數(shù)據(jù)字典的所有表。(2)TAB 用戶(hù)建的所有基本表、視圖和同義詞。(3)COL 用戶(hù)創(chuàng)建基本表的所有列的信息。
(4)SYNONYMS 用戶(hù)可存取的同義名詞、專(zhuān)用名和公用名。(5)CATALOG 用戶(hù)可存取的表、視圖、同義詞、序列。(6)CONSTRAINTS 用戶(hù)可存取的約束。(7)INDEXES 用戶(hù)可存取的表和聚集的序列。(8)OBJECTS 用戶(hù)可存取的對(duì)象。(9)TABLES 用戶(hù)可存取的表。(10)USERS 查看當(dāng)前全部用戶(hù)。(11)VIEWS 查看用戶(hù)可存取的視圖。
(12)SYSTABAUTH 用戶(hù)對(duì)數(shù)據(jù)對(duì)象的使用權(quán)限??梢杂肧QL>SELECT*FROM〈字典表名或視圖名〉WHERE〈條件〉來(lái)讀取有關(guān)信息。
可以用SQL>DESCRIBE〈表名〉來(lái)查看表的結(jié)構(gòu)定義。但是數(shù)據(jù)庫(kù)字典的結(jié)構(gòu)不可改。用DESCRIBE命令還可以查看視圖及過(guò)程的定義。
6.ORACLE的SQL、PL/SQL與SQL*PLUS 作為ORACLE數(shù)據(jù)庫(kù)核心的SQL語(yǔ)言是ANSI和ISO的標(biāo)準(zhǔn)SQL的擴(kuò)充。用來(lái)存儲(chǔ)、檢索和維護(hù)數(shù)據(jù)庫(kù)中的信息,并控制對(duì)數(shù)據(jù)庫(kù)的存取事務(wù)。由于RDBMS執(zhí)行SQL語(yǔ)句時(shí),是一次只執(zhí)行一條語(yǔ)句,它是非過(guò)程化的。這就使得單條的SQL語(yǔ)句使用方便,功能強(qiáng)大。用戶(hù)只需說(shuō)明操作目的,不必關(guān)心具體操作的實(shí)現(xiàn)方法。
但在實(shí)際數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)中,往往要依據(jù)前一步對(duì)數(shù)據(jù)庫(kù)操作的結(jié)果或上一個(gè)事務(wù)提交的情況來(lái)確定下一步的操作。故ORACLE推出了一種PL/SQL工具,它擴(kuò)充了SQL語(yǔ)句,使之具有可進(jìn)行過(guò)程化編程的能力,如循環(huán)、分支功能。PL/SQL可支持變量和常量的使用。例如在SELECT查詢(xún)語(yǔ)句的where子句中可以使用變量來(lái)書(shū)寫(xiě)條件表達(dá)式。SQL*PLUS是ORACLE用來(lái)存儲(chǔ)、查詢(xún)、操縱、控制和報(bào)告數(shù)據(jù)庫(kù)中信息的一個(gè)交互式工具。它是一種集編輯、調(diào)試、運(yùn)行于一體的開(kāi)發(fā)環(huán)境。在SQL*PLUS的這種運(yùn)行環(huán)境下,既可以使用SQL命令、PL/SQL語(yǔ)句、及SQL*PLUS自己提供的命令,又可以運(yùn)行由上述三類(lèi)命令(或語(yǔ)句)編輯而成的命令文件。SQL*PLUS提供的附加命令主要用來(lái)編輯、運(yùn)行上述三類(lèi)命令及命令文件和對(duì)查詢(xún)結(jié)果進(jìn)行格式化輸出等功能。
7.數(shù)據(jù)庫(kù)系統(tǒng)的管理
ORACLE作為一個(gè)大型的數(shù)據(jù)系統(tǒng),通常包含很多用戶(hù)的數(shù)據(jù)。在應(yīng)用開(kāi)發(fā)過(guò)程中,有許許多多的各類(lèi)人員進(jìn)行開(kāi)發(fā)和應(yīng)用。所以必須要求有人對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行臨時(shí)管理,并進(jìn)行數(shù)據(jù)的備份等工作。這種人被稱(chēng)為數(shù)據(jù)庫(kù)管理員(Data Base Administrator)。他們必須理解數(shù)據(jù)庫(kù)系統(tǒng)管理,清楚數(shù)據(jù)庫(kù)包含的數(shù)據(jù)內(nèi)容、運(yùn)行狀況等。
一般說(shuō)來(lái),DBA不是指具體的人,而是指對(duì)數(shù)據(jù)庫(kù)可以行使DBA特權(quán)的用戶(hù)。DBA具有如下責(zé)任:(1)ORACLE服務(wù)器和客戶(hù)工作站軟件的安裝和升級(jí);(2)創(chuàng)建基本的數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)(表空間);(3)創(chuàng)建基本的數(shù)據(jù)庫(kù)客體(表、視圖、索引);(4)修改數(shù)據(jù)庫(kù)結(jié)構(gòu);(5)給用戶(hù)授權(quán),維護(hù)系統(tǒng)安全;(6)控制和管理用戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn);(7)監(jiān)視和優(yōu)化數(shù)據(jù)庫(kù)的性能;(8)計(jì)算數(shù)據(jù)庫(kù)信息的后備和恢復(fù);(9)后備和恢復(fù)數(shù)據(jù)庫(kù);(10)構(gòu)造ORACLE服務(wù)器,如創(chuàng)建數(shù)據(jù)庫(kù)鏈、客體同義詞等。而應(yīng)用開(kāi)發(fā)人員須完成:(1)應(yīng)用程序設(shè)計(jì);(2)應(yīng)用的數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)和修改;(3)為DBA提供必要的信息;(4)完成應(yīng)用程序的開(kāi)發(fā)。
看了許多關(guān)于ORACLE的知識(shí)論壇,總算是對(duì)ORACLE有個(gè)整體的認(rèn)識(shí),不僅僅是拘泥于課堂上學(xué)習(xí)的知識(shí)而已,雖然自己對(duì)ORACLE學(xué)習(xí)并不是多么的透徹,但是總歸多接觸點(diǎn)新的東西總是好的。
這一個(gè)學(xué)期,也是臨近畢業(yè)的時(shí)候了,很感謝賈老師的嚴(yán)格要求,讓我在學(xué)習(xí)上有了很大的進(jìn)步,同時(shí)也改掉了一些惰性,能積極的投入到學(xué)習(xí)中去了,不懂就大膽的問(wèn)同學(xué),請(qǐng)學(xué)習(xí)好的同學(xué)幫助講解,最后,真心的祝福賈老師工作順利,身體健康!
第五篇:Oracle數(shù)據(jù)庫(kù)總結(jié)范文
創(chuàng)建表及命名規(guī)則?
表名和列名:
必須以字母開(kāi)頭 必須在1–30個(gè)字符之間
必須只能包含A–Z, a–z, 0–9, _, $, 和# 必須不能和用戶(hù)定義的其他對(duì)象重名 必須不能是Oracle 的保留字 Oracle默認(rèn)存儲(chǔ)是都存為大寫(xiě)
增刪改查語(yǔ)法?
增加: 例如:使用INSERT語(yǔ)句往customers表中插入數(shù)據(jù),指定相關(guān)列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
如果為表所有列都指定值,那么可以忽略列清單
INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
可以使用NULL為某些列指定空值
INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL);
查詢(xún):select * fromcustomers;或者select字段 fromcustomerswhere條件 刪除:deletefromcustomerswhere條件
更改:update customersset name = 'xiaoming',age = ‘16’(更改多個(gè)字段時(shí)候用逗號(hào)隔開(kāi))where 條件
對(duì)查詢(xún)結(jié)果進(jìn)行排序?
語(yǔ)句:select * fromcustomersorderby字段 desc;
(asc(升序),desc(降序)如果不寫(xiě),默認(rèn)升序)
NULL值了解么?
NULL值表示未知的值。它是一個(gè)特殊的值,但并不是空字符串,NULL值表示該列是未知的。當(dāng)某些查詢(xún)語(yǔ)句在輸出結(jié)果列上看不到值的時(shí)候,可能就是NULL值
NVL()和NVL2():
NULL值被查詢(xún)出來(lái)的時(shí)候沒(méi)有顯示信息,如何告知用戶(hù)這是空字符串還是NULL,這可以通過(guò)NVL()函數(shù)來(lái)進(jìn)行處理
NVL(x,value)是有value顯示本身,null顯示為替換的value NVL2(x,value1,value2)是如果x不為NULL值,返回value1,否則返回value2 例程:
select name,nvl2(email,'已知','未知')from student;【代碼含義:代表如果email字段中有值,則顯示已知,null則顯示未知,如果想顯示本來(lái)的查詢(xún)結(jié)果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代碼含義:代表將STUDENT表中NAME 字段中如果含有小字,那么就將小字替換為大字(操作的不是顯示結(jié)果,而是將表中數(shù)據(jù)進(jìn)行更改)】
Oracle中的簡(jiǎn)單函數(shù)?
字符串函數(shù)
? concat:將x和y拼接起來(lái),并返回新字符串
例程:
select concat(first_name,'-'||last_name)姓名 from customers;? Instr字符查找,從1開(kāi)始。
select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表從第5個(gè)字符開(kāi)始,第二個(gè)b所在的位置】
? Ltrim : LTRIM(x,[trim_string])從x字符串左側(cè)去除所有的trim_string字符串,如果沒(méi)有指定trim_string字符串,則默認(rèn)為去除左側(cè)空白字符
? Rtrim RTRIM(x,[trim_string])從x字符串右側(cè)去除所有的trim_string字符串,如果沒(méi)有指定trim_string字符串,則默認(rèn)為去除右側(cè)空白字符 ? Trim TRIM(trim_string FROM x)從x字符串兩側(cè)去除trim_string字符串
? Replace REPLACE(x, search_string, replace_string)從字符串x中搜索search_string字符串,并使用replace_string字符串替換。用select執(zhí)行并不會(huì)修改數(shù)據(jù)庫(kù)中原始值,但是用update執(zhí)行可以修改。
? Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,這些字符從字符串的第start個(gè)位置開(kāi)始,長(zhǎng)度為length個(gè)字符;如果start是負(fù)數(shù),則從x字符串的末尾開(kāi)始算起;如果length省略,則將返回一直到字符串末尾的所有字符
例程:
select substr('abcd月fg',4,2)from dual;(結(jié)果:d月)select substr('abcdefg',-2)from dual;(結(jié)果:fq)
日期函數(shù)
? Sysdate 例程:
Selectsysdatefromdual;
Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual;
? Add_months(d1,n1)? last_day():
轉(zhuǎn)換函數(shù)
? To_char TO_CHAR(x,[ format])將x轉(zhuǎn)化為字符串。format為轉(zhuǎn)換的格式,可以為數(shù)字格式或日期格式
select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查詢(xún)時(shí)候使用,使返回的值成為指定格式】
? to_date TO_DATE(x,[format])將x字符串轉(zhuǎn)換為日期
insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查詢(xún)的值中最后一個(gè)日期數(shù)據(jù)。
聚合函數(shù)
? Avg:平均數(shù) ? Sum:求和 ? Max:最大值 ? Min:最小值 ? Count:返回統(tǒng)計(jì)的行數(shù) ? Round:四舍五入
例程:
select round(avg(bid),1)from bug;分組了解么?
有時(shí)需要對(duì)表中的行進(jìn)行分組,然后統(tǒng)計(jì)每組的信息,可以使用GROUP BY進(jìn)行分組,然后再對(duì)每組進(jìn)行統(tǒng)計(jì)。
(1)可以使用GROUP BY對(duì)多個(gè)列進(jìn)行分組
例:
SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id;
(2)可以對(duì)分組后的行使用聚集函數(shù),聚集函數(shù)會(huì)統(tǒng)計(jì)每組中的值,對(duì)于每組分別統(tǒng)計(jì)后返回一個(gè)值 例:
SELECT
product_type_id,BY
COUNT(ROWID)FROM
BY
productsGROUP product_type_id;注意:
product_type_idORDER a)如果查詢(xún)中使用了聚集函數(shù),被查詢(xún)的列未使用聚集函數(shù)處理,那么這些列必須出現(xiàn)在GROUP BY子句后,否則,會(huì)提示ORA-00937錯(cuò)誤
b)不能使用聚集函數(shù)作為WHERE子句的篩選條件,否則,會(huì)提示ORA-00934錯(cuò)誤
c)可以使用HAVING子句過(guò)濾分組后的行
SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用時(shí)可以不使用HAVING,但是使用HAVING時(shí)必須有GROUP BY才有意義)
(3)同時(shí)使用WHERE, GROUP BY和HAVING
a)首先,執(zhí)行WHERE篩選掉不符合條件的行 b)然后,將符合條件的行使用GROUP BY進(jìn)行分組 c)最后,使用HAVING對(duì)分組統(tǒng)計(jì)的結(jié)果進(jìn)行再次篩選 例:
SELECT product_type_id, AVG(price)FROM products
WHERE price < 15
GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id;
表的約束條件?
目的:
確保表中數(shù)據(jù)的完整性。
常用的約束類(lèi)型: 主鍵約束(PRIMARY KEY):要求主鍵列數(shù)據(jù)唯一,并且不允許為空 非空約束(NOT NULL):指定的列的值不允許為空
唯一鍵約束(UNIQUE):要求該列唯一,允許為空,但只能出現(xiàn)一個(gè)空
值
檢查約束(CHECK):指定表中一列或多列可以接受的數(shù)據(jù)值格式 默認(rèn)約束(DEFAULT):指定某列的默認(rèn)值
外鍵約束(FOREIGN KEY):用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間連接的一
列或多列。通過(guò)將表中的主鍵列添加到另一個(gè)表中。可以創(chuàng)建兩個(gè)表之間的連接。這個(gè)主鍵的列就稱(chēng)為第二個(gè)表的外鍵。外鍵約束就可以確保添加到外鍵表中的任何行都在主表中都存在相應(yīng)的行
多表查詢(xún)?
不同的數(shù)據(jù)存儲(chǔ)在不同的表中,通常要查詢(xún)多張表才能找到需要的數(shù)據(jù)
例程: SELECT products.name, product_types.name FROM products, product_types WHERE
products.product_type_id
= product_types.product_type_id AND products.product_id = 3;
products表和product_types表相關(guān)字段會(huì)用在SELECT語(yǔ)句及WHERE子句上,可以給表起別名,提高代碼可讀性、降低書(shū)寫(xiě)難度 例程:
SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意:
如果查詢(xún)兩張表,并且沒(méi)有定義連接條件,那么查詢(xún)的結(jié)果集是兩表相乘的結(jié)果,這樣的情況稱(chēng)之為笛卡爾乘積。總結(jié):多表查詢(xún)WHERE時(shí),連接次數(shù)=查詢(xún)時(shí)連接表的數(shù)量-1
常見(jiàn)的三種連接類(lèi)型:
內(nèi)連接:
內(nèi)連接返回的行只有滿(mǎn)足連接條件才會(huì)返回。如果連接條件的列中有NULL值,那么該行則不會(huì)返回 外連接:
外連接返回的行滿(mǎn)足連接條件,也包括在連接條件的列包含空值的行
自連接:
連接的表為同一張表
子查詢(xún)?
子查詢(xún)是嵌入到另一個(gè)SELECT語(yǔ)句中的一個(gè)SELECT語(yǔ)句。通過(guò)使用子查詢(xún),可以使用簡(jiǎn)單的語(yǔ)句組成強(qiáng)大的語(yǔ)句。當(dāng)需要從表中選擇行,而選擇條件卻取決于該表自身中的數(shù)據(jù)時(shí),子查詢(xún)非常有用。
單行子查詢(xún):(1)可以將另外一個(gè)查詢(xún)作為WHERE子句的子查詢(xún)
例:查詢(xún)尾名是‘Brown’的首名和尾名
SELECT first_name, last_name FROM customers
WHERE customer_id =
(SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在單行子查詢(xún)還可以使用其他比較運(yùn)算符,如<>、<、>、<=和>= 例:查詢(xún)價(jià)格大于平均價(jià)格的商品編號(hào)、名稱(chēng)及價(jià)格
WHERE子句中使用>,以及子查詢(xún)中使用AVG()聚集函數(shù)
SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查詢(xún)
HAVING是在分組統(tǒng)計(jì)后用于過(guò)濾行,同樣在HAVING子句后面可以跟子查詢(xún)。單行子查詢(xún)將返回結(jié)果用于HAVING子句過(guò)濾分組統(tǒng)計(jì)的行
例如:查詢(xún)平均價(jià)格小于最大平均值的商品編號(hào)及平均值
SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id;
分頁(yè)查詢(xún)?
可以通過(guò)ROWNUM來(lái)實(shí)現(xiàn)。
序列?
序列是一個(gè)數(shù)據(jù)庫(kù)對(duì)象,用于生成一系列的整數(shù)。
索引?
索引是與表關(guān)聯(lián)的可選結(jié)構(gòu)??梢詣?chuàng)建索引以加快對(duì)表執(zhí)行SQL語(yǔ)句的速度。就像書(shū)的索引可以幫助我們更快速的查找信息一樣,Oracle中的索引也提供了一種更快地訪(fǎng)問(wèn)表數(shù)據(jù)的途徑。
視圖?
視圖是基于一張表或多張表或另外一個(gè)視圖的邏輯表。視圖不同于表,視圖本身不包含任何數(shù)據(jù)。表是實(shí)際獨(dú)立存在的實(shí)體,是用于存儲(chǔ)數(shù)據(jù)的基本結(jié)構(gòu)。而視圖只是一種定義,對(duì)應(yīng)一個(gè)查詢(xún)語(yǔ)句。視圖的數(shù)據(jù)都來(lái)自于某些表,這些表被稱(chēng)為基表。數(shù)據(jù)庫(kù)中只在數(shù)據(jù)字典中存儲(chǔ)對(duì)視圖的定義。