

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Oracle的性能優(yōu)化,本章學(xué)習(xí)目標(biāo) 本章將介紹優(yōu)化和調(diào)整Oracle數(shù)據(jù)庫系統(tǒng)的一些相關(guān)命令和方法。,第九章 Oracle的性能優(yōu)化,本章內(nèi)容安排,9.1 數(shù)據(jù)庫性能優(yōu)化概述,9.2 SQL語句的優(yōu)化,9.3 Oracle運行環(huán)境的優(yōu)化,9.4 并發(fā)事件處理,9.5 數(shù)據(jù)完整性,9.7 常見問題處理,,9.1 數(shù)據(jù)庫性能優(yōu)化概述,9.1.1 數(shù)據(jù)庫性能優(yōu)化的內(nèi)容,9.1.2 不同類型系統(tǒng)的優(yōu)化,(
2、1)調(diào)整數(shù)據(jù)結(jié)構(gòu)的設(shè)計。(2)調(diào)整應(yīng)用程序結(jié)構(gòu)設(shè)計。(3)調(diào)整數(shù)據(jù)庫SQL語句。(4)調(diào)整服務(wù)器內(nèi)存分配。(5)調(diào)整硬盤I/O,這一步是在信息系統(tǒng)開發(fā)之前完成的。(6)調(diào)整操作系統(tǒng)參數(shù)。,9.1.1 數(shù)據(jù)庫性能優(yōu)化的內(nèi)容,1.在線事務(wù)處理信息系統(tǒng)(OLTP) 這種類型的信息系統(tǒng)一般需要有大量的Insert、Update操作。OLTP系統(tǒng)需要保證數(shù)據(jù)庫的并發(fā)性、可靠性和最終用戶的速度,這類系統(tǒng)使用的Oracle數(shù)據(jù)
3、庫需要主要考慮下述因素或參數(shù):(1)數(shù)據(jù)庫回滾段是否足夠?(2)是否需要建立Oracle數(shù)據(jù)庫索引、聚集、散列?(3)系統(tǒng)全局區(qū)(SGA)大小是否足夠?(4)SQL語句是否高效?,9.1.2 不同類型系統(tǒng)的優(yōu)化,2.?dāng)?shù)據(jù)倉庫系統(tǒng)(Data Warehousing)這種信息系統(tǒng)的主要任務(wù)是從Oracle的海量數(shù)據(jù)中進行查詢,得到數(shù)據(jù)之間的某些規(guī)律。數(shù)據(jù)庫管理員需要為這種類型的Oracle數(shù)據(jù)庫著重考慮下述因素或參數(shù):(1)是
4、否采用B*-索引或者bitmap索引?(2)是否采用并行SQL查詢以提高查詢效率?(3)是否采用PL/SQL函數(shù)編寫存儲過程?(4)是否有必要建立并行數(shù)據(jù)庫,來提高數(shù)據(jù)庫的查詢效率。,9.2.2 SQL語句優(yōu)化的具體方法,9.2.1 SQL語句的優(yōu)化規(guī)則,9.2 SQL語句的優(yōu)化,,,9.2.1 SQL語句的優(yōu)化規(guī)則,,(1)去掉不必要的大表、全表掃描。不必要的大表、全表掃描會造成不必要的輸入輸出,而且還會拖垮整個數(shù)據(jù)庫;
5、(2)檢查優(yōu)化索引的使用 這對于提高查詢速度來說非常重要;(3)檢查子查詢,考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫;(4)調(diào)整PCTFREE和PCTUSED等存儲參數(shù)優(yōu)化插入、更新或者刪除等操作;(5)考慮數(shù)據(jù)庫的優(yōu)化器;(6)考慮數(shù)據(jù)表的全表掃描和在多個CPU的情況下考慮并行查詢。,,1.索引的使用,2.SQL語句排序優(yōu)化,3. 選擇聯(lián)合查詢的聯(lián)合次序,9.2.2 SQL語句優(yōu)化的具體方法,,,4.SQL子查
6、詢的調(diào)整,,,1、索引的使用(1)盡量使用索引 是全表掃描還是索引范圍掃描主要考慮SQL的查詢速度問題。試比較下面兩條SQL語句:①語句A:SELECT dname,deptno FROM dept WHERE deptno NOT IN(SELECT deptno FROM emp);②語句B:SELECT dname,deptno FROM dept WHERE NOT EXISTS(SELECT deptno
7、FROM emp WHERE dept.deptno = emp.deptno);,,,(2)索引不起作用的情況①存在數(shù)據(jù)類型隱形轉(zhuǎn)換②列上有數(shù)學(xué)運算③使用不等于()運算④使用substr字符串函數(shù)⑤‘%’通配符在第一個字符⑥字符串連接(||),,,(3)函數(shù)的索引例如,日期類型是經(jīng)常用到的,而且在SQL語句中會使用to_char函數(shù)以查詢具體的的范圍日期。如:select * from staff_member whe
8、re TO_CHAR(birth_day,’YYYY’)=’2003’;可以建立基于函數(shù)的索引如:CREATE INDEX Ind_emp_birth ON staff_member (to_char((birth_day,’YYYY’));,,2.SQL語句排序優(yōu)化排序發(fā)生的情況如下:SQL中包含group by 子句SQL 中包含order by 子句SQL 中包含 distinct 子句SQL 中包含 minus 或
9、 union操作,,,,,,3.選擇聯(lián)合查詢的聯(lián)合次序 聯(lián)合查詢中如涉及到多個表的字段關(guān)聯(lián)及查詢,其SQL查詢語句聯(lián)合次序的不同寫法,會導(dǎo)致語句對各表具體操作的步驟有不同的次序,所以雖然執(zhí)行結(jié)果相同,但執(zhí)行效率卻不同。,4.SQL子查詢的調(diào)整(1)關(guān)聯(lián)子查詢和非關(guān)聯(lián)子查詢 非關(guān)聯(lián)查詢的開銷——非關(guān)聯(lián)查詢時子查詢只會執(zhí)行一次,而且結(jié)果是排序好的,并保存在一個Oracle的臨時段中,其中的每一個記錄在返回時都
10、會被父查詢所引用。在子查詢返回大量的記錄的情況下,將這些結(jié)果集排序,以及將臨時數(shù)據(jù)段進行排序會增加大量的系統(tǒng)開銷。 關(guān)聯(lián)查詢的開銷——對返回到父查詢的記錄來說,子查詢會每行執(zhí)行一次。因此,必須保證任何可能的時候子查詢用到索引。,(2)在子查詢中慎重使用IN或者NOT IN語句 在子查詢中慎重使用IN或者NOT IN語句,使用where (NOT)exists的效果要好的多。①帶IN的關(guān)聯(lián)子查詢是多余的,因
11、為IN子句和子查詢中相關(guān)的操作的功能是一樣的。②為非關(guān)聯(lián)子查詢指定EXISTS子句是不適當(dāng)?shù)模驗檫@樣會產(chǎn)生笛卡爾乘積。③盡量不要使用NOT IN子句。,(3)慎重使用視圖的聯(lián)合查詢 慎重使用視圖的聯(lián)合查詢,尤其是比較復(fù)雜的視圖之間的聯(lián)合查詢。一般對視圖的查詢最好都分解為對數(shù)據(jù)表的直接查詢效果要好一些。 可以在參數(shù)文件中設(shè)置SHARED_POOL_RESERVED_SIZE參數(shù),這個參數(shù)在SGA共享池中保留一個連
12、續(xù)的內(nèi)存空間,連續(xù)的內(nèi)存空間有益于存放大的SQL程序包。,9.3.2 物理I/O的調(diào)整,9.3.3 CPU的優(yōu)化調(diào)整,9.3.4 網(wǎng)絡(luò)配置的優(yōu)化,9.3.1 內(nèi)存結(jié)構(gòu)的調(diào)整,9.3 Oracle運行環(huán)境的優(yōu)化,9.3.5 Oracle碎片整理,9.3.6 Oracle系統(tǒng)參數(shù)的調(diào)整,內(nèi)存參數(shù)的調(diào)整主要是指Oracle數(shù)據(jù)庫的系統(tǒng)全局區(qū)(SGA)的調(diào)整。SGA主要由三部分構(gòu)成:共享池、數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)。1.共享池
13、 共享池由兩部分構(gòu)成:共享SQL區(qū)和數(shù)據(jù)字典緩沖區(qū)。共享SQL區(qū)是存放用戶SQL命令的區(qū)域,數(shù)據(jù)字典緩沖區(qū)存放數(shù)據(jù)庫運行的動態(tài)信息。,9.3.1 內(nèi)存結(jié)構(gòu)的調(diào)整,(1)數(shù)據(jù)庫管理員通過執(zhí)行下述語句,來查看共享SQL區(qū)的使用率。select (sum(pins-reloads))/sum(pins) "Lib Cache" from v$librarycache; 共享SQL區(qū)的使用率應(yīng)該
14、在90%以上,否則需要增加共享池的大小。(2)數(shù)據(jù)庫管理員可以執(zhí)行下述語句,查看數(shù)據(jù)字典緩沖區(qū)的使用率。select (sum(-getmisses-usage-fixed))/sum(gets) "Row Cache" from v$rowcache; 數(shù)據(jù)字典緩沖區(qū)的使用率也應(yīng)該在90%以上,否則需要增加共享池的大小。,2.?dāng)?shù)據(jù)緩沖區(qū) 數(shù)據(jù)庫管理員可以通過下述語句,來查看數(shù)據(jù)庫
15、數(shù)據(jù)緩沖區(qū)的使用情況。SELECT name, FROM v$sysstat WHERE name IN ('db block gets','consistent gets','physical reads'); 根據(jù)查詢出來的結(jié)果可以計算出數(shù)據(jù)緩沖區(qū)的使用命中率:數(shù)據(jù)緩沖區(qū)的使用命中率=1 –( physical reads/(db block gets + consi
16、stent gets))這個命中率應(yīng)該在90%以上,否則需要增加數(shù)據(jù)緩沖區(qū)的大小。,3.日志緩沖區(qū) 數(shù)據(jù)庫管理員可以通過執(zhí)行下述語句,查看日志緩沖區(qū)的使用情況。select name,value from v$sysstat where name in ('redo entries','redo log space requests');根據(jù)查詢出的結(jié)果可以計算出日志緩沖區(qū)的申請失敗率:
17、申請失敗率=requests/entries申請失敗率應(yīng)該接近于0,否則說明日志緩沖區(qū)開設(shè)太小,需要增加Oracle數(shù)據(jù)庫的日志緩沖區(qū)。,(1)在磁盤上建立數(shù)據(jù)文件前首先運行磁盤碎片整理程序 為了安全地整理磁盤碎片,需關(guān)閉打開數(shù)據(jù)文件的實例,并且停止服務(wù)。如果有足夠的連續(xù)磁盤空間建立數(shù)據(jù)文件,那么就很容易避免數(shù)據(jù)文件產(chǎn)生碎片。(2)不要使用磁盤壓縮 Oracle數(shù)據(jù)文件不支持磁盤壓縮。(3
18、)不要使用磁盤加密 加密象磁盤壓縮一樣增加了一個處理層,降低磁盤讀寫速度。如果擔(dān)心自己的數(shù)據(jù)可能泄密,可以使用dbms_obfuscation包和label security選擇性地加密數(shù)據(jù)的敏感部分。,9.3.2 物理I/O的調(diào)整,(5)使用RAID RAID的使用應(yīng)注意:①選擇硬件RAID超過軟件RAID;②日志文件不要放在RAID 5卷上,因為RAID 5讀性能高而寫性能差;③把日志文件和歸檔
19、日志放在與控制文件和數(shù)據(jù)文件分離的磁盤控制系統(tǒng)上。(6)分離頁面交換文件到多個磁盤物理卷 跨越至少兩個磁盤建立兩個頁面文件。可以建立四個頁面文件并在性能上受益,確保所有頁面文件的大小之和至少是物理內(nèi)存的兩倍。,1.查看CPU的使用情況 使用操作命令可以看到CPU的使用情況,一般UNIX操作系統(tǒng)的服務(wù)器,可以使用sar –u命令查看CPU的使用率;NT操作系統(tǒng)的服務(wù)器,可以使用NT的性能管理器來查看CPU
20、的使用率。 出現(xiàn)CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。,9.3.3 CPU的優(yōu)化調(diào)整,2.查看SQL語句的解析情況(1)數(shù)據(jù)庫管理員可以執(zhí)行下述語句來查看SQL語句的解析情況:SELECT * FROM V$SYSSTAT WHERE NAME IN ('parse_time_cpu','parse_time_elapsed',
21、'parse_count_ hard');這里:①parse_time_cpu:是系統(tǒng)服務(wù)時間。②parse_time_elapsed:是響應(yīng)時間。而用戶等待時間為:waite_time = parse_time_elapsed – parse_time_cpu由此可以得到用戶SQL語句平均解析等待時間:用戶SQL語句平均解析等待時間=waite_time/parse_count,(2)數(shù)據(jù)庫管理員還可以通
22、過下述語句,查看低效率的SQL語句:SELECT BUFFER_GETS,EXECUTIONS,SQL_TEXT FROM V$SQLAREA;優(yōu)化這些低效率的SQL語句也有助于提高CPU的利用率。,3.查看Oracle數(shù)據(jù)庫的沖突情況 數(shù)據(jù)庫管理員可以通過v$system_event數(shù)據(jù)字典中的“l(fā)atch free”統(tǒng)計項查看Oracle數(shù)據(jù)庫的沖突情況,如果沒有沖突的話,latch free查詢出來沒有結(jié)果。如果沖
23、突太大的話,數(shù)據(jù)庫管理員可以降低spin_count參數(shù)值,來消除高的CPU使用率。,4.CPU的優(yōu)化調(diào)整方法 一些優(yōu)化CPU使用和配置的具體方法有:(1)取消屏幕保護。(2)把系統(tǒng)配置為應(yīng)用服務(wù)器。(3)監(jiān)視系統(tǒng)中消耗中斷的硬件。(4)保持最小的安全審計記錄。(5)在專用服務(wù)器上運行Oracle。(6)禁止非必須的服務(wù)。,網(wǎng)絡(luò)配置是性能調(diào)整的一項很重要的內(nèi)容,而且很容易隱藏性能瓶頸。(1)配置網(wǎng)卡使用最快速度
24、和有效模式(2)刪除不需要的網(wǎng)絡(luò)協(xié)議(3)優(yōu)化網(wǎng)絡(luò)協(xié)議綁定順序(4)為Oracle禁止或優(yōu)化文件共享,9.3.4 網(wǎng)絡(luò)配置的優(yōu)化,1.碎片是如何產(chǎn)生的2.碎片對系統(tǒng)的影響(1)導(dǎo)致系統(tǒng)性能減弱(2)浪費大量的表空間,9.3.5 Oracle碎片整理,3.自由范圍的碎片計算 用fsfi——free space fragmentation index(自由空間碎片索引)值來直觀體現(xiàn):fsfi=100*sqrt(
25、max(extent)/sum(extents))*1/sqrt(sqrt(count(extents))),4.自由范圍的碎片整理 可以將表空間的缺省存儲參數(shù)pctincrease改為非0。一般將其設(shè)為1,如:alter tablespace temp default storage(pctincrease 1); 這樣smon便會將自由范圍自動合并,達到碎片整理的目的。 也可以采用如下語句,通過手工
26、合并自由范圍來達到碎片整理的目的。alter tablespace temp coalesce;,5.段的碎片整理 段由范圍組成,在有些情況下,有必要對段的碎片進行整理。要查看段的有關(guān)信息,可查看數(shù)據(jù)字典DBA_segments,范圍的信息可查看數(shù)據(jù)字典DBA_extents。如果段的碎片過多, 將其數(shù)據(jù)壓縮到一個范圍的最簡單方法便是用正確的存儲參數(shù)將這個段重建,然后將舊表中的數(shù)據(jù)插入到新表,同時刪除舊表。這個過程可以用im
27、port/export(輸入/輸出)工具來完成。 export()命令有一個(壓縮)標(biāo)志,這個標(biāo)志在讀表時會引發(fā)export確定該表所分配的物理空間量,它會向輸出轉(zhuǎn)儲文件寫入一個新的初始化存儲參數(shù),等于全部所分配空間。若這個表關(guān)閉, 則使用import()工具重新生成。這樣,它的數(shù)據(jù)會放入一個新的、較大的初始段中。例如:exp user/password file=exp.dmp compress=y grants=y i
28、ndexes=y tables=(table1,table2);若輸出成功,則從庫中刪除已輸出的表,然后從輸出轉(zhuǎn)儲文件中輸入表:imp user/password file=exp.dmp commit=y buffer=64000 full=y;這種方法可用于整個數(shù)據(jù)庫。另外,應(yīng)該定期shutdown database,從而清理momery碎片。,9.3.6 Oracle系統(tǒng)參數(shù)的調(diào)整,1.Shared Pool and L
29、ibrary Cache Performance Tuning(共享池和Library Cache)共享池調(diào)整的技巧主要有:(1)刷共享池刷( Flush)共享池可以使小塊的內(nèi)存合并為大塊的內(nèi)存。當(dāng)共享池的碎片過多時,能夠暫時恢復(fù)性能。刷共享池可以使用語句:alter system flush shared_pool;(2)綁定變量,2.Buffer Cache Performance Tuning(數(shù)據(jù)庫緩存調(diào)整)從緩存調(diào)
30、整的角度看,應(yīng)力求避免以下的問題:(1)“緩存的最近最少使用(LRN)鏈”(cache buffers LRU chain)的加鎖競爭;(2)“平均寫隊列”(Average Write Queue)長度過大;(3)過多時間花在等待“寫完畢等待上”(write complete waits);(4)過多時間花在等待“緩沖釋放等待”上(free buffer waits)。,3.Latch Contention(加鎖或插銷競爭)
31、 插銷加鎖是SGA中保護共享數(shù)據(jù)結(jié)構(gòu)的低層的串行化機制。插銷latch是一類可以非??斓墨@得和釋放的鎖。插銷鎖的實現(xiàn)是依賴于操作系統(tǒng)的,尤其在關(guān)于一個進程是否會等待一個鎖,和等多久方面。有如下的鎖(插銷)需要調(diào)整:(1)Redo Copy/Allocation Latch:重寫日志的復(fù)制/分配插銷(2)Shared Pool Latch:共享池的插銷(3)Library Cache Latch:Library Cache插
32、銷,4.Redo Log Buffer Performance Tuning(重寫日志緩沖的調(diào)整) LGWR 將重寫日志緩沖中的重寫項寫到重寫日志文件中。一旦LGWR將這些項復(fù)制到重寫日志文件中,用戶進程就可以重寫這些項。統(tǒng)計項目“redo log space requests”反映了用戶進程等待重寫日志緩沖中空間的時間的數(shù)字。(1)設(shè)置重寫日志大小的提示:“redo log space requests”的值應(yīng)該接近0
33、。(2)設(shè)定合適的重寫日志的大小,建議每15-30分鐘進行一次重寫日志的切換。,5.Query Performance Tuning(查詢效率的調(diào)整) 如果查詢運行得很慢,請考慮以下這些方面:(1)希望這個查詢運行的有多快以及有理由這樣要求嗎?(2)優(yōu)化模式OPTIMIZER_MODE 設(shè)為何值?(3)查詢涉及的索引都是有效的嗎?(4)在數(shù)據(jù)庫中有沒有其他的長時間運行的查詢(大查詢)。(5)表和索引上有統(tǒng)計信息嗎
34、?(6)統(tǒng)計信息是被計算出來的還是被估計出來的?對于查詢的性能調(diào)整有兩個主要的調(diào)試工具:TKPROF和AUTOTRACE。,6.Temporary Tablespace Performance Tuning(臨時表空間的調(diào)整) 臨時表空間的調(diào)整的技巧如下: 如果即使在穩(wěn)定的狀態(tài)下也存在很多的排序擴展鎖(Sort Extent Pool latch)的競爭,應(yīng)該通過修改臨時表空間的DEFAULT STORAG
35、E 子句的NEXT值來增大擴展塊的大小。如果存在很多的排序擴展鎖(Sort Extent Pool latch)的競爭并且這種等待是由于過多的并發(fā)的排序造成的,應(yīng)該增大SORT_AREA_SIZE參數(shù)的大小,以使更多的排序能保存在內(nèi)存中。建議讓擴展塊的大小和SORT_AREA_SIZE參數(shù)相同。,9.4.2 鎖,9.4.1 并發(fā)事件的產(chǎn)生,9.4 并發(fā)事件處理,數(shù)據(jù)庫是一個共享資源,可為多個應(yīng)用程序所共享。這些程序可串行運行,但
36、在許多情況下,可能多個程序或一個程序的多個進程并行地運行,這就是數(shù)據(jù)庫的并行操作。在多用戶數(shù)據(jù)庫環(huán)境中,多個用戶程序可并行地存取數(shù)據(jù)庫,如果不對并發(fā)操作進行控制,會存取不正確的數(shù)據(jù),或破壞數(shù)據(jù)庫數(shù)據(jù)的一致性。,9.4.1 并發(fā)事件的產(chǎn)生,(1)當(dāng)一個用戶正在修改表中數(shù)據(jù)的同時,另一個用戶正試圖刪除該表。(2)用戶A正試圖讀取用戶B的某個事務(wù)中的一些數(shù)據(jù),在用戶A的事務(wù)開始后,該事務(wù)由用戶B修改和提交。用戶A讀取用戶B提交的數(shù)據(jù)。這意
37、味著在同一個事務(wù)中讀取的數(shù)據(jù)在某個時刻不一致。(3)某個用戶對數(shù)據(jù)進行修改,另一個用戶在第一個用戶提交事務(wù)以前對同一行進行修改;因此,第一個用戶所做的改變丟失了。(4)一個用戶從另一個用戶尚未提交的數(shù)據(jù)中讀取數(shù)據(jù);也就是說,在用戶B的改變提交以前,用戶A讀取用戶B正在修改的行。,9.4.2 鎖,1.鎖的功能,2.鎖的類型,3.鎖的模式,4.查看相關(guān)信息,1.鎖的功能(1)數(shù)據(jù)一致性(2)數(shù)據(jù)并行性(3)數(shù)據(jù)完整性,Oracl
38、e在兩個不同級上提供讀一致性:語句級讀一致性和事務(wù)級一致性。(1)語句級讀取一致性(2)事務(wù)級讀取一致性,2.鎖的類型Oracle鎖具體分為以下幾類:(1)自動鎖與顯示鎖按用戶與系統(tǒng)劃分,可以分為自動鎖與顯示鎖。①自動鎖:當(dāng)進行一項數(shù)據(jù)庫操作時,缺省情況下,系統(tǒng)自動為此數(shù)據(jù)庫操作獲得所有有必要的鎖。②顯示鎖:某些情況下,需要用戶顯示的鎖定數(shù)據(jù)庫操作要用到的數(shù)據(jù),才能使數(shù)據(jù)庫操作執(zhí)行得更好,顯示鎖是用戶為數(shù)據(jù)庫對象設(shè)定的。,
39、(2)共享鎖與排它鎖按鎖級別劃分,可分為共享鎖與排它鎖。①共享鎖:共享鎖允許相關(guān)資源可以共享,幾個用戶可同時讀同一數(shù)據(jù),幾個事務(wù)可在同一資源上獲取共享封鎖。共享鎖比排它鎖具有更高的數(shù)據(jù)并行性。但拙劣的事務(wù)設(shè)計+共享鎖容易造成死鎖或數(shù)據(jù)更新丟失。②排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對象的共享鎖或排它鎖。排它鎖禁止相關(guān)資源的共享,如果一事務(wù)以排它方式封鎖一資源,僅僅該事務(wù)可更改該資源,
40、直至釋放排它封鎖。,(3)DML鎖和DDL鎖按操作劃分,可分為DML鎖、DDL鎖。①DML鎖又可以分為:行鎖、表鎖、死鎖。 行鎖:當(dāng)事務(wù)執(zhí)行數(shù)據(jù)庫插入、更新、刪除操作時,該事務(wù)自動獲得操作表中操作行的排它鎖。 表鎖:當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動獲得該行的表鎖(共享鎖),以防止其它事務(wù)進行DDL語句影響記錄行的更新。事務(wù)也可以在進行過程中獲得共享鎖或排它鎖,只有當(dāng)事務(wù)顯示使用LOCK TABLE語句顯示的定義一個排它鎖時,
41、事務(wù)才會獲得表上的排它鎖,也可使用LOCK TABLE顯示的定義。 死鎖:當(dāng)兩個事務(wù)需要一組有沖突的鎖,而不能將事務(wù)繼續(xù)下去的話,就出現(xiàn)死鎖。,②DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析鎖。排它DDL鎖:創(chuàng)建、修改、刪除一個數(shù)據(jù)庫對象的DDL語句獲得操作對象的排它鎖。如使用alter table語句時,為了維護數(shù)據(jù)的完成性、一致性、合法性,該事務(wù)獲得一排它DDL鎖。共享DDL鎖:需在數(shù)據(jù)庫對象之間建立相互依賴關(guān)系的D
42、DL語句通常需共享獲得DDL鎖。如創(chuàng)建一個包,該包中的過程與函數(shù)引用了不同的數(shù)據(jù)庫表,當(dāng)編譯此包時,該事務(wù)就獲得了引用表的共享DDL鎖。分析鎖:Oracle使用共享池存儲分析與優(yōu)化過的SQL語句及PL/SQL程序,使運行相同語句的應(yīng)用速度更快。一個在共享池中緩存的對象獲得它所引用數(shù)據(jù)庫對象的分析鎖。分析鎖是一種獨特的DDL鎖類型,Oracle使用它追蹤共享池對象及它所引用數(shù)據(jù)庫對象之間的依賴關(guān)系。當(dāng)一個事務(wù)修改或刪除了共享池持有分析鎖
43、的數(shù)據(jù)庫對象時,Oracle使共享池中的對象作廢,下次在引用這條SQL/PLSQL語句時,Oracle重新分析編譯此語句。,(4)內(nèi)部閂鎖內(nèi)部閂鎖是Oracle中的一種特殊鎖,用于順序訪問內(nèi)部系統(tǒng)結(jié)構(gòu)。當(dāng)事務(wù)需向緩沖區(qū)寫入信息時,為了使用此塊內(nèi)存區(qū)域,Oracle首先必須取得這塊內(nèi)存區(qū)域的閂鎖,才能向此塊內(nèi)存寫入信息。,3.鎖的模式(1)模式0:none。(2)模式1:null 空。1級鎖有:Select,有時會在v$locked
44、_object出現(xiàn)。(3)模式2:Row-S 行共享(RS):共享表鎖,sub share。2級鎖有:Select for update、Lock For Update、Lock Row Share。select for update當(dāng)對話使用for update子串打開一個游標(biāo)時,所有返回集中的數(shù)據(jù)行都將處于行級(Row-X)獨占式鎖定,其他對象只能查詢這些數(shù)據(jù)行,不能進行update、delete或select for upda
45、te操作。,(4)模式3:Row-X 行獨占(RX):用于行的修改,sub exclusive。3級鎖有:Insert、Update、Delete、Lock Row Exclusive。沒有commit之前插入同樣的一條記錄會沒有反應(yīng), 因為后一個3的鎖會一直等待上一個3的鎖,必須釋放掉上一個才能繼續(xù)工作。(5)模式4:Share 共享鎖(S):阻止其他DML操作,share。4級鎖有:Create Index、Lock Share
46、。locked_mode為2、3、4不影響DML(insert、delete、update、select等)操作, 但DDL(alter、drop等)操作會提示錯誤。,(6)模式5:S/Row-X 共享行獨占(SRX):阻止其他事務(wù)操作,share/sub exclusive。5級鎖有:Lock Share Row Exclusive。具體來講有主外鍵約束時update/delete ... ; 可能會產(chǎn)生4,5的鎖。(7)模式6
47、:exclusive 獨占(X):獨立訪問使用,exclusive。6級鎖有:Alter table、Drop table、Drop Index、Truncate table、Lock Exlusive。數(shù)字越大鎖級別越高, 影響的操作越多。,4.查看相關(guān)信息 Oracle在動態(tài)狀態(tài)表V$lock中存儲與數(shù)據(jù)庫中的鎖有關(guān)的所有信息。當(dāng)資源被鎖定時, 可以檢查V$lock表,查看數(shù)據(jù)庫中的各種情況。,9.5 數(shù)據(jù)完整性,
48、數(shù)據(jù)完整性是指數(shù)據(jù)的正確性和相容性。數(shù)據(jù)的完整性是為了防止數(shù)據(jù)庫存在不符合原義的數(shù)據(jù),防止錯誤信息輸入和輸出,即數(shù)據(jù)要遵守由DBA或應(yīng)用開發(fā)者所決定的一組預(yù)定義的規(guī)則。,1.?dāng)?shù)據(jù)完整性的類型 Oracle應(yīng)用于關(guān)系數(shù)據(jù)庫的表的數(shù)據(jù)完整性有下列類型:(1)在插入或修改表的行時允許不允許包含有空值的列,稱為空與非空規(guī)則。(2)唯一列值規(guī)則,允許插入或修改的表行在該列上的值唯一。(3)引用完整性規(guī)則,同關(guān)系模型定義相符。(
49、4)用戶對定義的規(guī)則,是復(fù)雜的完整性檢查。,2.完整性約束及其優(yōu)點 完整性約束,是對表的列定義規(guī)則的說明性方法。 Oracle利用完整性約束機制防止無效的數(shù)據(jù)進入數(shù)據(jù)庫的基表,如果任何DML執(zhí)行結(jié)果破壞完整性約束,該語句被回滾并返回上一個錯誤。,利用完整性約束實施數(shù)據(jù)完整性規(guī)則有下列優(yōu)點:(1)定義或更改表時,不需要程序設(shè)計,便很容易地編寫程序并可消除程序性錯誤,其功能是由Oracle控制。所以說明性完整性約束
50、優(yōu)于應(yīng)用代碼和數(shù)據(jù)庫觸發(fā)器。(2)對表所定義的完整性約束是存儲在數(shù)據(jù)字典中,所以由任何應(yīng)用進入的數(shù)據(jù)都必須遵守與表相關(guān)聯(lián)的完整性約束。(3)具有最大的開發(fā)能力。當(dāng)由完整性約束所實施的事務(wù)規(guī)則改變時,管理員只需改變完整性約束的定義,所有應(yīng)用自動地遵守所修改的約束。,3.完整性約束的類型 Oracle的DBA和應(yīng)用開始者對列的值輸入可使用的完整性約束有下列類型:(1)NOT NULL約束:如果在表的一列的值不允許為空,則需
51、在該列指定NOT NULL約束。(2)UNIQUE鍵約束:在表指定的列或組列上不允許兩行具有重復(fù)值時,則需要該列或組列上指定UNIQUE鍵完整性約束。在UNIQUE鍵約束定義中的列或組列稱為唯一鍵。所有唯一完整性約束是用索引方法實施。(3)PRIMARY KEY約束:在數(shù)據(jù)庫中每一個表可有一個PRIMARY KEY約束。包含在PRIMARY KEY完整性約束的列或組列稱為主鍵,每個表可有一個主鍵。Oracle使用索引實施PRIMAR
52、Y KEY約束。,(4)FOREIGN KEY約束:在關(guān)系數(shù)據(jù)庫中表可通過公共列相關(guān)聯(lián),該規(guī)則控制必須維護的列之間的關(guān)系。包含在引用完整性約束定義的列或組列稱為外來鍵。由外來鍵所引用的表中的唯一鍵,稱為引用鍵。包含有外來鍵的表稱為子表或從屬表。由子表的外來鍵所引用的表稱為雙親表或引用表。如果對表的每一行,其外來鍵的值必須與主鍵中一值相匹配,則需指定引用完整性約束。(5)CHECK約束:表的每行對一指定的條件必須是TRUE或未知,則需在
53、一列或列組上指定CHECK完整性約束。如果在發(fā)出一個DML語句時,CHECK約束的條件計算得FALSE時,該語句被回滾。,4.?dāng)?shù)據(jù)庫觸發(fā)器 數(shù)據(jù)庫觸發(fā)器,是使用非說明方法實施完整性規(guī)則,利用數(shù)據(jù)庫觸發(fā)器可定義和實施任何類型的完整性規(guī)則。,9.6 數(shù)據(jù)庫性能優(yōu)化工具,常用的數(shù)據(jù)庫性能優(yōu)化工具有:(1)Oracle數(shù)據(jù)庫在線數(shù)據(jù)字典(2)操作系統(tǒng)工具(3)SQL語言跟蹤工具(SQL TRACE FACILITY)(4)
54、Oracle Enterprise Manager(OEM)(5)EXPLAIN PLANSQL語言優(yōu)化命令,9.7.2 確定Oracle數(shù)據(jù)庫表中重復(fù)的記錄,9.7.1 序號生成器,9.7 常見問題處理,,,(1)Oracle序號生成的命令格式為:create 序號名 increment by 每次增長數(shù)start with 起始序號(2)可以用下面的語句得到當(dāng)前的序號:select seq1.currval from
55、 dual;(3)也可以用下面的語句得到下一個序號:insert into dept values(seq1.nextval,...);,9.7.1 序號生成器,(4)刪除序號的語句為:DROP SEQUENCE order_seq;(5)影響Sequence的初始化參數(shù):SEQUENCE_CACHE_ENTRIES =設(shè)置能同時被cache的sequence數(shù)目,,1.自關(guān)聯(lián)查詢方法,2.GROUP BY/HAVING查詢
56、方法,9.7.2 確定Oracle數(shù)據(jù)庫表中重復(fù)的記錄,3.Exception into子句,,1.自關(guān)聯(lián)查詢方法 Oracle系統(tǒng)中,對于所有的表都存在一個唯一的列,這就是rowid。對該列使用最大(max)或者最?。╩in)函數(shù)可以非常容易地確定重復(fù)的行。,,2.GROUP BY/HAVING查詢方法 利用分組函數(shù)GROUP BY/HAVING也很容易確定重復(fù)的行。以需要創(chuàng)建唯一索引的列分組并統(tǒng)計每組的個
57、數(shù),很明顯如果組中記錄數(shù)超過1個就存在重復(fù)的行。,,3.Exception into子句 采用alter table命令中的Exception into子句也可以確定出表中重復(fù)的記錄。這種方法稍微麻煩一些,為了使用“excepeion into”子句,必須首先創(chuàng)建EXCEPTIONS表。創(chuàng)建該表的SQL腳本文件為utlexcpt.sql。對于NT系統(tǒng)和UNIX系統(tǒng),Oracle存放該文件的位置稍有不同。 將ex
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- refactoring - uml軟件工程組織-火龍果軟件工程
- 計劃模板 - uml軟件工程組織-火龍果軟件工程
- 漢周云計算白皮書簡版-uml軟件工程組織-火龍果軟件工程
- [理學(xué)]軟件工程導(dǎo)論
- 軟件工程導(dǎo)論大題
- 淺議計算機軟件工程管理
- 軟件工程導(dǎo)論習(xí)題
- 軟件工程導(dǎo)論試題
- 軟件學(xué)院-軟件工程導(dǎo)論試題
- 2018年計算機科學(xué)與軟件工程學(xué)院軟件工程專業(yè)
- 軟件工程(第10版)讀書筆記——軟件工程導(dǎo)論
- 軟件工程導(dǎo)論試題集
- 軟件工程專業(yè)導(dǎo)論論文
- 軟件工程實踐導(dǎo)論-read
- 軟件工程導(dǎo)論習(xí)題答案
- 軟件工程導(dǎo)論期末復(fù)習(xí)
- 計算機軟件工程管理與應(yīng)用解析
- wirelesssensornetworksanoverview-uml軟件工程組
- 關(guān)于計算機軟件工程的分析思考
- 芻議計算機軟件工程管理的特點
評論
0/150
提交評論