文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle索引扫描

2024-04-02 19:55

关注
  1. 索引唯一扫描:是针对唯一性索引大扫描,它仅仅适用于where条件里是等值查询的目标SQL,因为扫描的对象是唯一性索引,只扫描索引高度这么多个索引块就停止了,索引的唯一扫描的结果至多只返回一条记录,索引的唯一扫描,扫描索引高度-2个分支块,永远只扫描一个叶子块

  2. 索引范围扫描:索引范围扫描,扫描索引高度-2个分支快,要扫描N多叶子块,取决于where条件,索引范围扫描是单块读,因为物理存储是不连续的。select * from test where id<=1000;访问路径:ROOT -B1 -L1 -L7

     

 

 

 

索引是排序的,从左到右升序排,最左最小,最右做大,索引默认从左向右扫描,也可以加hint倒着扫描:

SQL> select *from test where object_id<=20;
19 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 1069979465
---------------------------------------------------------------------------------------
| Id  | Operation       | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |    19 |  3933 |     3 (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID | TEST   |    19 |  3933 |     3 (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN DESCENDING| IDX_ID |    19 |       |     2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------

3.索引的叶子块只存rowid和列的键值,比表的数据块存的更多的值,

select object_id from test where object_id<100;
select object_id from test where object_id<1000

性能是一样的,索引扫描最大问题在于回表,如果回表再过滤,就最坑爹了,错误的INDEX RANGE SCAN,返回数据很多和大量回表

4.反键索引,

如果用sequence作为主键,如果insert数据,会不断更新右边的叶子块,dml操作,同一个块,同时只有一个进程去持有,CBC持有,latch: cache buffers chains,在高并发的insert环境中,sequence主键很容易产生热点块,解决办法,把主键处理成随机的,比如手机号或者***号,如果已经用sequence,可用反转索引把叶子块打乱来解决。另外一种解决办法:sid+sequence+pid,反键索引多范围扫描影响大。

5. INDEX SKIP SCAN 索引跳跃扫描。单块读 只可能发生在组合索引上,引导列(组合索引第一列)没有包含在where条件中,并且引导列基数很低。INDEX SKIP SCAN 一般来说只会返回少量数据,如果返回大量数据,说明该执 行计划可能有问题,也就是说索引建立不对。等待事件:db file sequential read HINT: INDEX_SS(表名/别名 索引名)

6.INDEX FULL SCAN (MIN/MAX) 索引最小/最大值扫描。单块读 通常发生在 select max(xxx) 或者
select min(xxx)并且xxx列上有索引。
等待事件:db file sequential read 我们几乎观察不到,因为只需读
取索引高度相同的index block数。
HINT 无需指定,有索引会自动走INDEX FULL SCAN(MIN/MAX)
把select max(id) ,min(id) from test;

改成select (select max(id) from test) max,(select min(id) from test) min from dual,如果不改写,需要扫描所有的叶子块,为index full scan

==index uniqe scan ,index range scan,index skip scan 发生以上3种扫描方式的重大前提是必须有where条件,而index full scan和index fast full scan不需要where条件也可以走,

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯