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 1000
set 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 1000
set autotrace traceonly
select /*+index(t)*/ distinct object_id from t ;

可以看出cost降低到525,走的索引,沒有進行排序,邏輯讀也降低了到176。
