共計 2733 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇文章主要講解了“oracle 索引相關知識有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“oracle 索引相關知識有哪些”吧!
一、什么是執行計劃
所謂執行計劃,就是在執行一個 SQL 前,做出的一份數據庫認為最佳的方案。好比在北京上班,是做地鐵去還是公交車亦或開車自駕等等。如果做地鐵,需要從哪兒換成之類的,… … 從各種方案中選擇一個自認為最佳的方案。這個方案在數據庫里面即為執行計劃。己認為最合適的方案。
二、解析的概念
解析就是為 sql 生成執行計劃的過程。解析分為軟解析和硬解析。
三、統計信息與動態采樣
統計信息的作用就是為解析 sql 提供的數據支持,也就是為了更好的選擇執行計劃。簡單說就是統計信息反映表中數據分布的情況。
如果統計信息沒有收集,數據庫在解析 sql 的過程中會根據一定的比例去表中采樣,采樣的結果作為 sql 執行路徑所需代價的依據。這就是動態采樣。
四、NULL 這個特殊的東西
NULL 是個特殊的一個存在。
從定義上來講,NULL 就是一個不確定的數據。所以無論對 NULL 做任何操作,結果還是 NULL。
另外,對于 oracle 數據庫來說,索引里面沒有 null,索引里面沒有 NULL 會有什么影響呢?哈哈,見“索引快速全掃描”部分。
五、索引相關執行計劃 (補充索引選擇性的概念)
1 全表掃描(full table scan)
1) 測試數據
create table t1 as select * from dba_objects;
2)看執行計劃
explain plan for select * from t1 where t1.object_id=19791;
select * from table(dbms_xplan.display());
3)注意動態采樣與 filter
2 索引唯一掃描 (index unique scan)
1)創建唯一性索引
create unique index t1_objectid on t1(object_id);
2)收集統計信息
exec dbms_stats.gather_table_stats(ZQ , T1 ,cascade= true);
3) 查看執行計劃
explain plan for select * from t1 where t1.object_id=19791;
select * from table(dbms_xplan.display());
4)注意動態采樣的消失與 access
3 索引范圍掃描 (index range scan)
1)測試數據
create table t2 as select * from dba_objects;
2) 創建非唯一性索引
create index t2_objectid on t2(object_id);
3) 收集統計信息
exec dbms_stats.gather_table_stats(ZQ , T2 ,cascade= true);
4)查看執行計劃
explain plan for select * from t2 where t2.object_id=19791;
select * from table(dbms_xplan.display());
5)查看執行計劃
explain plan for select * from t1 where t1.object_id 131790;
select * from table(dbms_xplan.display());
4 索引快速全掃描 (index fast full scan)
1) 查看執行計劃
explain plan for select /*+index(t2 t2_objectid)*/object_id from t2 order by object_id;
select * from table(dbms_xplan.display());
– 走全表掃描
insert into t2 select * from t2;
commit;
insert into t2 select * from t2;
commit;
2) 收集統計信息,然后看執行計劃
exec dbms_stats.gather_table_stats(ZQ , T1 ,cascade= true);
explain plan for select object_id from t2 order by object_id;
select * from table(dbms_xplan.display());
– 走全表掃描
3)創建組合索引, 并收集統計信息
create index t2_id_name on t2(object_id,object_name);
exec dbms_stats.gather_table_stats(ZQ , T2 ,cascade= true);
explain plan for select object_id,object_name from t2;
select * from table(dbms_xplan.display());
– 走全表掃描
explain plan for select /*+index(t2,t2_id_name)*/object_id,object_name from t2;
select * from table(dbms_xplan.display());
——————— 為啥,哈哈哈哈哈哈,not null
4) object_id 字段設置成 not Null,走索引快速掃描
alter table t2 modify object_id not null;
explain plan for select /*+index(t2,t2_id_name)*/object_id,object_name from t2;
select * from table(dbms_xplan.display());
4) 使用 count,索引全掃描
explain plan for select count(object_id) from t2 ;
select * from table(dbms_xplan.display());
5 索引全掃描 (index full scan)
1)查看執行計劃
explain plan for select t1.object_id from t1 order by t1.object_id;
select * from table(dbms_xplan.display());
– 注意索引快速全掃描無序,索引全掃描有序
感謝各位的閱讀,以上就是“oracle 索引相關知識有哪些”的內容了,經過本文的學習后,相信大家對 oracle 索引相關知識有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!