程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫中的最常用的索引有哪些

Oracle數據庫中的最常用的索引有哪些

編輯:Oracle數據庫基礎

在Oracle數據庫中的相關索引的維護中此文章主要討論Oracle中最為常見的相關索引,即,B-tree索引,數據庫版本為Oracle8i。以下就是具體方案的描述,希望在你今後的學習中會有所幫助。

一. 查看系統表中的用戶索引

在Oracle中,SYSTEM表是安裝數據庫時自動建立的,它包含數據庫的全部數據字典,存儲過程、包、函數和觸發器的定義以及系統回滾段。

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

  1. select count(*)   
  2. from dba_indexes  
  3. where tablespace_name = 'SYSTEM' 
  4. and owner not in ('SYS','SYSTEM')  
  5. /  

二. 索引的存儲情況檢查

Oracle為數據庫中的所有數據分配邏輯結構空間。數據庫空間的單位是數據塊(block)、范圍(extent)和段(segment)。

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

Extent是由一組連續的block組成的。一個或多個extent組成一個segment。當一個segment中的所有空間被用完時,Oracle為它分配一個新的extent。
 
Segment是由一個或多個extent組成的。它包含某表空間中特定邏輯存儲結構的所有數據。一個段中的extent可以是不連續的,甚至可以在不同的數據文件中。

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

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

  1. select segment_name, count(*)   
  2. from dba_extents  
  3. where segment_type='INDEX' 
  4. and owner=UPPER('&owner')   
  5. group by segment_name  
  6. /  

(2)查看表空間內的索引的擴展情況:

  1. select  
  2. substr(segment_name,1,20) "SEGMENT NAME",  
  3. bytes,   
  4. count(bytes)   
  5. from dba_extents   
  6. where segment_name in  
  7. ( select index_name   
  8. from dba_indexes   
  9. where tablespace_name=UPPER('&表空間'))  
  10. group by segment_name,bytes  
  11. order by segment_name  
  12. /  

三. 索引的選擇性

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

一個索引的選擇性越接近於1,這個索引的效率就越高。

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

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

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

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

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

  1. select count(distinct 第一列||'%'||第二列)/count(*)  
  2. from 表名  
  3. /   

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

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

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

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

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

  1. analyze table 表名   
  2. compute statistics  
  3. /  

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

  1. select distinct_keys  
  2. from user_indexes  
  3. where table_name='表名' 
  4. and index_name='索引名' 
  5. /  

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

  1. select num_rows  
  2. from user_tables  
  3. where table_name='表名' 
  4. /  

以上的相關內容就是Oracle數據庫中索引的維護的部分內容的介紹,望你能有所收獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved