Oracle管理索引(五)Oracle索引的維護

來源:互聯網
上載者:User

一、查看系統資料表中的使用者索引

在Oracle中,SYSTEM表是安裝資料庫時自動建立的,它包含資料庫的全部資料字典,預存程序、包、函數和觸發器的定義以及系統復原段。

一般來說,應該盡量避免在SYSTEM表中儲存非SYSTEM使用者的對象。因為這樣會帶來資料庫維護和管理的很多問題。一旦SYSTEM表損壞了,只 能重建資料庫。我們可以用下面的語句來檢查在SYSTEM表內有沒有其他使用者的索引存在。

/* Formatted on 2010/6/19 13:22:46 (QP5 v5.115.810.9015) */

SELECT   *

 FROM   dba_indexes

WHERE   tablespace_name = 'SYSTEM' AND owner NOT IN ('SYS', 'SYSTEM')

二、索引的儲存情況檢查

Oracle為資料庫中的所有資料分配邏輯結構空間。資料庫空間的單位是block、extent和segment。

Block:是Oracle使用和分配的最小儲存單位。它是由資料庫建立時設定的DB_BLOCK_SIZE決定的。一旦資料庫產生了,資料區塊的大小不能改 變。要想改變只能重建立立資料庫。

Extent:是由一組連續的block組成的。一個或多個extent組成一個segment。當一個segment中的所有空間被用完時,Oracle為它 分配一個新的extent。

Segment:是由一個或多個extent組成的。它包含某資料表空間中特定邏輯儲存結構的所有資料。一個段中的extent可以是不連續的, 甚至可以在不同的資料檔案中。

可以參考:

資料表空間(tableSpace) 段(segment) 盤區(extent) 塊(block) 關係

http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4962476.aspx

一個object只能對應於一個邏輯儲存的segment,我們通過查看該segment中的extent,可以看出相應object的儲存情況。

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

/* Formatted on 2010/6/19 13:47:34 (QP5 v5.115.810.9015) */

 SELECT   segment_name, COUNT ( * )

   FROM   dba_extents

  WHERE   segment_type = 'INDEX' AND owner = UPPER ('NEWCCS')

   GROUP BY   segment_name

(2)查看錶空間內的索引的擴充情況:

/* Formatted on 2010/6/19 14:05:23 (QP5 v5.115.810.9015) */

 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 ('NEWCCS'))

GROUP BY   segment_name, bytes

ORDER BY   segment_name

三、索引的選擇性

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果一個表中有2000條記錄,表索引列有1980個不同的值,那麼這個索引的選 擇性就是1980/2000=0.99。一個索引的選擇性越接近於1,這個索引的效率就越高。

如果是使用基於cost的最佳化,最佳化器不應該使用選擇性不好的索引。如果是使用基於rule的最佳化,最佳化器在確定執行路徑時不會考慮索 引的選擇性(除非是唯一性索引),並且不得不手工最佳化查詢以避免使用非選擇性的索引。

確定索引的選擇性,可以有兩種方法:手工測量 和 自動測量。

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

如果要根據一個表的兩列建立兩列共置索引,可以用以下方法測量索引的選擇性:

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

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

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

查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

手工方法的優點是在建立索引前就能評估索引的選擇性。

(2)自動測量索引的選擇性

如果分析一個表,也會自動分析所有表的索引。

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

analyze table 表名 compute statistics

第二,確定索引裡不同關鍵字的數目:

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

第三,確定表中行的總數:

select num_rows from user_tables where table_name="表名"

第四,索引的選擇性=索引裡不同關鍵字的數目/表中行的總數:

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以瞭解每個列的選擇性。

表中所有行在該列的不同值的數目:

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

列的選擇性=NUM_DISTINCT/表中所有行的總數,查詢USER_TAB_COLUMNS有助測量每個列的選擇性,但它並不能精確地測量列的共置組合的選 擇性。要想測量一組列的選擇性,需要採用手工方法或者根據這組列建立一個索引並重新分析表。

四、確定索引的實際片段

隨著資料庫的使用,不可避免地對基本表進行插入,更新和刪除,這樣導致葉子行在索引中被刪除,使該索引產生片段。插入刪除 越頻繁的表,索引片段的程度也越高。片段的產生使訪問和使用該索引的I/O成本增加。片段較高的索引必須重建以保持最佳效能。

(1)利用驗證索引命令對索引進行驗證。

這將有價值的索引資訊填入index_stats表。

validate index 使用者名稱.索引名

或者:

analyze index index_name validate structure;

注意:index_stats只儲存最近一次分析的結果

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

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

(3)如果索引的葉子行的片段超過10%,或者 index_stats中height > =4, 可以考慮對索引進行重建。

alter index 使用者名稱.索引名 rebuild  tablespace 資料表空間名  storage(initial 初始值 next 擴充值)  nologging

參考:如何加快建 index 索引 的時間

http://blog.csdn.net/tianlesoftware/archive/2010/06/11/5664019.aspx

DBA1群裡 長沙-Rourk33 同學提供的指令碼, 可以一次產生擴充大於10次的索引的指令碼。感謝Rourk33 同學。

/* Formatted on 2010/6/19 21:58:45 (QP5 v5.115.810.9015) */

SELECT   'alter index ' || owner || '.' || segment_name || ' rebuild;'

 FROM   (  SELECT   COUNT ( * ),

                    owner,

                    segment_name,

                    t.tablespace_name

             FROM   dba_extents t

            WHERE   t.segment_type = 'INDEX'

                    AND t.owner NOT IN ('SYS', 'SYSTEM')

         GROUP BY   owner, segment_name, t.tablespace_name

           HAVING   COUNT ( * ) > 10

         ORDER BY   COUNT ( * ) DESC);

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

alter index使用者名稱.索引名 coalesce

(5)清除分析資訊

  analyze index 使用者名稱.索引名 delete statistics

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.