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 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM