存儲性能評估
在存儲性能評估的時候,我們使用磁盤性能指數(shù)(dpi, disk performance index),下表列出了dpi中的各項指數(shù),這個評分系統(tǒng)并不意味著對磁盤的使用和分配的全方位評估,而只是代表一個晴雨表,反映當(dāng)前磁盤的使用和分配上是否存在需要改進或者注意的地方。
mpi指數(shù)
分類
所需等級
最高分
調(diào)整表和索引
是
30
表的行連接問題
無
30
分離關(guān)鍵的oracle文件
是
30
回滾段的平衡
30
臨時段的平衡
30
使用最多的前10個sql的磁盤使用率
<5%
60
是否已經(jīng)調(diào)整使用磁盤最多的前25個sql
是
40
mpi指數(shù)
總分
250
1. 調(diào)整表和索引
由于表和索引的數(shù)據(jù)塊通常是被同時讀取的,所以應(yīng)該盡量將表和其相關(guān)聯(lián)的索引放置在不同的磁盤上,以便減少文件的i/o沖突。
檢查方法:
select i.index_name, t.table_name, t.tablespace_name
from user_tables t, user_indexes i
where t.table_name = i.table_name
and t.tablespace_name = i.tablespace_name;
返回結(jié)果是創(chuàng)建在相同表空間中的表和相關(guān)聯(lián)的索引。建議創(chuàng)建新的表空間用于專門存放索引,并將當(dāng)前的索引rebuild到新創(chuàng)建的表空間中。
alter index idx_name rebuild tablespace ts_name;
評估準則:
等級
分數(shù)
表和索引放在同一磁盤上
0
存儲使用了磁盤陣列,沒有進一步調(diào)整
20
存儲使用了磁盤陣列,對于raid類型已經(jīng)作過調(diào)整
30
表和索引已經(jīng)規(guī)劃在不同磁盤上
30
2. 表的行鏈接問題
當(dāng)更新一張表,而數(shù)據(jù)塊中又沒有足夠的剩余空間來容納所作的修改時,就會發(fā)生“行鏈接”現(xiàn)象,該記錄被鏈接到另外一個有足夠空間的數(shù)據(jù)塊中,也就是一條記錄跨越了多個數(shù)據(jù)塊,這樣在讀取該記錄的時候就會消耗更多的i/o,當(dāng)數(shù)據(jù)庫中有大量的“行鏈接”現(xiàn)象存在時,數(shù)據(jù)庫的整體性能就會下降。
檢查方法:
sqlplus /nolog
connect app_user/password
sql> @$oracle_home/rdbms/admin/utlchain.sql
sql> analyze table <table_name> list chained rows;
sql> select count(*) chained_rows, table_name
from chained_rows
group by table_name;
如果沒有返回任何行,則表示沒有“行鏈接”現(xiàn)象。否則將按照已經(jīng)分析過的表顯示每張表中有多少記錄出現(xiàn)了“行鏈接”現(xiàn)象。
“行鏈接”現(xiàn)象的產(chǎn)生跟pctfree參數(shù)的設(shè)置不當(dāng)有關(guān)系。pctfree值默認為10%,如果系統(tǒng)中存在大量行鏈接,表示這個參數(shù)指定的塊保留空間過小,不足以容納塊中所有記錄的更新操作。此時應(yīng)該增大相應(yīng)表的pctfree值。
評估準則:
等級
分數(shù)
存在行鏈接現(xiàn)象
0
不存在行鏈接現(xiàn)象
30
3. 分離關(guān)鍵的oracle文件
無論是出于安全性的考慮還是性能的考慮,都建議將關(guān)鍵的oracle文件分布在可用的獨立磁盤上。
首先在錯誤出現(xiàn)之后,用來被恢復(fù)的數(shù)據(jù)文件和用來恢復(fù)的控制文件,重作日志文件,歸檔日志文件應(yīng)該分離存放。如果有可能,將下列各個關(guān)鍵文件分布在不同的磁盤上。
系統(tǒng)表空間(system),臨時表空間(temp),回滾表空間(undo),聯(lián)機重作日志文件(redo)和歸檔日志文件(arch),經(jīng)常訪問的用戶表空間,經(jīng)常訪問的用戶索引表空間,操作系統(tǒng)盤,$oracl_ebase中的關(guān)鍵oracle軟件文件。
至少聯(lián)機重作日志文件(redo)和歸檔日志文件(arch)應(yīng)該跟其它文件存放在不同的磁盤上,并且由于日志文件的大部分時間為只寫屬性,所以需要考慮raid5在寫方面的弱勢,盡量不要將日志文件存放在raid5的陣列組上。
檢查方法:
select file_name, tablespace_name, bytes
from dba_data_files
union all
select file_name, tablespace_name, bytes
from dba_temp_files
union all
select name file_name, null, null
from v$controlfile
union all
select member file_name, to_char(a.group#) tablespace_name, b.bytes bytes
from v$logfile a, v$log b
where a.group# = b.group#
union all (select value file_name, null, null
from v$parameter
where name like 'log_archive_dest_%'
and value is not null
minus
select value file_name, null, null
from v$parameter
where name like 'log_archive_dest_state%');
返回數(shù)據(jù)庫中所有關(guān)鍵文件存儲的位置,由dba和sa考察返回的結(jié)果,確認已經(jīng)對于關(guān)鍵文件的存儲位置作過符合實際情況的調(diào)整。
評估準則:
等級
分數(shù)
沒有調(diào)整,全部在單個磁盤上
0
沒有調(diào)整,全部在raid上
20
已經(jīng)調(diào)整
30
4. 回滾段的平衡
在oracle 9i和oracle9i之前如果沒有使用回滾段自動管理,那么對于回滾段的性能仍然是需要監(jiān)控并且調(diào)整的。
檢查是否使用了回滾段自動管理:
select name, value from v$parameter where name like '%undo_%';
如果返回結(jié)果中undo_management的值是auto,則表示使用了回滾段自動管理,同時undo_tablespace值顯示了自動管理使用的回滾表空間,undo_retention值顯示了在回滾表空間中保留回滾數(shù)據(jù)的時限,以秒為單位。
注意:如果undo_management的值是auto但是undo_tablespace沒有設(shè)置相應(yīng)的值,那么就會使用system表空間中的system回滾段,這個是絕對應(yīng)該避免的現(xiàn)象。
如果沒有使用回滾段自動管理,那么需要監(jiān)控用戶使用回滾段的頻度,原則上認為不應(yīng)該有超過1個用戶同時使用1個回滾段。
檢查方法:
select a.name,
b.extents,
b.rssize,
b.xacts,
b.waits,
b.gets,
optsize,
status
from v$rollname a, v$rollstat b
where a.usn = b.usn;
檢查輸出結(jié)果,對于所有回滾段而言,如果xacts(活動事務(wù))和waits(段頭等待)經(jīng)常超出1,那么就表明需要增加回滾段數(shù)目,以避免可能出現(xiàn)的爭用。
增加回滾段的方法:
create rollback segment rs_name tablespace rbs storage(initial 1m next 2m);
alter rollback segment rs_name online;
如果使用了回滾段自動管理,那么可以從v$undostat, v$rollstat, dba_undo_extents等視圖中查詢當(dāng)前回滾段的使用和分配情況。
評估準則:
等級
分數(shù)
有回滾段等待現(xiàn)象
0
無回滾段等待現(xiàn)象
30
使用了回滾段自動管理
30
5. 臨時段的平衡
當(dāng)初始化參數(shù)中定義的sort_area_size大小無法滿足排序要求的空間,就會使用臨時表空間中的臨時段進行排序,磁盤排序比內(nèi)存排序要慢100-10000倍,所以盡量減少磁盤排序是性能調(diào)整工作的一個重要部分。
可能引起排序的操作有create index, distinct, order by, group by等。
檢查方法:
select name, value from v$sysstat where name like '%sorts%';
返回結(jié)果中的sorts (memory)表示內(nèi)存排序,而sorts (disk)則表示磁盤排序,如果存在大量的磁盤排序,則表明我們需要增加sort_area_size或者hash_area_size等排序區(qū)的大小,或者需要檢查目前系統(tǒng)中消耗大量磁盤的sql是否已經(jīng)經(jīng)過調(diào)整(檢查前25位消耗磁盤的sql在后面部分將提到)。
檢查使用磁盤排序的會話信息,可以定位執(zhí)行了大量磁盤排序的會話。
檢查方法:
select b.name, a.sid, a.value
from v$sesstat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'sorts (disk)'
and a.value > 0
order by a.value desc;
如果有可能我們應(yīng)該將臨時表空間中的多個臨時數(shù)據(jù)文件分布在不同的磁盤上,以減少排序時可能會產(chǎn)生的磁盤沖突。
在oracle9i中,我們可以設(shè)置pga_aggregate_size初始化參數(shù)來指定所有會話將使用的pga大小,同時也必須設(shè)置workarea_size_policy參數(shù)為auto。其它詳細信息見內(nèi)存性能評估中“4。內(nèi)存中的排序”部分。
評估準則:
等級
分數(shù)
對于存在的磁盤排序沒有評估
0
已經(jīng)就存在的磁盤排序進行過調(diào)整
30
6. 最浪費磁盤讀操作的前10個語句占所有語句的比例
通常一個沒有優(yōu)化系統(tǒng)中,10個最常用的sql語句的訪問量會占到整個系統(tǒng)中磁盤讀操作的50%以上。這些sql是最需要進行優(yōu)化的部分,也是優(yōu)化工作中優(yōu)先級很高的部分。通常我們的優(yōu)化目標是將這些sql的磁盤讀操作百分比降低到5-19%。
檢查方法:
select sum(pct_bufgets)
from (select rank() over(order by disk_reads desc) as rank_bufgets,
to_char(100 * ratio_to_report(disk_reads) over(), '999.99') pct_bufgets
from v$sqlarea)
where rank_bufgets < 11;
評估準則:
等級
分數(shù)
<5%
60
5-19%
50
20-25%
30
>25%
0
7. 調(diào)整前25個最浪費磁盤讀操作的語句
在沒有調(diào)整的情況下,絕大多數(shù)系統(tǒng)中,訪問量占前25位的語句的磁盤讀操作將占用整個系統(tǒng)所有磁盤讀操作的75%,對這部分語句進行調(diào)整是至關(guān)重要的。這部分腳本用于獲得訪問量占前25位的sql語句。輸出結(jié)果中的exec表示該sql被執(zhí)行的次數(shù)。
檢查方法:
set serveroutput on size 1000000
declare
execution number;
top25 number;
text1 varchar2(4000);
x number;
len1 number;
cursor c1 is
select executions, disk_reads, substr(sql_text, 1, 4000)
from v$sqlarea
order by disk_reads desc;
begin
dbms_output.put_line('exec' || ' ' || 'reads' || ' ' || 'text');
dbms_output.put_line('-----' || ' ' || '--------' || ' ' ||
'-------------');
open c1;
for i in 1 .. 25 loop
fetch c1
into execution, top25, text1;
dbms_output.put_line(rpad(to_char(execution), 5) || ' ' ||
rpad(to_char(top25), 8) || ' ' ||
substr(text1, 1, 66));
len1 := length(text1);
x := 66;
while len1 > x - 1 loop
dbms_output.put_line('- ' || substr(text1, x, 66));
x := x + 66;
end loop;
end loop;
end;
/
評估準則:
本部分沒有具體的評估準則,需要開發(fā)人員或者dba去確認在這25個sql中屬于應(yīng)用系統(tǒng)的語句是否都已經(jīng)作過調(diào)優(yōu)。
8. 其它存儲相關(guān)的調(diào)整
1) 字典管理表空間中的extent總數(shù)不超過4096
檢查方法:
select a.tablespace_name, sum(a.extents)
from dba_segments a, dba_tablespaces b
where a.tablespace_name = b.tablespace_name
and b.extent_management = 'dictionary'
group by a.tablespace_name
order by sum(a.extents);
檢查輸出結(jié)果,如果顯示某個表空間中的extents總數(shù)超過了4096,那么需要擴大這個表空間的extent大小,過多的extent對于dmt的空間管理有負面影響。
2) 本地管理表空間中單個segement的extent數(shù)不超過1024
檢查方法:
select segment_name, segment_type, extents, bytes, b.tablespace_name
from dba_segments a, dba_tablespaces b
where a.tablespace_name = b.tablespace_name
and b.extent_management = 'local'
and a.extents > 1024;
檢查輸出結(jié)果,返回的記錄都是單個段的區(qū)間大于1024的對象,對于這些對象,應(yīng)該創(chuàng)建一個單獨的具有更大extent大小的表空間,然后將這些對象move到新的表空間中去。
3) 檢查字典管理表空間的pctincrease值是否是0
為了表空間中的所有extent大小相同,建議表空間中的所有段都不要設(shè)置獨立的storage參數(shù)。對于表空間的pctincrease參數(shù),建議設(shè)置為0,同時應(yīng)該設(shè)置minextents參數(shù),保證初始分配足夠的空間給新創(chuàng)建的對象。
對于lmt表空間,storage參數(shù)中的pctincrease和next參數(shù)均無效,建議設(shè)置適當(dāng)?shù)膗niform參數(shù)管理表空間的extent分配。
4) 考慮使用分區(qū)來避免磁盤爭用
分區(qū)表在管理的方便性和性能的提高上都有較強的實用性,甚至可以認為分區(qū)是提高與大型表有關(guān)的性能的最佳方法。通過訪問一個表或者索引的較小片段,而不是訪問整個表或索引,分區(qū)可以很好地提高效率。如果一個表或者索引的分區(qū)位于不同的磁盤上,就更可以大大增加數(shù)據(jù)吞吐量,獲得很好的數(shù)據(jù)庫性能。
對于分區(qū)的使用,暫時不在本文的敘述范圍內(nèi),請參閱其它的分區(qū)文檔。
5) 對于分區(qū)表的非分區(qū)鍵索引是否是全局分區(qū)索引
由于分區(qū)表的數(shù)據(jù)量通常比較巨大,所以如果在分區(qū)表的非分區(qū)鍵上創(chuàng)建索引,那么建議創(chuàng)建為全局分區(qū)索引,這樣能夠更好地提高性能。注意:如果截斷了一個分區(qū)的數(shù)據(jù)或者刪除了一個分區(qū),那么必須rebuild這個分區(qū)表中的全部全局索引,否則這些全局索引將處于invalid狀態(tài),導(dǎo)致使用到這些索引的sql語句失敗。
中國最大的web開發(fā)資源網(wǎng)站及技術(shù)社區(qū),