免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

oracle如何分析性能,高性能oracle

oracle數(shù)據(jù)庫的性能優(yōu)化有哪些方法?

你最好買一本專門講ORACLE性能優(yōu)化的書,好好看看

創(chuàng)新互聯(lián)專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,成都服務(wù)器托管成都服務(wù)器托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。

1、調(diào)整數(shù)據(jù)庫服務(wù)器的性能

Oracle數(shù)據(jù)庫服務(wù)器是整個系統(tǒng)的核心,它的性能高低直接影響整個系統(tǒng)的性能,為了調(diào)整Oracle數(shù)據(jù)庫服務(wù)器的性能,主要從以下幾個方面考慮:

1.1、調(diào)整操作系統(tǒng)以適合Oracle數(shù)據(jù)庫服務(wù)器運行

Oracle數(shù)據(jù)庫服務(wù)器很大程度上依賴于運行服務(wù)器的操作系統(tǒng),如果操作系統(tǒng)不能提供最好性能,那么無論如何調(diào)整,Oracle數(shù)據(jù)庫服務(wù)器也無法發(fā)揮其應(yīng)有的性能。

1.1.1、為Oracle數(shù)據(jù)庫服務(wù)器規(guī)劃系統(tǒng)資源

據(jù)已有計算機(jī)可用資源, 規(guī)劃分配給Oracle服務(wù)器資源原則是:盡可能使Oracle服務(wù)器使用資源最大化,特別在Client/Server中盡量讓服務(wù)器上所有資源都來運行Oracle服務(wù)。

1.1.2、調(diào)整計算機(jī)系統(tǒng)中的內(nèi)存配置

多數(shù)操作系統(tǒng)都用虛存來模擬計算機(jī)上更大的內(nèi)存,它實際上是硬盤上的一定的磁盤空間。當(dāng)實際的內(nèi)存空間不能滿足應(yīng)用軟件的要求時,操作系統(tǒng)就將用這部分的磁盤空間對內(nèi)存中的信息進(jìn)行頁面替換,這將引起大量的磁盤I/O操作,使整個服務(wù)器的性能下降。為了避免過多地使用虛存,應(yīng)加大計算機(jī)的內(nèi)存。

1.1.3、為Oracle數(shù)據(jù)庫服務(wù)器設(shè)置操作系統(tǒng)進(jìn)程優(yōu)先級

不要在操作系統(tǒng)中調(diào)整Oracle進(jìn)程的優(yōu)先級,因為在Oracle數(shù)據(jù)庫系統(tǒng)中,所有的后臺和前臺數(shù)據(jù)庫服務(wù)器進(jìn)程執(zhí)行的是同等重要的工作,需要同等的優(yōu)先級。所以在安裝時,讓所有的數(shù)據(jù)庫服務(wù)器進(jìn)程都使用缺省的優(yōu)先級運行。

1.2、調(diào)整內(nèi)存分配

Oracle數(shù)據(jù)庫服務(wù)器保留3個基本的內(nèi)存高速緩存,分別對應(yīng)3種不同類型的數(shù)據(jù):庫高速緩存,字典高速緩存和緩沖區(qū)高速緩存。庫高速緩存和字典高速緩存一起構(gòu)成共享池,共享池再加上緩沖區(qū)高速緩存便構(gòu)成了系統(tǒng)全程區(qū)(SGA)。SGA是對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行快速訪問的一個系統(tǒng)全程區(qū),若SGA本身需要頻繁地進(jìn)行釋放、分配,則不能達(dá)到快速訪問數(shù)據(jù)的目的,因此應(yīng)把SGA放在主存中,不要放在虛擬內(nèi)存中。內(nèi)存的調(diào)整主要是指調(diào)整組成SGA的內(nèi)存結(jié)構(gòu)的大小來提高系統(tǒng)性能,由于Oracle數(shù)據(jù)庫服務(wù)器的內(nèi)存結(jié)構(gòu)需求與應(yīng)用密切相關(guān),所以內(nèi)存結(jié)構(gòu)的調(diào)整應(yīng)在磁盤I/O調(diào)整之前進(jìn)行。

1.2.1、庫緩沖區(qū)的調(diào)整

庫緩沖區(qū)中包含私用和共享SQL和PL/SQL區(qū),通過比較庫緩沖區(qū)的命中率決定它的大小。要調(diào)整庫緩沖區(qū),必須首先了解該庫緩沖區(qū)的活動情況,庫緩沖區(qū)的活動統(tǒng)計信息保留在動態(tài)性能表v$librarycache數(shù)據(jù)字典中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。

Select sum(pins),sum(reloads) from v$librarycache;

Pins列給出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)存量。

1.2.2、數(shù)據(jù)字典緩沖區(qū)的調(diào)整

數(shù)據(jù)字典緩沖區(qū)包含了有關(guān)數(shù)據(jù)庫的結(jié)構(gòu)、用戶、實體信息。數(shù)據(jù)字典的命中率,對系統(tǒng)性能影響極大。數(shù)據(jù)字典緩沖區(qū)的使用情況記錄在動態(tài)性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。

Select sum(gets),sum(getmisses) from v$rowcache;

Gets列是對相應(yīng)項請求次數(shù)的統(tǒng)計;Getmisses 列是引起緩沖區(qū)出錯的數(shù)據(jù)的請求次數(shù)。對于頻繁訪問的數(shù)據(jù)字典緩沖區(qū),sum(getmisses)/sum(gets)10%~15%。若大于此百分?jǐn)?shù),則應(yīng)考慮增加數(shù)據(jù)字典緩沖區(qū)的容量,即需調(diào)整初始化參數(shù)shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。

1.2.3、緩沖區(qū)高速緩存的調(diào)整

用戶進(jìn)程所存取的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取,所以該部分的命中率,對性能至關(guān)重要。緩沖區(qū)高速緩存的使用情況記錄在動態(tài)性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。

Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');

dbblock gets和consistent gets的值是請求數(shù)據(jù)緩沖區(qū)中讀的總次數(shù)。physical reads的值是請求數(shù)據(jù)時引起從盤中讀文件的次數(shù)。從緩沖區(qū)高速緩存中讀的可能性的高低稱為緩沖區(qū)的命中率,計算公式:

Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))

如果Hit Ratio60%~70%,則應(yīng)增大db_block_buffers的參數(shù)值。db_block_buffers可以調(diào)整分配給緩沖區(qū)高速緩存的內(nèi)存量,即db_block_buffers可設(shè)置分配緩沖區(qū)高速緩存的數(shù)據(jù)塊的個數(shù)。緩沖區(qū)高速緩存的總字節(jié)數(shù)=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數(shù)據(jù)塊大小的字節(jié)數(shù),可查詢 v$parameter 表:

select name,value from v$parameter where name='db_block_size';

在修改了上述數(shù)據(jù)庫的初始化參數(shù)以后,必須先關(guān)閉數(shù)據(jù)庫,在重新啟動數(shù)據(jù)庫后才能使新的設(shè)置起作用。

oracle 數(shù)據(jù)庫變慢怎么分析

1、1、調(diào)整數(shù)據(jù)結(jié)構(gòu)的設(shè)計。這一部分在開發(fā)信息系統(tǒng)之前完成,程序員需要考慮是否使用ORACLE數(shù)據(jù)庫的分區(qū)功能,對于經(jīng)常訪問的數(shù)據(jù)庫表是否需要建立索引等。

2、2、調(diào)整應(yīng)用程序結(jié)構(gòu)設(shè)計。這一部分也是在開發(fā)信息系統(tǒng)之前完成,程序員在這一步需要考慮應(yīng)用程序使用什么樣的體系結(jié)構(gòu),是使用傳統(tǒng)的Client/Server兩層體系結(jié)構(gòu),還是使用Browser/Web/Database的三層體系結(jié)構(gòu)。不同的應(yīng)用程序體系結(jié)構(gòu)要求的數(shù)據(jù)庫資源是不同的。

3、3、調(diào)整數(shù)據(jù)庫SQL語句。應(yīng)用程序的執(zhí)行最終將歸結(jié)為數(shù)據(jù)庫中的SQL語句執(zhí)行,因此SQL語句的執(zhí)行效率最終決定了ORACLE數(shù)據(jù)庫的性能。ORACLE公司推薦使用ORACLE語句優(yōu)化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調(diào)整優(yōu)化SQL語句。

4、4、調(diào)整服務(wù)器內(nèi)存分配。內(nèi)存分配是在信息系統(tǒng)運行過程中優(yōu)化配置的,數(shù)據(jù)庫管理員可以根據(jù)數(shù)據(jù)庫運行狀況調(diào)整數(shù)據(jù)庫系統(tǒng)全局區(qū)(SGA區(qū))的數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)和共享池的大小;還可以調(diào)整程序全局區(qū)(PGA區(qū))的大小。需要注意的是,SGA區(qū)不是越大越好,SGA區(qū)過大會占用操作系統(tǒng)使用的內(nèi)存而引起虛擬內(nèi)存的頁面交換,這樣反而會降低系統(tǒng)。

5、5、調(diào)整硬盤I/O,這一步是在信息系統(tǒng)開發(fā)之前完成的。數(shù)據(jù)庫管理員可以將組成同一個表空間的數(shù)據(jù)文件放在不同的硬盤上,做到硬盤之間I/O負(fù)載均衡。

6、6、調(diào)整操作系統(tǒng)參數(shù),例如:運行在UNIX操作系統(tǒng)上的ORACLE數(shù)據(jù)庫,可以調(diào)整UNIX數(shù)據(jù)緩沖池的大小,每個進(jìn)程所能使用的內(nèi)存大小等參數(shù)。

實際上,上述數(shù)據(jù)庫優(yōu)化措施之間是相互聯(lián)系的。ORACLE數(shù)據(jù)庫性能惡化表現(xiàn)基本上都是用戶響應(yīng)時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素共同造成了性能惡化的結(jié)果,這就需要數(shù)據(jù)庫管理員有比較全面的計算機(jī)知識,能夠敏感地察覺到影響數(shù)據(jù)庫性能的主要原因所在。另外,良好的數(shù)據(jù)庫管理工具對于優(yōu)化數(shù)據(jù)庫性能也是很重要的。

ORACLE數(shù)據(jù)庫性能優(yōu)化工具

常用的數(shù)據(jù)庫性能優(yōu)化工具有:

1、1、ORACLE數(shù)據(jù)庫在線數(shù)據(jù)字典,ORACLE在線數(shù)據(jù)字典能夠反映出ORACLE動態(tài)運行情況,對于調(diào)整數(shù)據(jù)庫性能是很有幫助的。

2、2、操作系統(tǒng)工具,例如UNIX操作系統(tǒng)的vmstat,iostat等命令可以查看到系統(tǒng)系統(tǒng)級內(nèi)存和硬盤I/O的使用情況,這些工具對于管理員弄清出系統(tǒng)瓶頸出現(xiàn)在什么地方有時候很有用。

3、3、SQL語言跟蹤工具(SQL TRACE FACILITY),SQL語言跟蹤工具可以記錄SQL語句的執(zhí)行情況,管理員可以使用虛擬表來調(diào)整實例,使用SQL語句跟蹤文件調(diào)整應(yīng)用程序性能。SQL語言跟蹤工具將結(jié)果輸出成一個操作系統(tǒng)的文件,管理員可以使用TKPROF工具查看這些文件。

4、4、ORACLE Enterprise Manager(OEM),這是一個圖形的用戶管理界面,用戶可以使用它方便地進(jìn)行數(shù)據(jù)庫管理而不必記住復(fù)雜的ORACLE數(shù)據(jù)庫管理的命令。

5、5、EXPLAIN PLAN——SQL語言優(yōu)化命令,使用這個命令可以幫助程序員寫出高效的SQL語言。

ORACLE數(shù)據(jù)庫的系統(tǒng)性能評估

信息系統(tǒng)的類型不同,需要關(guān)注的數(shù)據(jù)庫參數(shù)也是不同的。數(shù)據(jù)庫管理員需要根據(jù)自己的信息系統(tǒng)的類型著重考慮不同的數(shù)據(jù)庫參數(shù)。

1、1、在線事務(wù)處理信息系統(tǒng)(OLTP),這種類型的信息系統(tǒng)一般需要有大量的Insert、Update操作,典型的系統(tǒng)包括民航機(jī)票發(fā)售系統(tǒng)、銀行儲蓄系統(tǒng)等。OLTP系統(tǒng)需要保證數(shù)據(jù)庫的并發(fā)性、可靠性和最終用戶的速度,這類系統(tǒng)使用的ORACLE數(shù)據(jù)庫需要主要考慮下述參數(shù):

l ? ? l ? ? 數(shù)據(jù)庫回滾段是否足夠?

l ? ? l ? ? 是否需要建立ORACLE數(shù)據(jù)庫索引、聚集、散列?

l ? ? l ? ? 系統(tǒng)全局區(qū)(SGA)大小是否足夠?

l ? ? l ? ? SQL語句是否高效?

2、2、數(shù)據(jù)倉庫系統(tǒng)(Data Warehousing),這種信息系統(tǒng)的主要任務(wù)是從ORACLE的海量數(shù)據(jù)中進(jìn)行查詢,得到數(shù)據(jù)之間的某些規(guī)律。數(shù)據(jù)庫管理員需要為這種類型的ORACLE數(shù)據(jù)庫著重考慮下述參數(shù):

l ? ? l ? ? 是否采用B*-索引或者bitmap索引?

l ? ? l ? ? 是否采用并行SQL查詢以提高查詢效率?

l ? ? l ? ? 是否采用PL/SQL函數(shù)編寫存儲過程?

l ? ? l ? ? 有必要的話,需要建立并行數(shù)據(jù)庫提高數(shù)據(jù)庫的查詢效率

SQL語句的調(diào)整原則

SQL語言是一種靈活的語言,相同的功能可以使用不同的語句來實現(xiàn),但是語句的執(zhí)行效率是很不相同的。程序員可以使用EXPLAIN PLAN語句來比較各種實現(xiàn)方案,并選出最優(yōu)的實現(xiàn)方案。總得來講,程序員寫SQL語句需要滿足考慮如下規(guī)則:

1、1、盡量使用索引。試比較下面兩條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 FROM emp WHERE dept.deptno = emp.deptno);

這兩條查詢語句實現(xiàn)的結(jié)果是相同的,但是執(zhí)行語句A的時候,ORACLE會對整個emp表進(jìn)行掃描,沒有使用建立在emp表上的deptno索引,執(zhí)行語句B的時候,由于在子查詢中使用了聯(lián)合查詢,ORACLE只是對emp表進(jìn)行的部分?jǐn)?shù)據(jù)掃描,并利用了deptno列的索引,所以語句B的效率要比語句A的效率高一些。

2、2、選擇聯(lián)合查詢的聯(lián)合次序。考慮下面的例子:

SELECT stuff FROM taba a, tabb b, tabc c

WHERE a.acol between :alow and :ahigh

AND b.bcol between :blow and :bhigh

AND c.ccol between :clow and :chigh

AND a.key1 = b.key1

AMD a.key2 = c.key2;

這個SQL例子中,程序員首先需要選擇要查詢的主表,因為主表要進(jìn)行整個表數(shù)據(jù)的掃描,所以主表應(yīng)該數(shù)據(jù)量最小,所以例子中表A的acol列的范圍應(yīng)該比表B和表C相應(yīng)列的范圍小。

3、3、在子查詢中慎重使用IN或者NOT IN語句,使用where (NOT) exists的效果要好的多。

4、4、慎重使用視圖的聯(lián)合查詢,尤其是比較復(fù)雜的視圖之間的聯(lián)合查詢。一般對視圖的查詢最好都分解為對數(shù)據(jù)表的直接查詢效果要好一些。

5、5、可以在參數(shù)文件中設(shè)置SHARED_POOL_RESERVED_SIZE參數(shù),這個參數(shù)在SGA共享池中保留一個連續(xù)的內(nèi)存空間,連續(xù)的內(nèi)存空間有益于存放大的SQL程序包。

6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經(jīng)常使用的存儲過程“釘”在SQL區(qū)中而不被換出內(nèi)存,程序員對于經(jīng)常使用并且占用內(nèi)存很多的存儲過程“釘”到內(nèi)存中有利于提高最終用戶的響應(yīng)時間。

CPU參數(shù)的調(diào)整

CPU是服務(wù)器的一項重要資源,服務(wù)器良好的工作狀態(tài)是在工作高峰時CPU的使用率在90%以上。如果空閑時間CPU使用率就在90%以上,說明服務(wù)器缺乏CPU資源,如果工作高峰時CPU使用率仍然很低,說明服務(wù)器CPU資源還比較富余。

使用操作相同命令可以看到CPU的使用情況,一般UNIX操作系統(tǒng)的服務(wù)器,可以使用sar –u命令查看CPU的使用率,NT操作系統(tǒng)的服務(wù)器,可以使用NT的性能管理器來查看CPU的使用率。

數(shù)據(jù)庫管理員可以通過查看v$sysstat數(shù)據(jù)字典中“CPU used by this session”統(tǒng)計項得知ORACLE數(shù)據(jù)庫使用的CPU時間,查看“OS User level CPU time”統(tǒng)計項得知操作系統(tǒng)用戶態(tài)下的CPU時間,查看“OS System call CPU time”統(tǒng)計項得知操作系統(tǒng)系統(tǒng)態(tài)下的CPU時間,操作系統(tǒng)總的CPU時間就是用戶態(tài)和系統(tǒng)態(tài)時間之和,如果ORACLE數(shù)據(jù)庫使用的CPU時間占操作系統(tǒng)總的CPU時間90%以上,說明服務(wù)器CPU基本上被ORACLE數(shù)據(jù)庫使用著,這是合理,反之,說明服務(wù)器CPU被其它程序占用過多,ORACLE數(shù)據(jù)庫無法得到更多的CPU時間。

數(shù)據(jù)庫管理員還可以通過查看v$sesstat數(shù)據(jù)字典來獲得當(dāng)前連接ORACLE數(shù)據(jù)庫各個會話占用的CPU時間,從而得知什么會話耗用服務(wù)器CPU比較多。

出現(xiàn)CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。

1、數(shù)據(jù)庫管理員可以執(zhí)行下述語句來查看SQL語句的解析情況:

SELECT * FROM V$SYSSTAT

WHERE NAME IN

('parse time cpu', 'parse time elapsed', 'parse count (hard)');

這里parse time cpu是系統(tǒng)服務(wù)時間,parse time elapsed是響應(yīng)時間,用戶等待時間

waite time = parse time elapsed – parse time cpu

由此可以得到用戶SQL語句平均解析等待時間=waite time / parse count。這個平均等待時間應(yīng)該接近于0,如果平均解析等待時間過長,數(shù)據(jù)庫管理員可以通過下述語句

SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA

ORDER BY PARSE_CALLS;

來發(fā)現(xiàn)是什么SQL語句解析效率比較低。程序員可以優(yōu)化這些語句,或者增加ORACLE參數(shù)SESSION_CACHED_CURSORS的值。

2、數(shù)據(jù)庫管理員還可以通過下述語句:

SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;

查看低效率的SQL語句,優(yōu)化這些語句也有助于提高CPU的利用率。

3、3、數(shù)據(jù)庫管理員可以通過v$system_event數(shù)據(jù)字典中的“l(fā)atch free”統(tǒng)計項查看ORACLE數(shù)據(jù)庫的沖突情況,如果沒有沖突的話,latch free查詢出來沒有結(jié)果。如果沖突太大的話,數(shù)據(jù)庫管理員可以降低spin_count參數(shù)值,來消除高的CPU使用率。

內(nèi)存參數(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、 ?1、 ? 共享池由兩部分構(gòu)成:共享SQL區(qū)和數(shù)據(jù)字典緩沖區(qū),共享SQL區(qū)是存放用戶SQL命令的區(qū)域,數(shù)據(jù)字典緩沖區(qū)存放數(shù)據(jù)庫運行的動態(tài)信息。數(shù)據(jù)庫管理員通過執(zhí)行下述語句:

select (sum(pins - reloads)) / sum(pins) "Lib Cache" ?from v$librarycache;

來查看共享SQL區(qū)的使用率。這個使用率應(yīng)該在90%以上,否則需要增加共享池的大小。數(shù)據(jù)庫管理員還可以執(zhí)行下述語句:

select (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache;

查看數(shù)據(jù)字典緩沖區(qū)的使用率,這個使用率也應(yīng)該在90%以上,否則需要增加共享池的大小。

2、 ?2、 ? 數(shù)據(jù)緩沖區(qū)。數(shù)據(jù)庫管理員可以通過下述語句:

SELECT name, value ?FROM v$sysstat ?WHERE name IN ('db block gets', 'consistent gets','physical reads');

來查看數(shù)據(jù)庫數(shù)據(jù)緩沖區(qū)的使用情況。查詢出來的結(jié)果可以計算出來數(shù)據(jù)緩沖區(qū)的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。

這個命中率應(yīng)該在90%以上,否則需要增加數(shù)據(jù)緩沖區(qū)的大小。

3、 ?3、 ? 日志緩沖區(qū)。數(shù)據(jù)庫管理員可以通過執(zhí)行下述語句:

select name,value from v$sysstat where name in ('redo entries','redo log space requests');查看日志緩沖區(qū)的使用情況。查詢出的結(jié)果可以計算出日志緩沖區(qū)的申請失敗率:

申請失敗率=requests/entries,申請失敗率應(yīng)該接近于0,否則說明日志緩沖區(qū)開設(shè)太小,需要增加ORACLE數(shù)據(jù)庫的日志緩沖區(qū)。

如何提高oracle模糊查詢的性能?

1、使用兩邊加‘%’號的查詢,Oracle是不通過索引的,所以查詢效率很低。

例如:select count(*) from lui_user_base t where t.user_name like '%cs%';

2、like '...%'和 like'%...'雖然走了索引,但是效率依然很低。

3、有人說使用如下sql,他的效率提高了10倍,但是數(shù)據(jù)量小的時候

select count(*) from lui_user_base where rowid in (select rowid from lui_user_base t where t.user_name like '%cs%')

我拿100w跳數(shù)據(jù)做了測試,效果一般,依然很慢,原因:

select rowid from lui_user_base t where t.user_name like '%cs%' ? 這條sql執(zhí)行很快,那是相當(dāng)?shù)目欤欠诺絪elect count(*) from lui_user_base where rowid in()里后,效率就會變的很慢了。

4、select count(*) from lui_user_base t where instr(t.user_name,'cs') 0

這種查詢效果很好,速度很快,推薦使用這種。因為我對oracle內(nèi)部機(jī)制不是很懂,只是對結(jié)果做了一個說明。

5、有人說了用全文索引,我看了,步驟挺麻煩,但是是個不錯的方法,留著備用:

對cmng_custominfo 表中的address字段做全文檢索:

1,在oracle9201中需要創(chuàng)建一個分詞的東西:

BEGIN

ctx_ddl.create_preference ('SMS_ADDRESS_LEXER', 'CHINESE_LEXER');

--ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); 不用

end;

2,創(chuàng)建全文檢索:

CREATE INDEX INX_CUSTOMINFO_ADDR_DOCS ON cmng_custominfo(address) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER SMS_ADDRESS_LEXER');

3,查詢時候,使用:

select * from cmng_custominfo where contains (address, '金色新城')1;

4,需要定期進(jìn)行同步和優(yōu)化:

同步:根據(jù)新增記錄的文本內(nèi)容更新全文搜索的索引。

begin

ctx_ddl.sync_index('INX_CUSTOMINFO_ADDR_DOCS');

end;

優(yōu)化:根據(jù)被刪除記錄清除全文搜索索引中的垃圾

begin

ctx_ddl.optimize_index('INX_CUSTOMINFO_ADDR_DOCS', 'FAST');

end;

5,采用job做步驟4中的工作:

1)該功能需要利用oracle的JOB功能來完成

因為oracle9I默認(rèn)不啟用JOB功能,所以首先需要增加ORACLE數(shù)據(jù)庫實例的JOB配置參數(shù):

job_queue_processes=5

重新啟動oracle數(shù)據(jù)庫服務(wù)和listener服務(wù)。

2)同步 和 優(yōu)化

--同步 sync:

variable jobno number;

BEGIN

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''INX_CUSTOMINFO_ADDR_DOCS'');',

SYSDATE, 'SYSDATE + (1/24/4)');

commit;

END;

--優(yōu)化

variable jobno number;

begin

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''INX_CUSTOMINFO_ADDR_DOCS'',''FULL'');', SYSDATE, 'SYSDATE + 1');

commit;

END;

其中, 第一個job的SYSDATE + (1/24/4)是指每隔15分鐘同步一次,第二個job的SYSDATE + 1是每隔1天做一次全優(yōu)化。具體的時間間隔,可以根據(jù)應(yīng)用的需要而定。

6,索引重建

重建索引會刪除原來的索引,重新生成索引,需要較長的時間。

重建索引語法如下:

ALTER INDEX INX_CUSTOMINFO_ADDR_DOCS REBUILD;

據(jù)網(wǎng)上一些用家的體會,oracle重建索引的速度也是比較快的,有一用家這樣描述:

Oracle 的全文檢索建立和維護(hù)索引要比ms sql server都要快得多,筆者的65萬記錄的一個表建立索引只需要20分鐘,同步一次只需要1分鐘。

因此,也可以考慮用job的辦法定期重建索引。

如何檢查oracle數(shù)據(jù)庫性能

這種問題要回答好要求知識比較全面。

1 從操作系統(tǒng)層次上看

看CPU 內(nèi)存 swqp(交換分區(qū))等使用率

2 從磁盤上看

主要看磁盤讀寫。可以用dd測磁盤讀寫的速度 也可以在業(yè)務(wù)高峰期檢測磁盤的速率。

3 從數(shù)據(jù)庫本身來看。

先要看數(shù)據(jù)庫各個參數(shù)的值 。 如sga的大小,process的大小,redo日志的個數(shù)與大小等這些關(guān)系到性能的參數(shù)是否設(shè)置合理。

長期觀察的方式就是看各個時期的AWR報告。里面有各種性能指標(biāo),以及按執(zhí)行時間或資源排列的sql ,以及各種等待時間的排名。從這里面可以掌握數(shù)據(jù)庫的長期的性能變化。

即時觀察的方式就是利用各種sql 查詢 數(shù)據(jù)庫在當(dāng)前時間的各個性能指標(biāo)(AWR報告里面的各種指標(biāo)也都是通過sql查詢出來的)

還有對數(shù)據(jù)庫整體的一個檢查:

如 表的大小,表是否需要分區(qū)而沒有分區(qū),索引是否創(chuàng)建,索引是否失效,開發(fā)人員寫的sql是否正確使用到了索引,頻繁使用的sql是否有綁定變量,有頻繁大批量增刪改的表是否存在高水位。。。

額 總之,這個話題涉及的知識非常多,盡可能多的學(xué)習(xí)一些東西,祝你好運。

如何分析Oracle

以oracle表分析為例:

drop table test;

select count(*) from test;

--創(chuàng)建測試表

create table test

(

id number(9),

nick varchar2(30)

);

--插入測試數(shù)據(jù)

begin

for i in 1..100000 loop

insert into test(id) values(i);

end loop;

commit;

end;

select * from test;

--更新nick字段,使數(shù)據(jù)發(fā)生嚴(yán)重傾斜

update test set nick='abc' where rownum99999;

--創(chuàng)建索引

create index idx_test_nick on test(nick);

update test set nick='def' where nick is null;

--只對索引進(jìn)行分析

analyze index idx_test_nick compute statistics;

select * from user_indexes;

--查看索引名,對應(yīng)存儲的數(shù)據(jù)塊,不同的key數(shù)量,記錄數(shù)(行數(shù))的分析信息

select index_name, LEAF_BLOCKS, DISTINCT_KEYS, NUM_ROWS

from user_indexes

where index_name = 'IDX_TEST_NICK';

--dba_tab_col_statistics

--查看表的統(tǒng)計信息

select COLUMN_NAME, NUM_BUCKETS, num_distinct

from USER_tab_columns

where table_name = 'TEST';

select * from test where nick ='abc';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)

select * from test where nick ='def';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)

--由上可以看到,對索引分析之后,sql的執(zhí)行路徑都是基于規(guī)則的,索引的字段的偏移

--先根據(jù)索引找到rowid,然后再根據(jù)rowid讀取記錄,這個過程肯定比全表掃描讀取記錄要慢

--user_part_col_statistics 分區(qū)分析信息

--分析表的第二列nick

analyze table test compute statistics for columns size 2 nick;

select * from test where nick ='abc';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)

--根據(jù)上面的執(zhí)行計劃,還是按照規(guī)則來執(zhí)行的

--分析表

analyze table test compute statistics for table;

select * from test where nick ='abc';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=

1499970)

1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14

99970)

--分析表之后,完全按照成本來執(zhí)行

--刪除所有的統(tǒng)計數(shù)據(jù),并只對表與列進(jìn)行分析,不分析索引,

--ORACLE使用CBO的優(yōu)化器,并產(chǎn)生了正確的執(zhí)行計劃

analyze table test delete statistics;

--分析列nick

analyze table test compute statistics for table for columns size 2 nick;

select * from test where nick ='abc';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=

1499970)

1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14

99970)

--

select * from test where nick ='def';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=30)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=2 Byt

es=30)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost

=1 Card=2)

--創(chuàng)建TEST表ID列上的索引,但不對索引進(jìn)行分析

create index idx_test_id on test(id);

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15

000)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000

Bytes=15000)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1

Card=400)

--當(dāng)條件中即有id,又有nick時,因為nick上有直方圖,ORACLE知道nick='abc'的值特別的多,所以不走IDX_TEST_NICK索引,走IDX_TEST_ID上的索引

select * from test where id=5 and nick='abc';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15

000)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000

Bytes=15000)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1

Card=400)

--當(dāng)條件中即有id,又有nick時,因為nick上有直方圖,ORACLE知道nick='def'的值特別的少,所以走IDX_TEST_NICK上的索引,不走IDX_TEST_ID索引

select * from test where id=5 and nick='def';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt

es=15)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost

=1 Card=2)

select * from test where nick='def' and id=5;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt

es=15)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost

=1 Card=2)

--在分析ID列后,ORACLE發(fā)現(xiàn)ID列的選擇度更高,所以不再選擇IDX_TEST_NICK索引,而是選擇IDX_TEST_ID

analyze table test compute statistics for columns size 1 id;

select * from test where id=5 and nick='def';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=7)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt

es=7)

2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1

Card=1)

/*

下面來看另外一種情況,我們刪除所有的統(tǒng)計數(shù)據(jù),然后在ID列上創(chuàng)建唯一索引,在此條件下,

只分析表與分析列nick,我們看到ORACLE走了正確的執(zhí)行計劃,

走了UK_TEST_ID,其實從這里也給我們帶來很多的啟示:

在主鍵與唯一鍵約束的列上是否需要直方圖的問題?

如果在這些列上有像這樣的查詢where id 100 and id 1000,

我們還是需要有直方圖的,但除此之外,好像真的沒有直方圖的必要了!

*/

analyze table test delete statistics;

drop index idx_test_id;

create unique index uk_test_id on test(id);

--分析表的第二列nick

analyze table test compute statistics for table for columns size 2 nick;

select * from test where id=5 and nick='def';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt

es=15)

2 1 INDEX (UNIQUE SCAN) OF 'UK_TEST_ID' (UNIQUE) (Cost=1 Car

d=100000)

從以上一系列的實驗可以看出,對ORACLE的優(yōu)化器CBO來說,表的分析與列的分析才是最重要的,索引的分析次之。還有我們可以考慮我們的哪些列上需要直方圖,對于bucket的個數(shù)問題,oracle的默認(rèn)值是75個,所以根據(jù)你的應(yīng)用規(guī)則,選擇合適的桶數(shù)對性能也是有幫助的。因為不必要的桶的個數(shù)的大量增加,必然會帶來SQL語句硬解析時產(chǎn)生執(zhí)行計劃的復(fù)雜度問題。

如何查詢oracle 數(shù)據(jù)庫性能,sql資源占用

作為一個開發(fā)/測試人員,或多或少都得和數(shù)據(jù)庫打交道,而對數(shù)據(jù)庫的操作歸根到底都是SQL語句,所有操作到最后都是操作數(shù)據(jù),那么對sql性能的掌控又成了我們工作中一件非常重要的工作。下面簡單介紹下一些查看oracle性能的一些實用方法:

1、查詢每臺機(jī)器的連接數(shù)

select?t.MACHINE,count(*)?from?v$session?t?group?by?t.MACHINE

這里所說的每臺機(jī)器是指每個連接oracle數(shù)據(jù)庫的服務(wù)器,每個服務(wù)器都有配置連接數(shù)據(jù)庫的連接數(shù),以websphere為例,在數(shù)據(jù)源中,每個數(shù)據(jù)源都有配置其最大/最小連接數(shù)。

執(zhí)行SQL后,可以看到每個服務(wù)器連接oracle數(shù)據(jù)庫的連接數(shù),若某個服務(wù)器的連接數(shù)非常大,或者已經(jīng)達(dá)到其最大連接數(shù),那么這臺服務(wù)器上的應(yīng)用可能有問題導(dǎo)致其連接不能正常釋放。

2、查詢每個連接數(shù)的sql_text

v$session表里存在的連接不是一直都在執(zhí)行操作,如果sql_hash_value為空或者0,則該連接是空閑的,可以查詢哪些連接非空閑,?web3?是機(jī)器名,就是WebSphere?Application?Server?的主機(jī)名。

select?t.sql_hash_value,t.*??from?v$session?t?where?t.MACHINE='web3'?and?t.sql_hash_value!=0

這個SQL查詢出來的結(jié)果不能看到具體的SQL語句,需要看具體SQL語句的執(zhí)行下面的方法。

3、查詢每個活動的連接執(zhí)行什么sql

select?sid,username,sql_hash_value,b.sql_text

from?v$session?a,v$sqltext?b

where?a.sql_hash_value?=?b.HASH_VALUE?and?a.MACHINE='web3'

order?by?sid,username,sql_hash_value,b.piece

order?by這句話的作用在于,sql_text每條記錄不是保存一個完整的sql,需要以sql_hash_value為關(guān)鍵id,以piece排序,如圖

Username是執(zhí)行SQL的數(shù)據(jù)庫用戶名,一個sql_hash_value下的SQL_TEXT組合成一個完整的SQL語句。這樣就可以看到一個連接執(zhí)行了哪些SQL。

4、.從V$SQLAREA中查詢最占用資源的查詢

select?b.username?username,a.disk_reads?reads,?a.executions?exec,

a.disk_reads/decode(a.executions,0,1,a.executions)?rds_exec_ratio,

a.sql_text?Statement

from??v$sqlarea?a,dba_users?b

where?a.parsing_user_id=b.user_id

and?a.disk_reads??100000

order?by?a.disk_reads?desc;

用buffer_gets列來替換disk_reads列可以得到占用最多內(nèi)存的sql語句的相關(guān)信息。

V$SQL是內(nèi)存共享SQL區(qū)域中已經(jīng)解析的SQL語句。

該表在SQL性能查看操作中用的比較頻繁的一張表,關(guān)于這個表的詳細(xì)信息大家可以去?上學(xué)習(xí),介紹得比較詳細(xì)。我這里主要就將該表的常用幾個操作簡單介紹一下:

1、列出使用頻率最高的5個查詢:

select?sql_text,executions

from?(select?sql_text,executions,

rank()?over

(order?by?executions?desc)?exec_rank

from?v$sql)

where?exec_rank?=5;

該查詢結(jié)果列出的是執(zhí)行最頻繁的5個SQL語句。對于這種實用非常頻繁的SQL語句,我們需要對其進(jìn)行持續(xù)的優(yōu)化以達(dá)到最佳執(zhí)行性能。

2、找出需要大量緩沖讀取(邏輯讀)操作的查詢:

select?buffer_gets,sql_text

from?(select?sql_text,buffer_gets,

dense_rank()?over

(order?by?buffer_gets?desc)?buffer_gets_rank

from?v$sql)

where?buffer_gets_rank=5;

這種需要大量緩沖讀取(邏輯讀)操作的SQL基本是大數(shù)據(jù)量且邏輯復(fù)雜的查詢中會遇到,對于這樣的大數(shù)據(jù)量查詢SQL語句更加需要持續(xù)的關(guān)注,并進(jìn)行優(yōu)化。

3、持續(xù)跟蹤有性能影響的SQL。

SELECT?*?FROM?(

SELECT?PARSING_USER_ID,EXECUTIONS,SORTS,

COMMAND_TYPE,DISK_READS,sql_text?FROM?v$sqlarea

ORDER?BY?disk_reads?DESC

)

WHERE?ROWNUM10

這個語句在SQL性能查看中用的比較多,可以明顯的看出哪些SQL會影響到數(shù)據(jù)庫性能。

本文主要介紹了使用SQL查詢方式查看oracle數(shù)據(jù)庫SQL性能的部分常用方法。此外還有許多工具也能實現(xiàn)SQL性能監(jiān)控,大家可以在網(wǎng)上搜索相關(guān)知識進(jìn)行學(xué)習(xí)。

轉(zhuǎn)載僅供參考,版權(quán)屬于原作者

標(biāo)題名稱:oracle如何分析性能,高性能oracle
網(wǎng)頁鏈接:http://m.newbst.com/article16/dssijdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站網(wǎng)站建設(shè)虛擬主機(jī)建站公司網(wǎng)站內(nèi)鏈網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)