你最好買一本專門講ORACLE性能優(yōu)化的書,好好看看\x0d\x0a1、調(diào)整數(shù)據(jù)庫服務器的性能\x0d\x0aOracle數(shù)據(jù)庫服務器是整個系統(tǒng)的核心,它的性能高低直接影響整個系統(tǒng)的性能,為了調(diào)整Oracle數(shù)據(jù)庫服務器的性能,主要從以下幾個方面考慮: \x0d\x0a1.1、調(diào)整操作系統(tǒng)以適合Oracle數(shù)據(jù)庫服務器運行\(zhòng)x0d\x0aOracle數(shù)據(jù)庫服務器很大程度上依賴于運行服務器的操作系統(tǒng),如果操作系統(tǒng)不能提供最好性能,那么無論如何調(diào)整,Oracle數(shù)據(jù)庫服務器也無法發(fā)揮其應有的性能。 \x0d\x0a1.1.1、為Oracle數(shù)據(jù)庫服務器規(guī)劃系統(tǒng)資源 \x0d\x0a據(jù)已有計算機可用資源, 規(guī)劃分配給Oracle服務器資源原則是:盡可能使Oracle服務器使用資源最大化,特別在Client/Server中盡量讓服務器上所有資源都來運行Oracle服務。 \x0d\x0a1.1.2、調(diào)整計算機系統(tǒng)中的內(nèi)存配置 \x0d\x0a多數(shù)操作系統(tǒng)都用虛存來模擬計算機上更大的內(nèi)存,它實際上是硬盤上的一定的磁盤空間。當實際的內(nèi)存空間不能滿足應用軟件的要求時,操作系統(tǒng)就將用這部分的磁盤空間對內(nèi)存中的信息進行頁面替換,這將引起大量的磁盤I/O操作,使整個服務器的性能下降。為了避免過多地使用虛存,應加大計算機的內(nèi)存。 \x0d\x0a1.1.3、為Oracle數(shù)據(jù)庫服務器設置操作系統(tǒng)進程優(yōu)先級 \x0d\x0a不要在操作系統(tǒng)中調(diào)整Oracle進程的優(yōu)先級,因為在Oracle數(shù)據(jù)庫系統(tǒng)中,所有的后臺和前臺數(shù)據(jù)庫服務器進程執(zhí)行的是同等重要的工作,需要同等的優(yōu)先級。所以在安裝時,讓所有的數(shù)據(jù)庫服務器進程都使用缺省的優(yōu)先級運行。 \x0d\x0a1.2、調(diào)整內(nèi)存分配\x0d\x0aOracle數(shù)據(jù)庫服務器保留3個基本的內(nèi)存高速緩存,分別對應3種不同類型的數(shù)據(jù):庫高速緩存,字典高速緩存和緩沖區(qū)高速緩存。庫高速緩存和字典高速緩存一起構(gòu)成共享池,共享池再加上緩沖區(qū)高速緩存便構(gòu)成了系統(tǒng)全程區(qū)(SGA)。SGA是對數(shù)據(jù)庫數(shù)據(jù)進行快速訪問的一個系統(tǒng)全程區(qū),若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數(shù)據(jù)的目的,因此應把SGA放在主存中,不要放在虛擬內(nèi)存中。內(nèi)存的調(diào)整主要是指調(diào)整組成SGA的內(nèi)存結(jié)構(gòu)的大小來提高系統(tǒng)性能,由于Oracle數(shù)據(jù)庫服務器的內(nèi)存結(jié)構(gòu)需求與應用密切相關,所以內(nèi)存結(jié)構(gòu)的調(diào)整應在磁盤I/O調(diào)整之前進行。 \x0d\x0a1.2.1、庫緩沖區(qū)的調(diào)整 \x0d\x0a庫緩沖區(qū)中包含私用和共享SQL和PL/SQL區(qū),通過比較庫緩沖區(qū)的命中率決定它的大小。要調(diào)整庫緩沖區(qū),必須首先了解該庫緩沖區(qū)的活動情況,庫緩沖區(qū)的活動統(tǒng)計信息保留在動態(tài)性能表v$librarycache數(shù)據(jù)字典中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache; \x0d\x0a \x0d\x0aPins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數(shù);Reloads列給出SQL 和PL/SQL塊的隱式分析或?qū)ο蠖x重裝載時在庫程序緩沖區(qū)中發(fā)生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區(qū)的命中率合適;若sum(pins)/sum(reloads)1, 則需調(diào)整初始化參數(shù) shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。 \x0d\x0a1.2.2、數(shù)據(jù)字典緩沖區(qū)的調(diào)整 \x0d\x0a數(shù)據(jù)字典緩沖區(qū)包含了有關數(shù)據(jù)庫的結(jié)構(gòu)、用戶、實體信息。數(shù)據(jù)字典的命中率,對系統(tǒng)性能影響極大。數(shù)據(jù)字典緩沖區(qū)的使用情況記錄在動態(tài)性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache; \x0d\x0a \x0d\x0aGets列是對相應項請求次數(shù)的統(tǒng)計;Getmisses 列是引起緩沖區(qū)出錯的數(shù)據(jù)的請求次數(shù)。對于頻繁訪問的數(shù)據(jù)字典緩沖區(qū),sum(getmisses)/sum(gets)10%~15%。若大于此百分數(shù),則應考慮增加數(shù)據(jù)字典緩沖區(qū)的容量,即需調(diào)整初始化參數(shù)shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。 \x0d\x0a1.2.3、緩沖區(qū)高速緩存的調(diào)整 \x0d\x0a用戶進程所存取的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區(qū)高速緩存的使用情況記錄在動態(tài)性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads'); \x0d\x0a \x0d\x0adbblock gets和consistent gets的值是請求數(shù)據(jù)緩沖區(qū)中讀的總次數(shù)。physical reads的值是請求數(shù)據(jù)時引起從盤中讀文件的次數(shù)。從緩沖區(qū)高速緩存中讀的可能性的高低稱為緩沖區(qū)的命中率,計算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\x0a \x0d\x0a如果Hit Ratio60%~70%,則應增大db_block_buffers的參數(shù)值。db_block_buffers可以調(diào)整分配給緩沖區(qū)高速緩存的內(nèi)存量,即db_block_buffers可設置分配緩沖區(qū)高速緩存的數(shù)據(jù)塊的個數(shù)。緩沖區(qū)高速緩存的總字節(jié)數(shù)=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數(shù)據(jù)塊大小的字節(jié)數(shù),可查詢 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size'; \x0d\x0a \x0d\x0a在修改了上述數(shù)據(jù)庫的初始化參數(shù)以后,必須先關閉數(shù)據(jù)庫,在重新啟動數(shù)據(jù)庫后才能使新的設置起作用。
創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)網(wǎng)站建設與網(wǎng)站營銷,提供成都網(wǎng)站制作、成都網(wǎng)站設計、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、重慶小程序開發(fā)、公眾號商城、等建站開發(fā),創(chuàng)新互聯(lián)公司網(wǎng)站建設策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。
4.在oracle 端做測試數(shù)據(jù)驗證
7.1 測試Load (不符合3條件時的報錯信息)
ASP.NET 中的緩存提供了對SQL依賴項的支持,也就是說當SQL SERVER數(shù)據(jù)庫中的表或行中的數(shù)據(jù)被更改后,緩存中的頁面就失效,否則,頁面輸出可一直保留在緩存當中。這確實為程序員提供了方便。但微軟一向很小家子氣,只為使用自家產(chǎn)品SQL SERVER的程序員提供了方便,那些用Oracle數(shù)據(jù)庫的ASP.NET程序員怎么辦呢?
其實不用著急,因為ASP.NET中的緩存還提供了對文件依賴項的支持,也就是緩存依賴于某個文件,該文件被修改后,緩存中的頁面就失效。只要巧妙利用ASP.NET的文件依賴項緩存策略和Oracle中的觸發(fā)器,就可輕松實現(xiàn)依賴Oracle的緩存策略。思路很簡單,先將頁面的緩存策略設置為依賴某一個文件,再為Oracle中需要依賴的表添加一個觸發(fā)器,當表中的數(shù)據(jù)被更改時,修改緩存所依賴的文件中的內(nèi)容。
下面以一個小例子來具體說明:
試驗目的:Default.aspx頁面的緩存依賴于Oracle數(shù)據(jù)庫中SCOTT用戶的DEPT表,該表中數(shù)據(jù)被更改后,緩存中的頁面失效。緩存的過期時間為120秒。
一、設置網(wǎng)站頁面的緩存依賴于文件TextFile.txt詳見System.Web.Caching.Cache類 Asp.NET緩存 各種緩存依賴二、在Oracle數(shù)據(jù)庫中創(chuàng)建觸發(fā)器
1、觸發(fā)器被觸發(fā)時執(zhí)行PL/SQL代碼塊。PL/SQL代碼塊直接讀寫操作系統(tǒng)中的文件,需調(diào)用內(nèi)置的utl_file程序包。這需要先修改Oracle的初始化參數(shù)文件INIT.ORA,在其中添加參數(shù)utl_file_dir,來指定文件的目錄。修改INIT.ORA文件后,需重啟Oracle數(shù)據(jù)庫,設置的參數(shù)才能生效。
在INIT.ORA文件中添加下面一行內(nèi)容:
utl_file_dir='E:/CSharp/CacheByOracleDependncy'
也可以設置為utl_file_dir=*,不指定具體目錄,即任何目錄都可以。
如果是Oracle 9i數(shù)據(jù)庫,還有一種方法也能起到同樣的作用:在sys用戶下創(chuàng)建一個directory目錄(實際上是在sys用戶下的dir$表中增加一個對應的OS_PATH),然后將對該directory對象的讀/寫操作的權(quán)限grant給public。
[sql] view plain copy
create or replace directory FILEPATH as 'E:/CSharp/CacheByOracleDependncy';grant read on directory FILEPATH to public;這里我使用的是第二種方法。
2、為所依賴的表(SCOTT用戶的DEPT表)創(chuàng)建一個觸發(fā)器:當DEPT表中的數(shù)據(jù)更改后,觸發(fā)器就會將當前系統(tǒng)時間寫入TextFile.txt文件中。
[sql] view plain copy
CREATE OR REPLACE TRIGGER
"SCOTT"."TEST_CACHE_BY_ORACLE_DEPENDNCY" AFTERINSERT
OR UPDATE
OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLAREfile_handle utl_file.file_type;
BEGIN
--打開文件
file_handle := utl_file.fopen('FILEPATH','TextFile.txt','w');--將當前系統(tǒng)時間寫入文件
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));END IF;
--關閉文件
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
如果應用服務器和數(shù)據(jù)庫服務器不是同一臺服務器可能會遇到項目無法成功訪問文件進行依賴的情況:
解決方法詳見ASP.Net訪問網(wǎng)絡驅(qū)動器(映射磁盤)
ORACLE中怎么設置SEQUENCE權(quán)限步驟如下:
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權(quán)限。
創(chuàng)建語句如下:
CREATE?SEQUENCE seqTest
INCREMENT?BY?1?--?每次加幾個
START?WITH?1?--?從1開始計數(shù)
NOMAXvalue?--?不設置最大值
NOCYCLE?--?一直累加,不循環(huán)
CACHE?10;?--設置緩存cache個序列,如果系統(tǒng)down掉了或者其它情況將會導致序列不連續(xù),也可以設置為---------NOCACHE
2、得到Sequence值?
定義好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的當前值
NextVal:增加sequence的值,然后返回 增加后sequence值
得到值語句如下:
SELECT?Sequence名稱.CurrVal?FROM?DUAL;?
如得到上邊創(chuàng)建Sequence值的語句為:
select?seqtest.currval?from?dual
在Sql語句中可以使用sequence的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語句
- INSERT語句的子查詢中
- INSERT語句的values中
- UPDATE 的 SET中
如在插入語句中
insert?into?表名(id,name)values(seqtest.Nextval,'sequence?插入測試');
3、Alter Sequence?
擁有ALTER ANY SEQUENCE 權(quán)限才能改動sequence. 可以alter除start至以外的所有sequence參數(shù).如果想要改變start值,必須 drop sequence 再 re-create。
4、Drop Sequence
DROP?SEQUENCE?seqTest;?
5、一個例子
create?or?replace?trigger?tri_test_id
before?insert?on?S_Depart???--S_Depart?是表名
for?each?row
declare
nextid?number;
begin
IF?:new.DepartId?IS?NULLor?:new.DepartId=0?THEN?--DepartId是列名
select?SEQ_ID.nextval?--SEQ_ID正是剛才創(chuàng)建的
into?nextid
from?sys.dual;
:new.DepartId:=nextid;
end?if;
end?tri_test_id;