oracle索引相关知识有哪些

37次阅读
没有评论

共计 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 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计2733字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)