1. oracle怎麼優化
oracle優化方法如下:
去掉不必要的大型表的全表掃描。緩存小型表的全表掃描。檢驗優化索引的使用。檢驗優化的連接技術。盡可能減少執行計劃的Cost,在含有子查詢的SQL語句中,要特別注意減少對表的查詢。
2. oracle資料庫優化有哪些方法
你最好買一本專門講ORACLE性能優化的書,好好看看\x0d\x0a1、調整資料庫伺服器的性能\x0d\x0aOracle資料庫伺服器是整個系統的核心,它的性能高低直接影響整個系統的性能,為了調整Oracle資料庫伺服器的性能,主要從以下幾個方面考慮: \x0d\x0a1.1、調整操作系統以適合Oracle資料庫伺服器運行\x0d\x0aOracle資料庫伺服器很大程度上依賴於運行伺服器的操作系統,如果操作系統不能提供最好性能,那麼無論如何調整,Oracle資料庫伺服器也無法發揮其應有的性能。 \x0d\x0a1.1.1、為Oracle資料庫伺服器規劃系統資源 \x0d\x0a據已有計算機可用資源, 規劃分配給Oracle伺服器資源原則是:盡可能使Oracle伺服器使用資源最大化,特別在Client/Server中盡量讓伺服器上所有資源都來運行Oracle服務。 \x0d\x0a1.1.2、調整計算機系統中的內存配置 \x0d\x0a多數操作系統都用虛存來模擬計算機上更大的內存,它實際上是硬碟上的一定的磁碟空間。當實際的內存空間不能滿足應用軟體的要求時,操作系統就將用這部分的磁碟空間對內存中的信息進行頁面替換,這將引起大量的磁碟I/O操作,使整個伺服器的性能下降。為了避免過多地使用虛存,應加大計算機的內存。 \x0d\x0a1.1.3、為Oracle資料庫伺服器設置操作系統進程優先順序 \x0d\x0a不要在操作系統中調整Oracle進程的優先順序,因為在Oracle資料庫系統中,所有的後台和前台資料庫伺服器進程執行的是同等重要的工作,需要同等的優先順序。所以在安裝時,讓所有的資料庫伺服器進程都使用預設的優先順序運行。 \x0d\x0a1.2、調整內存分配\x0d\x0aOracle資料庫伺服器保留3個基本的內存高速緩存,分別對應3種不同類型的數據:庫高速緩存,字典高速緩存和緩沖區高速緩存。庫高速緩存和字典高速緩存一起構成共享池,共享池再加上緩沖區高速緩存便構成了系統全程區(SGA)。SGA是對資料庫數據進行快速訪問的一個系統全程區,若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數據的目的,因此應把SGA放在主存中,不要放在虛擬內存中。內存的調整主要是指調整組成SGA的內存結構的大小來提高系統性能,由於Oracle資料庫伺服器的內存結構需求與應用密切相關,所以內存結構的調整應在磁碟I/O調整之前進行。 \x0d\x0a1.2.1、庫緩沖區的調整 \x0d\x0a庫緩沖區中包含私用和共享SQL和PL/SQL區,通過比較庫緩沖區的命中率決定它的大小。要調整庫緩沖區,必須首先了解該庫緩沖區的活動情況,庫緩沖區的活動統計信息保留在動態性能表v$librarycache數據字典中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache; \x0d\x0a \x0d\x0aPins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數;Reloads列給出SQL 和PL/SQL塊的隱式分析或對象定義重裝載時在庫程序緩沖區中發生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區的命中率合適;若sum(pins)/sum(reloads)>1, 則需調整初始化參數 shared_pool_size來重新調整分配給共享池的內存量。 \x0d\x0a1.2.2、數據字典緩沖區的調整 \x0d\x0a數據字典緩沖區包含了有關資料庫的結構、用戶、實體信息。數據字典的命中率,對系統性能影響極大。數據字典緩沖區的使用情況記錄在動態性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache; \x0d\x0a \x0d\x0aGets列是對相應項請求次數的統計;Getmisses 列是引起緩沖區出錯的數據的請求次數。對於頻繁訪問的數據字典緩沖區,sum(getmisses)/sum(gets)<10%~15%。若大於此百分數,則應考慮增加數據字典緩沖區的容量,即需調整初始化參數shared_pool_size來重新調整分配給共享池的內存量。 \x0d\x0a1.2.3、緩沖區高速緩存的調整 \x0d\x0a用戶進程所存取的所有數據都是經過緩沖區高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動態性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調整。 \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的值是請求數據緩沖區中讀的總次數。physical reads的值是請求數據時引起從盤中讀文件的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\x0a \x0d\x0a如果Hit Ratio<60%~70%,則應增大db_block_buffers的參數值。db_block_buffers可以調整分配給緩沖區高速緩存的內存量,即db_block_buffers可設置分配緩沖區高速緩存的數據塊的個數。緩沖區高速緩存的總位元組數=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數據塊大小的位元組數,可查詢 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size'; \x0d\x0a \x0d\x0a在修改了上述資料庫的初始化參數以後,必須先關閉資料庫,在重新啟動資料庫後才能使新的設置起作用。
3. 九大Oracle性能優化基本方法詳解
Oracle性能優化基本方法包括一下幾個步驟 包括
)設立合理的Oracle性能優化目標
)測量並記錄當前的Oracle性能
)確定當前Oracle性能瓶頸(Oracle等待什麼 哪些SQL語句是該等待事件的成分)
)把等待事件記入跟蹤文件
)確定當前的OS瓶頸
)優化所需的成分(應用程序 資料庫 I/O 爭用 OS等)
)跟蹤並實施更改控制過程
)測量並記錄當前性能
)重復步驟 到 直到滿足優化目標
下面來一一詳述
設立合理的Oracle性能優化目標
重點 關於設立目標的最重要的一點是它們必須是可量化和可達到的
方法 目標必須是當前性能和所需性能的的陳述形式的語句
測量並記錄當前Oracle性能重點
)需要在峰值活動時間獲得當前系統性能快照
)關鍵是要在出現性能問題的時間段內採集信息
)必須在合理的時間段上採集 一般在峰值期間照幾個為期 分鍾的快照
確定當前Oracle性能瓶頸重點 從Oracle 等待介面v$system_event v$session_event和v$session_wait中獲得等待事件 進而找出影響性能的對象和sql語句 方法如下
)首先 利用v$system_event視圖執行下面的查詢查看資料庫中某些常見的等待事件
select * from v$system_event
where event in ( buffer busy waits
db file sequential read
db file scattered read
enqueue
free buffer waits
latch free
log file parallel write
log file sync );
)接著 利用下面對v$session_event和v$session視圖進行的查詢 研究具有對上面顯示的內容有貢獻的等待事件的會話
select se sid s username se event se total_waits se time_waited se average_wait
from v$session s v$session_event se
where s sid = se sid
and se event not like SQL*Net%
and s status = ACTIVE
and s username is not null;
)使用下面查詢找到與所連接的會話有關的當前等待事件 這些信息是動態的 為了查看一個會話的等待最多的事件是什麼 需要多次執行此查詢
select sw sid s username sw event sw wait_time sw state sw seconds_in_wait SEC_IN_WAIT
from v$session s v$session_wait sw
where s sid = sw sid
and sw event not like SQL*Net%
and s username is not null
order by sw wait_time desc;
)查詢會話等待事件的詳細信息
select sid event p text p p text p p text p
from v$session_wait
where sid beeen & and &
and event not like %SQL%
and event not like %rdbms% ;
)利用P P 的信息 找出等待事件的相關的段
select owner segment_name segment_type tablespace_name
from dba_extents
where file_id = &fileid_in
and &blockid_in beeen block_id and block_id + blocks ;
)獲得操作該段的sql語句
select sid getsqltxt(sql_hash_value sql_address)
from v$session
where sid = &sid_in;
)getsqltxt函數
)至此已經找到影響性能的對象和sql語句 可以有針對性地優化
把等待事件記入跟蹤文件
重點 如果在跟蹤系統上的等待事件時 由於某種原因遇到了麻煩 則可以將這些等待事件記入一個跟蹤文件 方法如下
)對於當前會話
alter session set timed_statistics=true;
alter session set max_mp_file_size=unlimited;
alter session set events trace name context forever level ;
)執行應用程序 然後在USER_DUMP_DEST指出的目錄中找到跟蹤文件
)查看文件中以詞WAIT開始的所有行
)對於其它的會話
)確定會話的進程ID(SPID) 下面的查詢識別出名稱以A開始的所有用戶的會話進程ID
select S Username P Spid from V$SESSION S V$PROCESS P
where S PADDR = P ADDR and S Username like A% ;
)以sysdba進入sqlplus執行
alter session set timed_statistics=true;
alter session set max_mp_file_size=unlimited;
oradebug setospid
oradebug unlimit
oradebug event trace name context forever level X /* Where X = ( ) */
)跟蹤某個時間間隔得會話應用程序
)在USER_DUMP_DEST 的值指出的目錄中利用SPID查看跟蹤文件
)查看文件中以詞WAIT開始的所有行
確定當前OS瓶頸 )Windows NT上的監控
使用控制面板 〉管理工具 〉性能即可
)UNIX上的監控
使用通用性的工具 包括sar iostat cpustat mpstat netstat top osview等
.Oracle性能優化所需的成分(應用程序 資料庫 I/O 爭用 OS等)
.跟蹤並實施更改控制過程
.測量並記錄當前Oracle性能
lishixin/Article/program/Oracle/201311/18709
4. 優化資料庫大幅度提高Oracle的性能
幾個簡單的步驟大幅提高Oracle性能 我優化資料庫的三板斧
資料庫優化的討論可以說是一個永恆的主題 資深的Oracle優化人員通常會要求提出性能問題的人對資料庫做一個statspack 貼出資料庫配置等等 還有的人認為要抓出執行最慢的語句來進行優化 但實際情況是 提出疑問的人很可能根本不懂執行計劃 更不要說statspack了 而我認為 資料庫優化 應該首先從大的方面考慮 網路 伺服器硬體配置 操作系統配置 Oracle伺服器配置 數據結構組織 然後才是具體的調整 實際上網路 硬體等往往無法決定更換 應用程序一般也無法修改 因此應該著重從資料庫配置 數據結構上來下手 首先讓資料庫有一個良好的配置 然後再考慮具體優化某些過慢的語句 我在給我的用戶系統進行優化的過程中 總結了一些基本的 簡單易行的辦法來優化資料庫 算是我的三板斧 呵呵 不過請注意 這些不一定普遍使用 甚至有的會有副作用 但是對OLTP系統 基於成本的資料庫往往行之有效 不妨試試 (注 附件是Burleson寫的用來報告資料庫性能等信息的腳本 本文用到)
一.設置合適的SGA
常常有人抱怨伺服器硬體很好 但是Oracle就是很慢 很可能是內存分配不合理造成的 ( )假設內存有 M 這通常是小型應用 建議Oracle的SGA大約 M 其中 共享池(SHARED_POOL_SIZE)可以設置 M到 M 根據實際的用戶數 查詢等來定 數據塊緩沖區可以大致分配 M M i下需要設置DB_BLOCK_BUFFERS DB_BLOCK_BUFFER*DB_BLOCK_SIZE等於數據塊緩沖區大小 i 下的數據緩沖區可以用db_cache_size來直接分配
( )假設內存有 G Oracle 的SGA可以考慮分配 M 共享池分配 M到 M 數據緩沖區分配 M到 M
( )內存 G SGA可以考慮分配 G 共享池 M到 M 剩下的給數據塊緩沖區
( )內存 G以上 共享池 M到 M就足夠啦 再多也沒有太大幫助 (Biti_rainy有專述)數據緩沖區是盡可能的大 但是一定要注意兩個問題 一是要給操作系統和其他應用留夠內存 二是對於 位的操作系統 Oracle的SGA有 G的限制 有的 位操作系統上可以突破這個限制 方法還請看Biti的大作吧
二.分析表和索引 更改優化模式
Oracle默認優化模式是CHOOSE 在這種情況下 如果表沒有經過分析 經常導致查詢使用全表掃描 而不使用索引 這通常導致磁碟I/O太多 而導致查詢很慢 如果沒有使用執行計劃穩定性 則應該把表和索引都分析一下 這樣可能直接會使查詢速度大幅提升 分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令 對於少於 萬的表 可以考慮分析整個表 對於很大的表 可以按百分比來分析 但是百分比不能過低 否則生成的統計信息可能不準確 可以通過DBA_TABLES的LAST_ANALYZED列來查看錶是否經過分析或分析時間 索引可以通過DBA_INDEXES的LAST_ANALYZED列
下面通過例子來說明分析前後的速度對比 (表CASE_GA_AJZLZ大約有 萬數據 有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能 (第一次要執行RDBMSADMINutlxplan sql來創建PLAN_TABLE這個表)
SQL> SET AUTOTRACE ON SQL>SET TIMING ON
通過SET AUTOTRACE ON 來查看語句的執行計劃 通過SET TIMING ON 來查看語句運行時間
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=CHOOSE SORT (AGGREGATE) TABLE ACCESS (FULL) OF CASE_GA_AJZLZ ……………………
請注意上面分析中的TABLE ACCESS(FULL) 這說明該語句執行了全表掃描 而且查詢使用了 秒 這時表還沒有經過分析 下面我們來對該表進行分析
SQL> *** yze table CASE_GA_AJZLZ pute statistics;
表已分析 已用時間: : : 然後再來查詢
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=FIRST_ROWS (Cost= Card= ) SORT (AGGREGATE) INDEX (FAST FULL SCAN) OF PK_AJZLZ (UNIQUE) (Cost= Card= ) …………………………
請注意 這次時間僅僅用了 秒!這要歸功於INDEX(FAST FULL SCAN) 通過分析表 查詢使用了PK_AJZLZ索引 磁碟I/O大幅減少 速度也大幅提升!下面的實用語句可以
用來生成分析某個用戶的所有表和索引 假設用戶是GAXZUSR
SQL> set pagesize SQL> spool d: *** yze_tables sql; SQL> select *** yze table ||owner|| ||table_name|| pute statistics; from dba_tables where owner= GAXZUSR ; SQL> spool off SQL> spool spool d: *** yze_indexes sql; SQL> select *** yze index ||owner|| ||index_name|| pute statistics; from dba_indexes where owner= GAXZUSR ; SQL> spool off SQL> @d: *** yze_tables sql SQL> @d: *** yze_indexes sql
解釋 上面的語句生成了兩個sql文件 分別分析全部的GAXZUSR的表和索引 如果需要按照百分比來分析表 可以修改一下腳本 通過上面的步驟 我們就完成了對表和索引的分析 可以測試一下速度的改進啦 建議定期運行上面的語句 尤其是數據經過大量更新
當然 也可以通過dbms_stats來分析表和索引 更方便一些 但是我仍然習慣上面的方法 因為成功與否會直接提示出來
另外 我們可以將優化模式進行修改 optimizer_mode值可以是RULE CHOOSE FIRST_ROWS和ALL_ROWS 對於OLTP系統 可以改成FIRST_ROWS 來要求查詢盡快返回結果 這樣即使不用分析 在一般情況下也可以提高查詢性能 但是表和索引經過分析後有助於找到最合適的執行計劃
三.設置cursor_sharing=FORCE 或SIMILAR
這種方法是 i才開始有的 oracle 不支持 通過設置該參數 可以強制共享只有文字不同的語句解釋計劃 例如下面兩條語句可以共享
SQL> SELECT * FROM MYTABLE WHERE NAME= tom SQL> SELECT * FROM MYTABLE WHERE NAME= turner
這個方法可以大幅降低緩沖區利用率低的問題 避免語句重新解釋 通過這個功能 可以很大程度上解決硬解析帶來的性能下降的問題 個人感覺可根據系統的實際情況 決定是否將該參數改成FORCE 該參數默認是exact 不過一定要注意 修改之前 必須先給ORACLE打補丁 否則改之後oracle會佔用 %的CPU 無法使用 對於ORACLE i 可以設置成SIMILAR 這個設置綜合了FORCE和EXACT的優點 不過請慎用這個功能 這個參數也可能帶來很大的負面影響!
四.將常用的小表 索引釘在數據緩存KEEP池中
內存上數據讀取速度遠遠比硬碟中讀取要快 據稱 內存中數據讀的速度是硬碟的 倍!如果資源比較豐富 把常用的小的 而且經常進行全表掃描的表給釘內存中 當然是在好不過了 可以簡單的通過ALTER TABLE tablename CACHE來實現 在ORACLE i之後可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP) 一般來說 可以考慮把 數據塊之內的表放在keep池中 當然要根據內存大小等因素來定 關於如何查出那些表或索引符合條件 可以使用本文提供的access sql和access_report sql 這兩個腳本是著名的Oracle專家 Burleson寫的 你也可以在讀懂了情況下根據實際情況調整一下腳本 對於索引 可以通過ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)來釘在KEEP池中
將表定在KEEP池中需要做一些准備工作 對於ORACLE i 需要設置DB_KEEP_CACHE_SIZE 對於 i 需要設置buffer_pool_keep 在 i中 還要修改db_block_lru_latches 該參數默認是 無法使用buffer_pool_keep 該參數應該比 * *CPU數量少 但是要大於 才能設置DB_KEEP_CACHE_BUFFER buffer_pool_keep從db_block_buffers中分配 因此也要小於db_block_buffers 設置好這些參數後 就可以把常用對象永久釘在內存里
五.設置optimizer_max_permutations
對於多表連接查詢 如果採用基於成本優化(CBO) ORACLE會計算出很多種運行方案
從中選擇出最優方案 這個參數就是設置oracle究竟從多少種方案來選擇最優 如果設置太大 那麼計算最優方案過程也是時間比較長的 Oracle 和 i默認是 建議改成 對於 i 已經默認是 了
六.調整排序參數
( ) SORT_AREA_SIZE:默認的用來排序的SORT_AREA_SIZE大小是 K 通常顯得有點小 一般可以考慮設置成 M( ) 這個參數不能設置過大 因為每個連接都要分配同樣的排序內存
lishixin/Article/program/Oracle/201311/18879