Oracle优化——索引与ROWID的关系
mhr18 2024-09-18 20:21 19 浏览 0 评论
1. 索引的定义:
在关系数据库中、索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑索引清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表人SQL语句执行得更快,可快速访问数据库表中的特定信息。当表中有大量记录时,若要对表进行查询,在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
通过上面的描述可以总结为:
1. 索引是排充后存储的。
2. 索引存储了索引列和ROWID。
3. 通过索引可以快速的查找数据。
索引的存储结构可以用下图表示:
2. 索引的存储分析:
2.1. 导出索引块:
在Oracle中,块(block)是最小的存储单元,索引也是一种存储对像,导出一个块的内容可以用以下语句:
alter system dump datafile $file_id block $block_id ;
其中:
File_id 代表文件编号
Block_id 代表块(block)编号
执行以后语句后会在一个目录下生成一个文件,文件的路径可以通过以下语句进行查找:
select tracefile from v$process where pid = userenv('pid');
此语句要与上面的语句在同一个session中执行.
2.2. 索引块导出文件解读:
执行语句:
alter system dump datafile 4 block 179 ;
导出文件号为4,块号为179的块信息。
导出的文件与block的大小有关,及其存储的数据有关.
我们看一下与存储信息有关的一段数据:
row#0,row#1,row#2 可以看出该索引一共有三条数据,针对每一行数据
col 0 代表第一列,col 1代码第二列,len 代表数据长度
c1 代码数据类型,其表示一个整型数据,该列的后面表示存储的数据,以第一行为例
第一列的02代表索引列的数据,
第二列的01 00 00 bb 00 bb 代表的是与该索引列对应的行数据的ROWID.是以6字节存放的压缩后的ROWID.
与这个索引对应的真应数据如下:
索引为:
通过以上的信息与索引的存储也可以看出,索引不会维护空值。
下一篇帖子写一些优化的重点-执行计划有关的内容,涉及比较多,会分为几篇,欢迎关注
相关推荐
- 回归基础:访问 Kubernetes Pod(concurrent.futures访问数据库)
-
Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多概念。在这里,学习几种访问集群外pod的方法。Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多不同的...
- Spring 缓存神器 @Cacheable:3 分钟学会优化高频数据访问
-
在互联网应用中,高频数据查询(如商品详情、用户信息)往往成为性能瓶颈。每次请求都触发数据库查询,不仅增加服务器压力,还会导致响应延迟。Spring框架提供的@Cacheable注解,就像给方法加了一...
- linux开放外部端口访问(linux开放外部端口访问功能)
-
前言linux安装相关软件可能都需要允许外网访问,例如mysql、redis、kafka等,前些天一同事安装了mosquitto(Mqtt服务器),外网却无法访问,检查相关配置外还是不能访问。关于这个...
- JetCache 源码分析(jacoco源码分析)
-
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,...
- Prometheus实战教程:k8s平台-Redis监控案例
-
以下是Prometheus自动发现Redis实例的完整YAML文件示例,适用于生产环境。该配置包括:Redis部署:运行Redis实例。RedisExporter:用于暴露Red...
- 无锁编程设计(无锁并发编程)
-
什么是无锁编程LOCK-FREE,字面解释就是不通过锁来解决多线程、多进程之间的数据同步和访问的程序设计方案。相对来说就是通过数据结构和算法来解决数据并发冲突的实现方案。无锁编程的实现「比较并交换...
- Java项目线上订单突然卡死,原因是数据库死锁,如何全流程排查?
-
凌晨2点,运维群里发消息:“用户下单全卡死了!客服电话被打爆!”同时电话铃声响起,我揉了揉惺忪的睡眼,打开监控系统——数据库CPU飙到90%,活跃线程数突破天际,日志里赫然躺着几个大字:Deadlo...
- 秒杀系统"减库存"设计:核心概念、原理与实战案例全解析
-
在电商高并发战场中,减库存是秒杀系统的"心脏手术",本文将从三个维度揭示其技术本质。一、核心概念透视1.库存的生命周期模型预扣库存:交易链路中的缓冲地带(用户下单未支付)真实库存:物...
- Java高级开发面试题深度解析(2025版)
-
一、JVM与内存管理(高频考点)1.内存结构JVM内存分为堆、方法区、虚拟机栈、本地方法栈和程序计数器。堆是对象存储的核心区域,分为新生代(Eden、Survivor区)和老年代。o示例:new...
- Python面试题(java下一页)
-
操作系统1select,poll和epoll其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了.这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornad...
- 拒绝躺平,如何使用AOP的环绕通知实现分布式锁
-
如何在分布式环境下,像用synchronized关键字那样使用分布式锁。比如开发一个注解,叫@DistributionLock,作用于一个方法函数上,每次调方法前加锁,调完之后自动释放锁。可以利用Sp...
- 距离高级开发工程师,你还差这一步!并发、分布式编程锁之应用
-
什么是锁,锁有哪些锁是java并发编程中最重要的同步机制。它可使临界区互斥执行,部分锁可以通过一定的手段进行消息通讯。Java中有哪些锁?分布式锁实现分布式锁常用实现有1.数据库乐观锁;2.基于R...
- 面试官说项目太简单?三句话教你把增删改查讲成架构级项目!
-
面试官说项目太简单?三句话教你把增删改查讲成架构级项目!昨天帮一个兄弟看简历,他急得直拍键盘:我就写过CRUD,这能找什么工作?结果我用三招把他的商城项目包装成千万级架构,当场拿下字节面试!第一招:量...
- 一把“乐观锁”轻松搞定高并发下的幂等性问题(附视频教程)
-
什么是幂等性?幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,...
- 一文搞懂 Redis 的 RDB 持久化技术,大厂开发必备
-
在互联网大厂后端开发领域,Redis凭借其高性能、高并发的特点,成为了众多项目中不可或缺的数据存储工具。无论是缓存热点数据,还是处理实时计数器,Redis都能轻松应对。然而,Redis作为内存数...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 回归基础:访问 Kubernetes Pod(concurrent.futures访问数据库)
- Spring 缓存神器 @Cacheable:3 分钟学会优化高频数据访问
- linux开放外部端口访问(linux开放外部端口访问功能)
- JetCache 源码分析(jacoco源码分析)
- Prometheus实战教程:k8s平台-Redis监控案例
- 无锁编程设计(无锁并发编程)
- Java项目线上订单突然卡死,原因是数据库死锁,如何全流程排查?
- 秒杀系统"减库存"设计:核心概念、原理与实战案例全解析
- Java高级开发面试题深度解析(2025版)
- Python面试题(java下一页)
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)