1、選擇性
oracle根據查詢和資料,提供了多種方法來判斷使用索引的價值。第乙個方法是判斷索引中的唯一鍵或不同鍵的數量。使用user_indexes檢視,該檢視中顯示了distinct_keys列。比較一下唯一鍵的數量和表中的行數,就可以判斷索引的選擇性。選擇性越高,索引返回的資料就越少。索引的選擇性可以幫助基於代價的優化器來判斷執行途徑。
sql> select index_name,table_name,num_rows,distinct_keys from user_indexes;
index_name table_na num_rows distinct_keys
pk_dept dept 4 4
pk_emp emp 14 14
empt_id1 empt 14 14
empt_id2 empt 14 12
bank_id bank 2 2
已選擇6行。
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980/2000=0.99。
乙個索引的選擇性越接近於1,這個索引的效率就越高。
如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於 rule的最優化,優化器在確定執行路徑時不會考慮索引的選擇性(除非是唯一性索引),並 且不得不手工優化查詢以避免使用非選擇性的索引。
確定索引的選擇性,可以有兩種方法:手工測量和自動測量。
(1)手工測量索引的選擇性
如果要根據乙個表的兩列建立兩列並置索引,可以用以下方法測量索引的選擇性:
列的選擇性=不同值的數目/行的總數 /* 越接近1越好 */
select count(distinct 第一列||'%'||第二列)/count(*) from 表名 /
select count(distinct status||'%'||owner)/count(*) from test; /
如果我們知道其中一列索引的選擇性(例如其中一列是主鍵),那麼我們就可以知道另一列索引的選擇性。
手工方法的優點是在建立索引前就能評估索引的選擇性。
(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有助測量每個列 的選擇性,但它並不能精確地測量列的並置組合的選擇性。要想測量一組列的選擇性,需要 採用手工方法或者根據這組列建立乙個索引並重新分析表。
索引 選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...
mysql選擇性 Mysql索引的選擇性
對於索引的使用,mysql並不一直都是用採用正確的決定的。參考乙個簡單的表 create table r2 id int 11 default null,id1 int 11 default null,cname varchar 32 default null,key id1 id1 engine ...
索引的選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...