<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海鷗航際

    JAVA站
    posts - 11, comments - 53, trackbacks - 1, articles - 102

    本文只討論Oracle中最常見的索引,即是B-tree索引。本文中涉及的數(shù)據(jù)庫(kù)版本是Oracle8i。

    一. 查看系統(tǒng)表中的用戶索引

    在Oracle中,SYSTEM表是安裝數(shù)據(jù)庫(kù)時(shí)自動(dòng)建立的,它包含數(shù)據(jù)庫(kù)的全部數(shù)據(jù)字典,存儲(chǔ)過程、包、函數(shù)和觸發(fā)器的定義以及系統(tǒng)回滾段。

    一般來說,應(yīng)該盡量避免在SYSTEM表中存儲(chǔ)非SYSTEM用戶的對(duì)象。因?yàn)檫@樣會(huì)帶來數(shù)據(jù)庫(kù)維護(hù)和管理的很多問題。一旦SYSTEM表?yè)p壞了,只能重新生成數(shù)據(jù)庫(kù)。我們可以用下面的語(yǔ)句來檢查在SYSTEM表內(nèi)有沒有其他用戶的索引存在。

    select count(*) from dba_indexes
      where tablespace_name = "SYSTEM"
      and owner not in ("SYS","SYSTEM")
    

    二. 索引的存儲(chǔ)情況檢查

    Oracle為數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)分配邏輯結(jié)構(gòu)空間。數(shù)據(jù)庫(kù)空間的單位是數(shù)據(jù)塊(block)、范圍(extent)和段(segment)。

    Oracle數(shù)據(jù)塊(block)是Oracle使用和分配的最小存儲(chǔ)單位。它是由數(shù)據(jù)庫(kù)建立時(shí)設(shè)置的DB_BLOCK_SIZE決定的。一旦數(shù)據(jù)庫(kù)生成了,數(shù)據(jù)塊的大小不能改變。要想改變只能重新建立數(shù)據(jù)庫(kù)。(在Oracle9i中有一些不同,不過這不在本文討論的范圍內(nèi)。)

    Extent是由一組連續(xù)的block組成的。一個(gè)或多個(gè)extent組成一個(gè)segment。當(dāng)一個(gè)segment中的所有空間被用完時(shí),Oracle為它分配一個(gè)新的extent。

    Segment是由一個(gè)或多個(gè)extent組成的。它包含某表空間中特定邏輯存儲(chǔ)結(jié)構(gòu)的所有數(shù)據(jù)。一個(gè)段中的extent可以是不連續(xù)的,甚至可以在不同的數(shù)據(jù)文件中。

    一個(gè)object只能對(duì)應(yīng)于一個(gè)邏輯存儲(chǔ)的segment,我們通過查看該segment中的extent,可以看出相應(yīng)object的存儲(chǔ)情況。

    (1)查看索引段中extent的數(shù)量:

    select segment_name, count(*) 
    from dba_extents
    where segment_type="INDEX"
      and owner=UPPER("&owner") 
    group by segment_name
    / 

    (2)查看表空間內(nèi)的索引的擴(kuò)展情況:

    select substr(segment_name,1,20) "SEGMENT NAME", bytes, count(bytes) 
    from dba_extents 
    where segment_name in
    ( select index_name from dba_indexes where tablespace_name=UPPER("&表空間") ) group by segment_name, bytes order by segment_name /

    三. 索引的選擇性

    索引的選擇性是指索引列中不同值的數(shù)目與表中記錄數(shù)的比。如果一個(gè)表中有2000條記錄,表索引列有1980個(gè)不同的值,那么這個(gè)索引的選擇性就是1980/2000=0.99。

    一個(gè)索引的選擇性越接近于1,這個(gè)索引的效率就越高。

    如果是使用基于cost的最優(yōu)化,優(yōu)化器不應(yīng)該使用選擇性不好的索引。如果是使用基于rule的最優(yōu)化,優(yōu)化器在確定執(zhí)行路徑時(shí)不會(huì)考慮索引的選擇性(除非是唯一性索引),并且不得不手工優(yōu)化查詢以避免使用非選擇性的索引。

    確定索引的選擇性,可以有兩種方法:手工測(cè)量和自動(dòng)測(cè)量。

    (1)手工測(cè)量索引的選擇性

    如果要根據(jù)一個(gè)表的兩列創(chuàng)建兩列并置索引,可以用以下方法測(cè)量索引的選擇性:

      列的選擇性=不同值的數(shù)目/行的總數(shù) /* 越接近1越好 */

    select count(distinct 第一列||"%"||第二列)/count(*) from 表名

    如果我們知道其中一列索引的選擇性(例如其中一列是主鍵),那么我們就可以知道另一列索引的選擇性。

    手工方法的優(yōu)點(diǎn)是在創(chuàng)建索引前就能評(píng)估索引的選擇性。

    (2)自動(dòng)測(cè)量索引的選擇性

    如果分析一個(gè)表,也會(huì)自動(dòng)分析所有表的索引。

    第一,為了確定一個(gè)表的確定性,就要分析表。

    analyze table 表名 compute statistics

    第二,確定索引里不同關(guān)鍵字的數(shù)目:

    select distinct_keys from user_indexes where table_name="表名" and index_name="索引名"

    第三,確定表中行的總數(shù):

    select num_rows from user_tables where table_name="表名"

    第四,索引的選擇性=索引里不同關(guān)鍵字的數(shù)目/表中行的總數(shù):

    select i.distinct_keys/t.num_rows from user_indexes i, user_tables t
    where i.table_name="表名" and i.index_name="索引名" and i.table_name=t.table_name

    第五,可以查詢USER_TAB_COLUMNS以了解每個(gè)列的選擇性。

    表中所有行在該列的不同值的數(shù)目:

    select column_name, num_distinct from user_tab_columns where table_name="表名"

    列的選擇性=NUM_DISTINCT/表中所有行的總數(shù),查詢USER_TAB_COLUMNS有助測(cè)量每個(gè)列的選擇性,但它并不能精確地測(cè)量列的并置組合的選擇性。要想測(cè)量一組列的選擇性,需要采用手工方法或者根據(jù)這組列創(chuàng)建一個(gè)索引并重新分析表。

    四. 確定索引的實(shí)際碎片

    隨著數(shù)據(jù)庫(kù)的使用,不可避免地對(duì)基本表進(jìn)行插入,更新和刪除,這樣導(dǎo)致葉子行在索引中被刪除,使該索引產(chǎn)生碎片。插入刪除越頻繁的表,索引碎片的程度也越高。碎片的產(chǎn)生使訪問和使用該索引的I/O成本增加。碎片較高的索引必須重建以保持最佳性能。

    (1)利用驗(yàn)證索引命令對(duì)索引進(jìn)行驗(yàn)證。

    這將有價(jià)值的索引信息填入index_stats表。

    validate index 用戶名.索引名

    (2)查詢index_stats表以確定索引中刪除的、未填滿的葉子行的百分比。

    select name, del_lf_rows, lf_rows,
           round((del_lf_rows/(lf_rows+0.0000000001))*100) "Frag Percent"
    from index_stats

    (3)如果索引的葉子行的碎片超過10%,考慮對(duì)索引進(jìn)行重建。

    alter index 用戶名.索引名 rebuild
      tablespace 表空間名
      storage(initial 初始值 next 擴(kuò)展值)
      nologging

    (4)如果出于空間或其他考慮,不能重建索引,可以整理索引。

     alter index用戶名.索引名 coalesce

    (5)清除分析信息

    analyze index 用戶名.索引名 delete statistics

    五. 重建索引

    (1)檢查需要重建的索引

    根據(jù)以下幾方面進(jìn)行檢查,確定需要重建的索引。

    第一,查看SYSTEM表空間中的用戶索引

    為了避免數(shù)據(jù)字典的碎片出現(xiàn),要盡量避免在SYSTEM表空間出現(xiàn)用戶的表和索引。

    select index_name from dba_indexes 
    where tablespace_name="SYSTEM" and owner not in ("SYS","SYSTEM")

    第二,確保用戶的表和索引不在同一表空間內(nèi)

    表和索引對(duì)象的第一個(gè)規(guī)則是把表和索引分離。把表和相應(yīng)的索引建立在不同的表空間中,最好在不同的磁盤上。這樣可以避免在數(shù)據(jù)管理和查詢時(shí)出現(xiàn)的許多I/O沖突。

    set linesize 120
    col "OWNER" format a20
    col "INDEX" format a30
    col "TABLE" format a30
    col "TABLESPACE" format a30
    select i.owner "OWNER", i.index_name "INDEX", t.table_name "TABLE", 
           i.tablespace_name "TABLESPACE"
    from dba_indexes i, dba_tables t
    where i.owner=t.owner
      and i.table_name=t.table_name
      and i.tablespace_name=t.tablespace_name
      and i.owner not in ("SYS","SYSTEM")
      / 

    第三,查看數(shù)據(jù)表空間里有哪些索引

    用戶的默認(rèn)表空間應(yīng)該不是SYSTEM表空間,而是數(shù)據(jù)表空間。在建立索引時(shí),如果不指定相應(yīng)的索引表空間名,那么,該索引就會(huì)建立在數(shù)據(jù)表空間中。這是程序員經(jīng)常忽略的一個(gè)問題。應(yīng)該在建索引時(shí),明確的指明相應(yīng)的索引表空間。

    col segment_name format a30
    select owner, segment_name, sum(bytes) 
    from dba_segments
    where tablespace_name="數(shù)據(jù)表空間名"
    and segment_type="INDEX"
    group by owner,segment_name
    /

    第四,查看哪個(gè)索引被擴(kuò)展了超過10次

    隨著表記錄的增加,相應(yīng)的索引也要增加。如果一個(gè)索引的next extent值設(shè)置不合理(太小),索引段的擴(kuò)展變得很頻繁。索引的extent太多,檢索時(shí)的速度和效率就會(huì)降低。

    set linesize 100
    col owner format a10
    col segment_name format a30
    col tablespace_name format a30
    select count(*), owner, segment_name, tablespace_name 
    from dba_extents
    where segment_type="INDEX" 
      and owner not in ("SYS","SYSTEM")
    group by owner,segment_name,tablespace_name
    having count(*) >10
    order by count(*) desc
    /

    (2)找出需要重建的索引后,需要確定索引的大小,以設(shè)置合理的索引存儲(chǔ)參數(shù)。

    set linesize 120
    col "INDEX" format a30
    col "TABLESPACE" format a20
    select owner "OWNER", segment_name "INDEX", tablespace_name "TABLESPACE", 
           bytes "BYTES/COUNT", sum(bytes) "TOTAL BYTES", 
           round(sum(bytes)/(1024*1024),0) "TOTAL M",
           count(bytes) "TOTAL COUNT"
      from dba_extents
      where segment_type="INDEX" 
        and segment_name in ("索引名1","索引名2", ......)
      group by owner,segment_name,segment_type,tablespace_name,bytes
      order by owner,segment_name
      /

    (3)確定索引表空間還有足夠的剩余空間

    確定要把索引重建到哪個(gè)索引表空間中。要保證相應(yīng)的索引表空間有足夠的剩余空間。

    select round(bytes/(1024*1024),2) free(M)
      from sm$ts_free
      where tablespace_name="表空間名"
    / 

    (4)重建索引

    重建索引時(shí)要注意以下幾點(diǎn):

    a.如果不指定tablespace名,索引將建在用戶的默認(rèn)表空間。
    b.如果不指定nologging,將會(huì)寫日志,導(dǎo)致速度變慢。由于索引的重建沒有恢復(fù)的必要,所以,可以不寫日志。
    c.如果出現(xiàn)資源忙,表明有進(jìn)程正在使用該索引,等待一會(huì)再提交。

    alter index 索引名 rebuild
      tablespace 索引表空間名
      storage(initial 初始值 next 擴(kuò)展值)
      nologging
      / 

    (5)檢查索引

    對(duì)重建好的索引進(jìn)行檢查。

    select * from dba_extents where segment_name="索引名"
    

    (6)根據(jù)索引進(jìn)行查詢,檢查索引是否有效

    使用相應(yīng)的where條件進(jìn)行查詢,確保使用該索引。看看使用索引后的效果如何。

    select * from dba_ind_columns where index_name like "表名%"
    

    然后,根據(jù)相應(yīng)的索引項(xiàng)進(jìn)行查詢。

    select * from "表名%" where ......
    

    (6)找出有碎片的表空間,并收集其碎片。

    重建索引后,原有的索引被刪除,這樣會(huì)造成表空間的碎片。

    select "alter tablespace "||tablespace_name||" coalesce;"
      from dba_free_space_coalesced
      where percent_blocks_coalesced!=100
    / 

    整理表空間的碎片。

    alter tablespace 表空間名 coalesce
    主站蜘蛛池模板: 亚洲精品网站在线观看你懂的| 亚洲欧洲久久久精品| 亚洲国产精久久久久久久| 中文在线免费视频| 亚洲午夜国产精品无码老牛影视 | 最近的2019免费中文字幕| 亚洲午夜精品久久久久久浪潮| 一个人看www免费高清字幕| 久久亚洲欧洲国产综合| GOGOGO免费观看国语| 亚洲成AV人片一区二区| 67194成手机免费观看| 亚洲videosbestsex日本| 女人18毛片免费观看| 黄色大片免费网站| 亚洲熟妇中文字幕五十中出| 一区二区三区无码视频免费福利| 无码久久精品国产亚洲Av影片| 18禁止看的免费污网站| 亚洲熟妇成人精品一区| 亚洲人成影院在线观看| 久久成人免费播放网站| 激情综合亚洲色婷婷五月APP| 免费看又爽又黄禁片视频1000| 日韩大片免费观看视频播放 | 亚洲精品黄色视频在线观看免费资源| 无遮挡免费一区二区三区| 久久亚洲伊人中字综合精品| 无遮免费网站在线入口| 欧洲亚洲国产精华液| 亚洲成在人线av| 免费看片免费播放| 免费无码作爱视频| 亚洲www77777| 亚洲无av在线中文字幕| 日韩毛片免费无码无毒视频观看 | 亚洲视频在线观看地址| 国产美女a做受大片免费| 国精产品一区一区三区免费视频| 国产色在线|亚洲| 自拍偷自拍亚洲精品被多人伦好爽 |