本文只討論Oracle中最常見的索引
在Oracle中
一般來說
二select count(*) from dba_indexes where tablespace_name =
SYSTEM and owner not in ( SYS SYSTEM )
Oracle為數據庫中的所有數據分配邏輯結構空間
Oracle數據塊(block)是Oracle使用和分配的最小存儲單位
Extent是由一組連續的block組成的
Segment是由一個或多個extent組成的
一個object只能對應於一個邏輯存儲的segment
(
select segment_name
count(*) from dba_extents where segment_type= INDEX and owner=UPPER( &owner ) group by segment_name /
(
三select substr(segment_name
) 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 /
索引的選擇性是指索引列中不同值的數目與表中記錄數的比
一個索引的選擇性越接近於
如果是使用基於cost的最優化
確定索引的選擇性
(
如果要根據一個表的兩列創建兩列並置索引
列的選擇性=不同值的數目/行的總數 /* 越接近
select count(distinct 第一列||
% ||第二列)/count(*) from 表名
如果我們知道其中一列索引的選擇性(例如其中一列是主鍵)
手工方法的優點是在創建索引前就能評估索引的選擇性
(
如果分析一個表
第一
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 itable_name= 表名 and i index_name= 索引名 and i table_name=t table_name
第五
表中所有行在該列的不同值的數目
select column_name
num_distinct from user_tab_columns where table_name= 表名
列的選擇性=NUM_DISTINCT/表中所有行的總數
隨著數據庫的使用
(
這將有價值的索引信息填入index_stats表
validate index 用戶名
索引名
(
select name
del_lf_rows lf_rows round((del_lf_rows/(lf_rows+ ))* ) Frag Percent
from index_stats
(
alter index 用戶名
索引名 rebuild tablespace 表空間名 storage(initial 初始值 next 擴展值) nologging
(
alter index用戶名
索引名 coalesce
(
五analyze index 用戶名
索引名 delete statistics
(
根據以下幾方面進行檢查
第一
為了避免數據字典的碎片出現
select index_name from dba_indexes where tablespace_name=
SYSTEM and owner not in ( SYS SYSTEM )
第二
表和索引對象的第一個規則是把表和索引分離
set linesize
col OWNER format a col INDEX format a col TABLE format a col TABLESPACE format a select i owner OWNER i index_name INDEX t table_name TABLE i tablespace_name TABLESPACE from dba_indexes i dba_tables t where i owner=t owner and i table_name=t table_name and i tablespace_name=t tablespace_name and i owner not in ( SYS SYSTEM ) /
第三
用戶的默認表空間應該不是SYSTEM表空間
col segment_name format a
select owner segment_name sum(bytes)
from dba_segments
where tablespace_name=數據表空間名
and segment_type=INDEX
group by ownersegment_name
/
第四
隨著表記錄的增加
set linesize
col owner format a col segment_name format a col tablespace_name format a select count(*) owner segment_name tablespace_name from dba_extents where segment_type= INDEX and owner not in ( SYS SYSTEM ) group by owner segment_name tablespace_name having count(*) > order by count(*) desc /
(
set linesize
col INDEX format a col TABLESPACE format a select owner OWNER segment_name INDEX tablespace_name TABLESPACE bytes BYTES/COUNT sum(bytes) TOTAL BYTES round(sum(bytes)/( * ) ) TOTAL M count(bytes) TOTAL COUNT from dba_extents where segment_type= INDEX and segment_name in ( 索引名 索引名 ) group by owner segment_name segment_type tablespace_name bytes order by owner segment_name /
(
確定要把索引重建到哪個索引表空間中
select round(bytes/(
* ) ) free(M) from sm$ts_free where tablespace_name= 表空間名 /
(
重建索引時要注意以下幾點
a
b
c
alter index 索引名 rebuild tablespace 索引表空間名 storage(initial 初始值 next 擴展值) nologging /
(
對重建好的索引進行檢查
select * from dba_extents where segment_name=
索引名
(
使用相應的where條件進行查詢
select * from dba_ind_columns where index_name like
表名%
然後
select * from
表名% where
(
重建索引後
select
alter tablespace ||tablespace_name|| coalesce; from dba_free_space_coalesced where percent_blocks_coalesced!= /
整理表空間的碎片
alter tablespace 表空間名 coalesce
From:http://tw.wingwit.com/Article/program/Oracle/201311/18791.html