Oracle數據庫中索引的維護

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


在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 owner=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

/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章