oracle 索引優化之distinct
11G R2環境:
--DISTINCT測試前的準備drop table t purge;create table t as select * from dba_objects;update t set object_id=rownum;alter table T modify OBJECT_ID not null;update t set object_id=2;update t set object_id=3 where rownum<=25000;commit;
/****在oracle10g的R2環境之後,DISTINCT由於其 HASH UNIQUE的演算法導致其不會產生排序,其調整的 ALTER SESSION SET "_gby_hash_aggregation_enabled" = FALSE****/set linesize 1000set autotrace traceonly
select distinct object_id from t ;執行計劃:
可以看出以上語句執行計劃,佔用記憶體1448k,邏輯讀1276。
/*不過雖然沒有排序,通過觀察TempSpc可知distinct消耗PGA記憶體進行HASH UNIQUE運算,接下來看看建了索引後的情況,TempSpc關鍵字立即消失,COST也立即下降許多,具體如下*/
--為T表的object_id列建索引create index idx_t_object_id on t(object_id);set linesize 1000set autotrace traceonly
select /*+index(t)*/ distinct object_id from t ;
可以看出cost525,走的索引,沒有進行排序,邏輯讀也降低了176。