gdufo

           

          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 runssorted runs的子集會經(jīng)歷幾次merge過程。

          2sort area的大小是由SORT_AREA_SIZE設置的,它可動態(tài)設置(alter sessionalter system deferred),其默認值根據(jù)OS的不同而不同。其默認值可以滿足一般的OLTP需求,對于DSS應用、批量jobs或是較大操作需要適當?shù)臈l件。
          3
          )另一個相關的參數(shù)是SORT_AREA_RETAINED_SIZE。當sorting操作結束,sort area仍保存了部分等待取出的sorted rowssort 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)的。默認值是1MBoracle為索引位圖段建立一張位圖。在進行位圖索引掃描時,需要將掃描到的位圖索引排序后與位圖合并(Merge
          ),Oracle會在PGA中開辟一片區(qū)域用于排序和合并。它就指定了這片區(qū)域的大小。
          5
          sort Area的新參數(shù):
          PGA_AGGREGATE_TARGET
          :指明了連接instance的所有進程的PGA的總區(qū)域大小,大小可從10MB4000GB。設置時,應該先考慮system總的memory,以及分配給SGAmemory大小,將剩余的部分分配給該參數(shù)。它指明了自動sort area管理。
          WORKAREA_SIZE_POLICY
          :該參數(shù)可設置為(iAUTO:只有定義了PGA_AGGREGATE_TARGET參數(shù)后才可被設置為 AUTO;(iiMANUAL:對work areasSizing是手動的,是基于*_AREA_SIZE參數(shù)設置的值來分配的。如果設置為MANUAL,可能會降低PGA內(nèi)存的利用率。
          6
          )一般SORT_AREA_SIZESORT_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 進程中:假設有2server,則會使用(SORT_AREA_SIZE*2*并發(fā)度)大小的memory,此外如果需要,還要使用 (SORT_AREA_RETAINED_SIZE*并發(fā)度*事先做的排序次數(shù))的memory。實驗表明分配更大的memory不會對性能有更好的提 高。

          2Tuning sorts
          需要注意的問題有:
          如果數(shù)據(jù)已經(jīng)使用索引進行了排序,盡量避免再次排序
          如果sort操作本身并不大,但是設定的sort area過小使得其不得不進行頁面的交換。
          此外使用大的內(nèi)存chunkssort也會造成pagingswapping,從而降低系統(tǒng)性能。
          避免在頻繁分配和收回磁盤上的臨時表空間操作
          所以應該:盡可能的避免排序操作;盡量使sort操作在內(nèi)存中完成,減少swappingpaging的操作;盡可能的減少對臨時空間的請求。
          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 poolSEP)的數(shù)據(jù)結構,用于管理臨時表空間。當進程需要申請sort space時,會先在SEP中查找臨時表空間中空閑的extents
          2
          )需要進行排序的命令請求有:
          索引的創(chuàng)建:在建立b-tree之前,必須先將索引列進行排序操作;
          *  order by
          group by子句:必須先對該子句使用的字段進行排序;
          *  distinct
          關鍵字:必須為消除重復行先進行排序;
          *  UNION
          INTERSECTMINUS操作符: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_*等方法對tablesindexes或是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)
          :請求臨時segmentsI/O進行sorts的次數(shù)
              sorts (rows)
          :當前已經(jīng)進行過的sortrows的數(shù)量
          statspack輸出的report中也存在上述信息,并計算了部分平均值
          視圖v$sort_segmentv$sort_usage顯示了當前臨時segment中的使用情況,以及那些user占用了這些臨時segment
          @@ 
          在具體診斷時,可計算磁盤sortmemory sort的比率,它應該小于5%。否則,如果此比率顯示了較大的磁盤排序,則需要考慮是否可以增大SORT_AREA_SIZE的設置。
          @@ 
          注意的是:如果增大了sort area,則每個需要sort的進程所占用的memory可能都會增加,在一定程度上影響了OSmemory分配及pagingswapping。所 以當增加了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 tablespaceinitialnext參數(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$TEMPFILEDBA_TEMP_FILES可以獲得temporary tablespace的相關信息。

           

          posted on 2010-01-12 12:30 gdufo 閱讀(514) 評論(0)  編輯  收藏 所屬分類: Database (oracle, sqlser,MYSQL)

          導航

          統(tǒng)計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 顺昌县| 新闻| 周口市| 华安县| 石嘴山市| 永登县| 浪卡子县| 张北县| 晋宁县| 青铜峡市| 临汾市| 马鞍山市| 临海市| 邹平县| 寿宁县| 晋江市| 乐山市| 黄石市| 高碑店市| 丹寨县| 麻城市| 昭苏县| 莱州市| 同德县| 古田县| 深水埗区| 新绛县| 荣昌县| 县级市| 电白县| 武鸣县| 车致| 齐齐哈尔市| 大埔县| 昭觉县| 揭东县| 攀枝花市| 独山县| 龙南县| 临城县| 太原市|