任何事情都有它的源頭
要解決問題
也得從源頭開始
影響ORACLE性能的源頭非常多
主要包括如下方面
數據庫的硬件配置CPU內存網絡條件 CPU
在任何機器中CPU的數據處理能力往往是衡量計算機性能的一個標志
並且ORACLE是一個提供並行能力的數據庫系統
在CPU方面的要求就更高了
如果運行隊列數目超過了CPU處理的數目
性能就會下降
我們要解決的問題就是要適當增加CPU的數量了
當然我們還可以將需要許多資源的進程KILL掉
內存
衡量機器性能的另外一個指標就是內存的多少了
在ORACLE中內存和我們在建數據庫中的交換區進行數據的交換
讀數據時
磁盤I/O必須等待物理I/O操作完成
在出現ORACLE的內存瓶頸時
我們第一個要考慮的是增加內存
由於I/O的響應時間是影響ORACLE性能的主要參數
我將在這方面進行詳細的講解
網絡條件
NET*SQL負責數據在網絡上的來往
大量的SQL會令網絡速度變慢
比如
M的網卡和
的網卡就對NET*SQL有非常明顯的影響
還有交換機
集線器等等網絡設備的性能對網絡的影響很明顯
建議在任何網絡中不要試圖用
個集線器來將網段互聯
OS參數的設置 下表給出了OS的參數設置及說明
DBA可以根據實際需要對這些參數進行設置
用戶SQL質量 以上講的都是硬件方面的東西
在條件有限的條件下
我們可以調整應用程序的SQL質量
不要進行全表掃描(Full Table Scan)
全表掃描導致大量的I/O
盡量建好和使用好索引
建索引也是有講究的
在建索引時
也不是索引越多越好
當一個表的索引達到
個以上時
ORACLE的性能可能還是改善不了
因為OLTP系統每表超過
個索引即會降低性能
而且在一個sql 中
Oracle 從不能使用超過
個索引
當我們用到GROUP BY和ORDER BY時
ORACLE就會自動對數據進行排序
而ORACLE在INIT
ORA中決定了sort_area_size區的大小
當排序不能在我們給定的排序區完成時
ORACLE就會在磁盤中進行排序
也就是我們講的臨時表空間中排序
過多的磁盤排序將會令 free buffer waits 的值變高
而這個區間並不只是用於排序的
對於開發人員我提出如下忠告:
)
select
update
delete 語句中的子查詢應當有規律地查找少於
%的表行
如果一個語句查找的行數超過總行數的
%
它將不能通過使用索引獲得性能上的提高
)
索引可能產生碎片
因為記錄從表中刪除時
相應也從表的索引中刪除
表釋放的空間可以再用
而索引釋放的空間卻不能再用
頻繁進行刪除操作的被索引的表
應當階段性地重建索引
以避免在索引中造成空間碎片
影響性能
在許可的條件下
也可以階段性地truncate表
truncate命令刪除表中所有記錄
也刪除索引碎片
)
在使用索引時一定要按索引對應字段的順序進行引用
)
用(+)比用NOT IN更有效率
降低ORACLE的競爭 先講幾個ORACLE的幾個參數
這幾個參數關系到ORACLE的競爭
)
freelists 和 freelist 組
他們負責ORACLE的處理表和索引的空間管理
)
pctfree 及 pctused
該參數決定了freelists 和 freelist 組的行為
pctfree 和pctused 參數的唯一目的就是為了控制塊如何在 freelists 中進出
設置好pctfree 及 pctused對塊在freelists的移走和讀取很重要
其他參數的設置 )
包括SGA區(系統全局區)
系統全局區(SGA)是一個分配給Oracle 的包含一個 Oracle 實例的數據庫的控制信息內存段
主要包括數據庫高速緩存(the database buffer cache)
重演日志緩存(the redo log buffer)
共享池(the shared pool)
數據字典緩存(the data dictionary cache)以及其它各方面的信息
)
db_block_buffers(數據高速緩沖區)訪問過的數據都放在這一片內存區域
該參數越大
Oracle在內存中找到相同數據的可能性就越大
也即加快了查詢速度
)
share_pool_size (SQL共享緩沖池)
該參數是庫高速緩存和數據字典的高速緩存
)
Log_buffer (重演日志緩沖區)
)
sort_area_size(排序區)
)
processes (同時連接的進程數)
)
db_block_size (數據庫塊大小)
Oracle默認塊為
KB
太小了
因為如果我們有一個
KB的數據
則
KB塊的數據庫要讀
次盤
才能讀完
而
KB塊的數據庫只要
次就讀完了
大大減少了I/O操作
數據庫安裝完成後
就不能再改變db_block_size的值了
只能重新建立數據庫並且建庫時
要選擇手工安裝數據庫
)
open_links (同時打開的鏈接數)
)
dml_locks
)
open_cursors (打開光標數)
)
dbwr_io_slaves (後台寫進程數)
From:http://tw.wingwit.com/Article/program/Oracle/201311/17955.html