Oracle資料庫中索引的維護 (轉帖)
Oracle資料庫中索引的維護
柏柯嘉
本文只討論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 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
/
三. 索引的選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果一個表中有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有助測量每個列的選擇性,但它並不能精確地測量列的並置組合的選擇性。要想
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/631872/viewspace-816079/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫中索引的維護(轉)Oracle資料庫索引
- Oracle資料庫中索引的維護 ztOracle資料庫索引
- Oracle資料庫中索引的維護(zt)Oracle資料庫索引
- 【轉】Oracle資料庫日常維護手冊Oracle資料庫
- Oracle 索引的維護Oracle索引
- Oracle資料庫日常維護Oracle資料庫
- Oracle資料庫密碼檔案的使用和維護(轉)Oracle資料庫密碼
- Oracle資料庫維護的重要性Oracle資料庫
- ORACLE資料庫管理維護綱要Oracle資料庫
- 【Oracle】Oracle 11g 中的自動資料庫維護任務管理Oracle資料庫
- Oracle資料庫日常維護手冊 (zt)Oracle資料庫
- oracle資料庫中索引空間的重用Oracle資料庫索引
- 維護資料庫安全資料庫
- oracle 資料庫效能健康檢查指令碼[轉帖]Oracle資料庫指令碼
- 【Oracle-資料庫維護】-Oracle中USERENV和SYS_CONTEXT總結Oracle資料庫Context
- ORACLE資料庫日常維護知識總結Oracle資料庫
- Oracle資料庫維護常用SQL語句集合Oracle資料庫SQL
- Oracle資料庫索引使用及索引失效總結 轉Oracle資料庫索引
- oracle基礎練習11-15章 索引維護、資料庫完整性等Oracle索引資料庫
- 樹型結構資料在資料庫基本表中的儲存及維護 (轉)資料庫
- ORACLE資料庫日常維護的九大知識點Oracle資料庫
- Oracle資料庫維護常用的SQL程式碼示例(zt)Oracle資料庫SQL
- 資料庫常用維護命令資料庫
- SQL Server調優系列進階篇(如何維護資料庫索引)SQLServer資料庫索引
- 資料庫索引原理-轉資料庫索引
- 玩轉資料庫索引資料庫索引
- 六、資料庫管理與維護資料庫
- oralce動態維護資料庫的序列資料庫
- 保護Oracle資料庫的安全Oracle資料庫
- 對產品資料庫建立與維護機制的探索(轉)資料庫
- Notes隱藏資料庫設計應用的維護 (轉)資料庫
- 關於 Oracle 分割槽索引的建立和維護Oracle索引
- Oracle資料庫中的不可見索引 invisible indexOracle資料庫索引Index
- SAP中的資料庫表索引資料庫索引
- 【Oracle-資料庫維護】-刪除臨時表空間Oracle資料庫
- 為資料庫建立索引(轉)資料庫索引
- 從例項看oracle的索引監控與無效索引維護Oracle索引
- 概述Oracle中的資料庫名---轉載Oracle資料庫