本文只討論oracle中最常見的索引,即是b-tree索引。本文中涉及的
資料庫
版本是oracle8i。
一. 檢視系統表中的使用者索引
在oracle中,system表是安裝資料庫時自動建立的,它包含資料庫的全部資料字典,儲存過程、包、函式和觸發器的定義以及系統回滾段。
一般來說,應該盡量避免在system表中儲存非system使用者的物件。因為這樣會帶來資料庫維護和
管理
的很多問題。一旦system表損壞了,只能重新生成資料庫。我們可以用下面的語句來檢查在system表內有沒有其他使用者的索引存在。
select count(*)
from dba_indexes
where tablespace_name = 'system'
and owner not in ('sys','system')
/二. 索引的儲存情況檢查
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的數量:
select segment_name, count(*)
from dba_extents
where segment_type='index'
and wner=upper('&owner')
group by segment_name
/(2)檢視表空間內的索引的擴充套件情況:
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
/三. 索引的選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980/2000=0.99。
乙個索引的選擇性越接近於1,這個索引的效率就越高。
如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於rule的最優化,優化器在確定執行路徑時不會考慮索引的選擇性(除非是唯一性索引),並且不得不手工優化查詢以避免使用非選擇性的索引。
確定索引的選擇性,可以有兩種方法:手工測量和自動測量。
(1)手工測量索引的選擇性
如果要根據乙個表的兩列建立兩列並置索引,可以用以下方法測量索引的選擇性:
列的選擇性=不同值的數目/行的總數 /* 越接近1越好 */
select count(distinct 第一列||'%'||第二列)/count(*)
from 表名
/如果我們知道其中一列索引的選擇性(例如其中一列是主鍵),那麼我們就可以知道另一列索引的選擇性。
手工方法的優點是在建立索引前就能評估索引的選擇性。
(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有助測量每個列的選擇性,但它並不能精確地測量列的並置組合的選擇性。要想測量一組列的選擇性,需要採用手工方法或者根據這組列建立乙個索引並重新分析表。
Oracle 資料庫中的索引
在oracle資料庫中的資料,每一行都是用rowid來標識的,rowid能夠標識資料庫中的某一行的具體位置,在資料庫中存有大量資料時,要能找找到具體的某乙個資料 rowid 這個時候就需要索引物件。1 索引的工作原理 在乙個擁有大量資料的表中進行查詢時,如果沒有建立索引,肯定會全表查詢,然後再將查詢...
Oracle資料庫中的索引(一)
oracle中的索引非常多,也非常複雜,但是對於oracle的開發人員和系統管理員來說,索引至關重要,因為使用了恰當的索引,將會大大提高資料庫的訪問效能,否則就有可能使系統處於泥潭當中,不能自拔。這篇文章只是自己的總結,不可能對oracle當中的所有索引都進行剖析 也沒有這個能力 希望能對你有所幫助...
Oracle資料庫索引
標籤 資料庫 oracle 索引index 2013 06 14 16 54 4148人閱讀收藏 舉報 database 6 目錄 索引基本概念 索引的作用 索引的架構 oracle索引的型別 1 基於函式的索引 2 位圖索引 oracle索引的實現 索引是用於加速資料訪問的資料物件,合理的使用索引...