Oracle資料庫中索引的維護 1

2021-08-30 04:48:07 字數 2989 閱讀 6085

本文只討論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索引的實現 索引是用於加速資料訪問的資料物件,合理的使用索引...