Optimizing Sort Operations
1、排序進程:
1)如果排序請求使用的memory不大于參數(shù)SORT_AREA_SIZE的設置值,則sort操作在內(nèi)存中進程。反之,如果超過該值:
①數(shù)據(jù)將被分隔成更小的pieces,被稱作sort runs;每個sorted先被分別的sort。
②server進程會將pieces寫入臨時表空間segment中;這些segments用于存儲中間的sort data。
③sorted pieces被合并從而產(chǎn)生最終結果。如果SORT_AREA_SIZE大小不足以一次merge所有sorted runs,sorted runs的子集會經(jīng)歷幾次merge過程。
2)sort area的大小是由SORT_AREA_SIZE設置的,它可動態(tài)設置(alter session、alter system deferred),其默認值根據(jù)OS的不同而不同。其默認值可以滿足一般的OLTP需求,對于DSS應用、批量jobs或是較大操作需要適當?shù)臈l件。
3)另一個相關的參數(shù)是SORT_AREA_RETAINED_SIZE。當sorting操作結束,sort area仍保存了部分等待取出的sorted rows,sort area可以shrink到最小為SORT_AREA_RETAINED_SIZE的大小。該部分memory仍然是被釋放到UGA中。其默認值等于 SORT_AREA_SIZE。
4)關于位圖索引的初始化參數(shù):
CREATE_BITMAP_AREA_SIZE:此參數(shù)是靜態(tài)的,指明了用于創(chuàng)建位圖索引可以分配的memory,默認值是8MB(較大的memory設置會加快bitmap的創(chuàng)建速度,如果位圖索引的基數(shù)比較小,所需的memory也相對小)
BITMAP_MERGE_AREA_SIZE:該參數(shù)也是靜態(tài)的。默認值是1MB。oracle為索引位圖段建立一張位圖。在進行位圖索引掃描時,需要將掃描到的位圖索引排序后與位圖合并(Merge
),Oracle會在PGA中開辟一片區(qū)域用于排序和合并。它就指定了這片區(qū)域的大小。
5)sort Area的新參數(shù):
PGA_AGGREGATE_TARGET:指明了連接instance的所有進程的PGA的總區(qū)域大小,大小可從10MB到4000GB。設置時,應該先考慮system總的memory,以及分配給SGA的memory大小,將剩余的部分分配給該參數(shù)。它指明了自動sort area管理。
WORKAREA_SIZE_POLICY:該參數(shù)可設置為(i)AUTO:只有定義了PGA_AGGREGATE_TARGET參數(shù)后才可被設置為 AUTO;(ii)MANUAL:對work areas的Sizing是手動的,是基于*_AREA_SIZE參數(shù)設置的值來分配的。如果設置為MANUAL,可能會降低PGA內(nèi)存的利用率。
6)一般SORT_AREA_SIZE和SORT_AREA_RETAINED_SIZE應該設為相同的大小,除非system memory不足或使用的是Oracle shared server模式。
7)內(nèi)存的需求:
在single server process中:一個執(zhí)行計劃可能會包含多個排序。例如,一個用sort-merge方式join兩個tables并使用order 不用子句的sql,包含了三個sort。對此,在運行order by時,一個SORT_AREA_SIZE大小的memory用于當前的sort;兩個SORT_AREA_RETAINED_SIZE大小的 memory用于join sorts。
在parallel query 進程中:假設有2個server,則會使用(SORT_AREA_SIZE*2*并發(fā)度)大小的memory,此外如果需要,還要使用 (SORT_AREA_RETAINED_SIZE*并發(fā)度*事先做的排序次數(shù))的memory。實驗表明分配更大的memory不會對性能有更好的提 高。
2、Tuning sorts
需要注意的問題有:
* 如果數(shù)據(jù)已經(jīng)使用索引進行了排序,盡量避免再次排序
* 如果sort操作本身并不大,但是設定的sort area過小使得其不得不進行頁面的交換。
* 此外使用大的內(nèi)存chunks用sort也會造成paging核swapping,從而降低系統(tǒng)性能。
* 避免在頻繁分配和收回磁盤上的臨時表空間操作
所以應該:盡可能的避免排序操作;盡量使sort操作在內(nèi)存中完成,減少swapping和paging的操作;盡可能的減少對臨時空間的請求。
1)臨時表空間的優(yōu)化:
明確指明sort操作使用的臨時表空間,可以有效的避免在分配與收回sort空間時的序列化操作。在臨時表空間中,不能包含任何永久的object,在 Oracle Parallel Server中,對于每個instance,會有一個單獨的臨時表空間。臨時表空間的datafile在備份時時不需要備份的。
對于臨時sort segment:
* 在第一次需要申請臨時表空間的sort操作申請時,sort segment才被創(chuàng)建;
* 在DB被關閉時才被drop,可以用命令行對其進行擴容
* 它也是由extents組成的,可以用于不同的sort 操作
* 在SGA中存在一個叫sort extents pool(SEP)的數(shù)據(jù)結構,用于管理臨時表空間。當進程需要申請sort space時,會先在SEP中查找臨時表空間中空閑的extents。
2)需要進行排序的命令請求有:
* 索引的創(chuàng)建:在建立b-tree之前,必須先將索引列進行排序操作;
* order by和group by子句:必須先對該子句使用的字段進行排序;
* distinct關鍵字:必須為消除重復行先進行排序;
* UNION、INTERSECT或MINUS操作符:server需要為了消除重復rows先對表進行sort。
* 兩表之間的sort-merge連接:如果沒有相應的索引用于兩表的連接,對于等值連接,如果使用此方法join,則先需要對兩表進行全表掃描,并分別進行排序,再合并兩表。
對于server的排序操作的監(jiān)控,可以從v$sysstat中查看:
select name, value from v$sysstat where name = ’sorts (rows)’;
可以使用analyze或是dbms_utility.analyze_*等方法對tables、indexes或是cluster進程統(tǒng)計,從而更好的指導CBO,從而產(chǎn)生更好的執(zhí)行計劃。
3)避免使用sort:在任何可能的地方盡量避免使用sort
* 使用nosort關鍵字創(chuàng)建索引:
默認情況下,在表中創(chuàng)建索引的時候,會對表中的記錄進行排序,排序成功后再創(chuàng)建索引。但是當記錄比較多的是,這個排序作業(yè)會占用比較多的時間,這也就增加了索引建立的時間(排序作業(yè)是在索引創(chuàng)建作業(yè)中完成)。有時候,我們導入數(shù)據(jù)的時候,如采用insert into 語句插入數(shù)據(jù)過程中同時采用Order by子句對索引字段進行了排序。此時如果在索引創(chuàng)建過程中再進行排序的話,就有點脫褲子放屁,多此一舉了。為此在重新創(chuàng)建索引時,如果表中的數(shù)據(jù)已經(jīng)排好序了(按索引字段排序),那么在創(chuàng)建索引時就不需要為此重新排序。此時在創(chuàng)建索引時,數(shù)據(jù)庫管理員就可以使用NOSORT可選項,告訴數(shù)據(jù)庫系統(tǒng)不需要對 表中當記錄進行重新排序了。
采用了這個選項之后,如果表中的記錄已經(jīng)按順序排列,那么在重新創(chuàng)建索引的時候,就不會重新排序,可以提高索引創(chuàng)建的時間,節(jié)省內(nèi)存中的排序緩存空 間。相反,如果表中的記錄是不按索引關鍵字排序的話,那么此時采用NOSORT關鍵字的話,系統(tǒng)就會提示錯誤信息,并拒絕創(chuàng)建索引。所以在使用 NOSORT可選項的時候,數(shù)據(jù)庫管理員盡管放心大膽的使用。因為其實在不能夠使用這個選項的時候,數(shù)據(jù)庫也會明確的告知。為此其副作用就比較少,數(shù)據(jù)庫管理員只需要把這個可選項去掉然后重新執(zhí)行一次即可。不過這里需要注意的是,如果表中的記錄比較少的話,那么使用NOSORT選項的效果并不是很明顯。
* 使用UNION ALL代替UNION:因為UNION ALL不會消除重復的rows,所以也無需進行sort操作。
* 使用Nested loop join代替sort-merge join
* 在經(jīng)常使用order by子句的列上創(chuàng)建索引。
* 使用analyze時,只統(tǒng)計所需字段的數(shù)據(jù):
ANALYZE … FOR COLUMNS或ANALYZE … FOR ALL INDEXED COLUMNS
* 對于ANALYZE COMPUTE,其統(tǒng)計結果更精確,但是需要進行一定的sort,對此,可以使用ESTIMATE子句來替代大表或cluster中的ANALYZE。
4)診斷工具:
* 在視圖v$sysstat中顯示的信息中有:
sorts (memory):完全在內(nèi)存中進行的排序的次數(shù)
sorts (disk):請求臨時segments的I/O進行sorts的次數(shù)
sorts (rows):當前已經(jīng)進行過的sort的rows的數(shù)量
* 在statspack輸出的report中也存在上述信息,并計算了部分平均值
* 視圖v$sort_segment和v$sort_usage顯示了當前臨時segment中的使用情況,以及那些user占用了這些臨時segment。
@@ 在具體診斷時,可計算磁盤sort和memory sort的比率,它應該小于5%。否則,如果此比率顯示了較大的磁盤排序,則需要考慮是否可以增大SORT_AREA_SIZE的設置。
@@ 注意的是:如果增大了sort area,則每個需要sort的進程所占用的memory可能都會增加,在一定程度上影響了OS的memory分配及paging和swapping。所 以當增加了sort_area_size后,考慮是否可以適當減小SORT_RESERVED_AREA_SIZE的值,不過此值的減小,在一定程度上減 少了內(nèi)存的使用,但也可能附加著造成了I/O的可能性。
6) 監(jiān)控臨時表空間:主要是查看V$SORT_SEGMENT視圖:
select tablespace_name, current_users, total_extents, used_extents, extent_hits, max_used_blocks, max_sort_blocks from v$sort_segment;
具體字段的意義如下:
CURRENT_USERS:Number of active users
TOTAL_EXTENTS :Total number of extents
USED_EXTENTS :Extents currently allocated to sorts
EXTENT_HITS: Number of times an unused extent was found in the pool
MAX_USED_BLOCKS: Maximum number of used blocks
MAX_SORT_BLOCKS :Maximum number of blocks used by an individual sort
7)臨時表空間的設置:
默認臨時表空間的存儲參數(shù)對于sort segment都是適用的,只是它們有無限的extents。
設置臨時表空間的參數(shù)時,先要考慮sort_area_size的值。temporary tablespace的initial和next參數(shù)應該是sort_area_size的整數(shù)倍,并要考慮額外的segment header的空間。將PCTINCREASE設置為0 。
可以為users指定不同的temporary tablespace,并且可以將temp tablespace放在不同的磁盤上,對于查看使用情況,可以看v$sort_usage
select username, tablespace, contents, extents, blocks from v$sort_usage;
此外,還可查看V$TEMPFILE和DBA_TEMP_FILES可以獲得temporary tablespace的相關信息。
posted on 2010-01-12 12:30 gdufo 閱讀(514) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)