首页 > 数据库 >《Oracle Concept》第三章 - 5

《Oracle Concept》第三章 - 5

时间:2023-06-19 13:05:32浏览次数:45  
标签:检索 Concept 第三章 读取 数据库 扫描 索引 Oracle


背景:

按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。




本文主题:第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。


索引扫描

在索引扫描中,数据库会在语句中指定索引列值,遍历索引来提取数据。如果数据库扫描索引,他会消耗N次IO来得到需要的值,这里N是B树索引的高度。这就是Oracle数据库索引的基本原则。


如果一条SQL语句仅仅会访问索引列,那么数据库会直接从索引读取该值,不会从表中检索,即无需回表。如果语句需要访问除索引列外的其他列,则数据库会使用rowid定位表中的行。通常,数据库检索数据会读取一个索引块和一个表块。


可以参考:
《Oracle Database Performance Tuning Guide》了解关于索引扫描的详细信息。


全索引扫描

在全索引扫描中,数据库会按序读取整个索引。如果SQL中的谓词(WHERE子句)引用了索引中的一列,或者某些场景下未指定谓词,就会使用全索引扫描。由于全索引扫描中数据是按照索引键值排序的,因此这种扫描消除了排序。


假设应用运行下面的查询:

《Oracle Concept》第三章 - 5_数据库

假设department_id,last_name和salary是复合索引键值。Oralce数据库会执行全索引扫描,按序(department_id和last_name)读取,并且使用salary字段作为过滤的条件。使用这种方法,数据库会扫描比employees表更小的数据集,因为所有检索列都包含在查询中了,避免了数据排序。


全扫描会读取整个索引,如下所示:

《Oracle Concept》第三章 - 5_数据库_02


快速全索引扫描

快速全索引扫描是一种无需访问表的全索引扫描,数据库会无序地读取索引数据块。


快速全索引扫描是全表扫描的补充,他的执行需要满足以下条件:

  • 索引必须包含检索中的所有列。
  • 检索结果集中不会出现全空(null)的行。为了满足此要求,索引列至少满足以下条件之一:
    NOT NULL约束。
    在检索结果集中考虑谓词指定避免null空值。

例如,应用使用如下的检索语句,不包含ORDER BY子句中:

《Oracle Concept》第三章 - 5_数据库_03


last_name列拥有NOT NULL约束。如果last_name和salary是复合索引键值,那么就会出现快速全索引扫描读取整个索引来获取请求的信息:

《Oracle Concept》第三章 - 5_键值_04

标签:检索,Concept,第三章,读取,数据库,扫描,索引,Oracle
From: https://blog.51cto.com/u_13950417/6512442

相关文章

  • 如何根据v$parameter查询Oracle隐含参数
    Oracle的隐含参数在Oracle的官方文档中是不会出现的,这些参数主要是Oracle内部用于控制某些功能的开关,或者就像今天eygle讲的,Oracle牛逼之处就是可能几年前开发的一个功能就放到当时的版本中,让你“试用”,但你却不知道,如果碰巧因为遇见了这个问题的bug,Oracle会告诉你可以使用这个参数......
  • Oracle的体系结构图万花筒
    虽然现在Oracle的版本频繁更新,但万变不离其宗,学习Oracle最重要的一张图就是Oracle体系结构图,由他延展开来的知识可谓是相当丰富,要是能讲清楚这张图,可以说你和大师很近了。这是来自杨大师公众号的一篇文章,汇总了各版本,Oracle高清体系结构图,《【图示篇】_Oracle10g,11g,12c,18c结构......
  • 非Oracle Linux下安装Oracle 19c
    《Oracle19c之RPM安装》介绍了在OracleLinux平台下安装Oracle19c的过程,其实无论是19c,还是11g,用OracleLinux会为你省不少的事情,毕竟同为Oracle产品,从推广角度看,肯定会相对其他平台提供更多的便利性,例如提前预安装了需要的Package,设置了信号量,创建了各种账号、路径和权限。这次采......
  • OpenJDK和Oracle JDK有什么区别和联系?
    《Linux7安装Oracle11g打怪经历》的安装过程中,启动图形界面,需要指定jre路径,当时使用yuminstalljdk安装的,并不能解决问题,查看版本才知道他是OpenJDK,最终使用OracleJDK,才解决的问题,那OpenJDK和OracleJDK究竟有什么区别?OpenJDKJava最早由SUN公司(SunMicrosystems,发起于美国斯坦......
  • Linux 7安装Oracle 11g打怪经历
    最近接到个需求,要将一套开发环境中Linux6平台的Oracle11g,迁移到两套Linux7平台,原以为很简单,但过程中,确实历经坎坷,就像过山车一般,解决这个问题,又碰到下一个。软件信息RedHatLinux7.5Oracle11.2.0.4坑坑坑1.软链接为了安装路径的标准和简便,可以使用软链接,语法如下,ln-s【目标......
  • 非Oracle Linux下Oracle 19c CDB数据库安装
    《非OracleLinux下安装Oracle19c》我们安装了non-cdb的19c数据库,通过这个脚本,还可以搭建cdb的数据库。1.修改安装脚本cp/etc/init.d/oracledb_ORCLCDB-19c/etc/init.d/oracledb_pdbisal-19c其中要改几处,ORACLE_SID改成新的,LISTENER_NAME改成新的,CREATE_AS_CDB之前我写的false,......
  • Oracle优化器对谓词顺序处理的一个场景
    最近听了个讲座,其中介绍到了Oracle的谓词,原始版本的例子,如下所示,从数据上能看到,c1='3'的时候,c2的值是个字符串类型的数字,SQL>createtabletest(c1char(1),c2varchar2(1));Tablecreated.SQL>insertintotestvalues('1','A');1rowcreated.SQL>insertintotes......
  • Windows调试Oracle数据库问题的一些手段
    最近需要在Windows的跳板机上访问远程的Oracle数据库进行调试。Windows中只有个精简版OracleClient,以及PLSQLDeveloper客户端。如果用惯了Linux,再用Windows,确实不知所措。但这就是个从生疏到熟练的事儿,最近看的一本书中描述得很恰当,Themosteffectivewaytodealwithaworry......
  • 《Oracle Concept》第三章 - 4
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。B树索引B树索引,是平衡树的缩写,他是数据库索引中最常用的一种类型。一个B树索引是一种将数值有序划分到不......
  • oracle固定执行计划
    文档课题:oracle固定执行计划.本文介绍oracle固定执行计划的2种方法,outline,SQLProfile,其中SQLProfile是重点。1、outline1.1、相关概念开发环境中SQL的执行无问题,但在生产环境执行效率却异常缓慢。若此时更改SQL需重新修改及编译源程序,成本非常高。此时可使用outline在不改变......