oracle中的index函数,Oracle中的索引详解(整理)

2023-05-16

一、 ROWID的概念

存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /,

row在数据块中的存储方式

SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20;

比 如:OOOOOOFFFBBBBBBRRR

OOOOOO:data object number, 对应dba_objects.data_object_id

FFF:file#, 对应v$datafile.file#

BBBBBB:block#

RRR:row#

Dbms_rowid包

SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual;

具 体到特定的物理文件

二、 索引的概念

1、 类似书的目录结构

2、 Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度

3、 索引直接指向包含所查询值的行的位置,减少磁盘I/O

4、 与所索引的表是相互独立的物理结构

5、 Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引

6、 语法:CREATE INDEX index ON table (column[, column]...);

7、 B-tree结构(非bitmap):

[一]了解索引的工作原理:

表:emp

33f18b16-c511-4422-8818-3979b2232298.jpg

目标:查询Frank的工资salary

建立索 引:create index emp_name_idx on emp(name);

071516c2-436a-47c6-9554-79360e8c9092.jpg

393d092c-f18f-4521-be4d-c7808464aaaf.jpg[试验]测试索引的作用:

1. 运行/rdbms/admin/utlxplan 脚本

2. 建立测试表

create table t as select * from dba_objects;

insert into t select * from t;

create table indextable

as select rownum id,owner,object_name,subobject_name,

object_id,data_object_id,object_type,created

from t;

3. set autotrace trace explain

4. set timing on

5. 分析表,可以得到cost

6. 查询 object_name=’DBA_INDEXES’

7. 在object_name列上建立索引

8. 再查询

[思考]索引的代价:

插入,更新

三、索引的分类

逻辑分类:

唯一索引/非唯一索引:对某一列或几列的键值(key)是否是唯一的,当某列任意两行的值都不相同时适合创建唯一索引(CREATE UNIQUE INDEX index ON table

(column););当表建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立;

对一列或多列建的索引:索引分离于表,作为一个单独的个体存在,除了可以根据单个字段创建索引,也可以根据多列创建索引。Oracle要求创建索引最多不可超过32列。

基于函数(function-based)的索引:基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率;

组合索引:当两个或多个列经常一起出现在where条件中时,则适合在这些列上同时创建组合索引;

域(domain)索引:索引数据库以外的数据,使用相对较少;

物理分类:

B*树(B-tree)索引(默认方式):Root为根节点,branch 为分支节点,leaf 到最下面一层称为叶子节点。每个节点表示一层,当查找某一数据时先读根节点,再读支节

点,最后找到叶子节点。叶子节点会存放index entry (索引入口),每个索引入口对应一条记录(key的值、长度、rowid等)

反向键(reverse key)索引:

位图(bitmap)索引:位图索引主要针对大量相同值的列而创建,位图索引通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。

四、 唯一索引

1、 何时创建:当某列任意两行的值都不相同

2、 当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立

3、 语法:CREATE UNIQUE INDEX index ON table (column);

4、 演示

五、 组合索引

1、 何时创建:当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引

2、 组合索引中列的顺序是任意的,也无需相邻。但是建议将最频繁访问的列放在列表的最前面

3、 演示(组合列,单独列)

六、 位图索引

1、 何时创建:

列中有非常多的重复的值时候。例如某列保存了 “性别”信息。

Where 条件中包含了很多OR操作符。

较少的update操作,因为要相应的跟新所有的bitmap

2、 结构:位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。

3、 优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多

4、 语法:CREATE BITMAP INDEX index ON table (column[, column]...);

5、 掩饰:

create table bitmaptable as select * from indextable where owner in('SYS','PUBLIC');

分析,查找,建立索引,查找

七、 基于函数的索引

1、 何时创建:在WHERE条件语句中包含函数或者表达式时

2、 函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。

3、 语法:CREATE INDEX index ON table (FUNCTION(column));

4、 演示

必须要分析表,并且 query_rewrite_enabled=TRUE

或者使用提示/*+ INDEX(ic_index)*/

八、 反向键索引

目的:比如索引值是一个自动增长的列:

10af6ec5-cbb9-4987-9a5f-3747accfc3c5.jpg

多个用户对集中在少数块上的索引行进行修改,容易引起资源的争用,比如对数据块的等待。此时建立反向索 引。

性能问题:

语法:

重建为标准索引:反之不行

九、 键压缩索引

比如表landscp的数据如下:

site feature job

Britten Park, Rose Bed 1, Prune

Britten Park, Rose Bed 1, Mulch

Britten Park, Rose Bed 1,Spray

Britten Park, Shrub Bed 1, Mulch

Britten Park, Shrub Bed 1, Weed

Britten Park, Shrub Bed 1, Hoe

……

查询时,以上3列均在where条件中同时出现,所以建立基于以上3列的组合索引。但是发现重复值很多,所以考虑压缩特性。

Create index zip_idx

on landscp(site, feature, job)

compress 2;

将索引项分成前缀(prefix)和后缀(postfix)两部分。前两项被放置到前缀部分。

Prefix 0: Britten Park, Rose Bed 1

Prefix 1: Britten Park, Shrub Bed 1

实际所以的结构为:

0 Prune

0 Mulch

0 Spray

1 Mulch

1 Weed

1 Hoe

特点:组合索引的前缀部分具 有非选择性时,考虑使用压缩。减少I/O,增加性能。

十、 索引组织表(IOT)

将表中的数据按照索 引的结构存储在索引中,提高查询速度。

牺牲插入更新的性能,换取查询 性能。通常用于数据仓库,提供大量的查询,极少的插入修改工作。

必须指定主键。插入数据时,会根据主键列进行B树索引排序,写入磁盘。

十一、 分区索引

簇:

A cluster is a group of tables that share the same data blocks because they share common columns and are often used together.

58fc7a26-aff2-4bae-9d5e-4932d1e71538.jpg

十二、创建索引的一些规则:

1>、权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。

这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度,因为我们修改的表数据,索引也要跟着修改。这里需要权衡

我们的操作是查询多还是修改多。

2>、把索引与对应的表放在不同的表空间。

当读取一个表时表与索引是同时进行的。如果表与索引和在一个表空间里就会产生资源竞争,放在两个表这空就可并行执行。

3>、最好使用一样大小是块。

Oracle默认五块,读一次I/O,如果你定义6个块或10个块都需要读取两次I/O。最好是5的整数倍更能提高效率。

4>、如果一个表很大,建立索引的时间很长,因为建立索引也会产生大量的redo信息,所以在创建索引时可以设置不产生或少产生redo信息。只要表数据存在,索引失败了大不了

再建,所以可以不需要产生redo信息。

5>、建索引的时候应该根据具体的业务SQL来创建,特别是where条件,还有where条件的顺序,尽量将过滤大范围的放在后面,因为SQL执行是从后往前的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle中的index函数,Oracle中的索引详解(整理) 的相关文章

  • ORA-12154: TNS: 无法解析指定的连接标识符 (PLSQL Developer)

    我需要使用 PLSQL Developer 访问 oracle 数据库 当我尝试连接到数据库时出现以下错误 ORA 12154 TNS could not resolve the connect identifier specified 我
  • LiveSQL 不断向我显示:ORA-00933:SQL 命令未正确结束[重复]

    这个问题在这里已经有答案了 INSERT INTO Countries Country Capital Cities VALUES Philippines Manila 122 USA Washington 19495 Brazil Bra
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • 如何在 Oracle PLSQL 中提交单个事务

    我需要编写一个 PL SQL 过程 在这个过程中 我需要在其自己的事务范围内调用另一个过程 并提交它 无论主事务是否失败或提交 换句话说 我需要类似的东西REQUIRES NEW交易传播 就像是 procedure mainProcedur
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 循环预定义值

    有没有办法在 oracle 中执行 for every 如下所示 begin for VAR in 1 2 5 loop dbms output put line The value VAR end loop end 我知道你可以这样做 b
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何从 pl/sql 包运行 http Web 服务请求

    我开发了一个新的程序来调用 Web 服务 但当我运行它时 它显示 Oracle 适配器错误 您能指导我如何解决此错误吗 下面的代码有问题吗 Formatted on 17 07 2014 16 49 02 QP5 v5 185 11230
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经
  • 在行之间随机排列一列

    如何有效地洗牌大型 1m 到 5m 记录 表的内容 已知该列具有唯一值 但您可以假设为此目的删除了所有约束 我的头痛主要是因为我正在更新我选择的同一列 我的目标是使用 PL SQL 来完成此操作 以便我可以以编程方式执行其他操作 例如记录或
  • 在包之间传递关联数组作为参数

    我有两个单独的 Oracle v9 2 PL SQL 包 并且我试图将 package1 中的过程中的关联数组 即索引表 作为参数传递给 package2 中的过程 这可能吗 我不断得到PLS 00306 wrong number or t
  • SQL在单个命令中在表中添加列和注释

    我的 Web 应用程序使用 Oracle 11g 我想向现有表添加列和注释 我可以使用以下命令轻松做到这一点 ALTER TABLE product ADD product description VARCHAR2 20 and COMME
  • Oracle - 如何向用户授予对另一个用户的对象的权限

    我需要授予用户 TARGETUSER 选择 插入 更新用户 SOURCEUSER 的所有表的权限 我可以从here https stackoverflow com questions 187886 grant select on all t
  • cx_Oracle 和数据源范例

    有一个 Java 范例用于在 Java 中实现数据库访问DataSource 该对象围绕数据库连接的创建创建了一个有用的抽象 这DataSource对象保留数据库配置 但只会根据请求创建数据库连接 这允许您将所有数据库配置和初始化代码保留在
  • 删除带有全局索引的分区表?

    PROCEDURE purge partitions p owner IN VARCHAR2 p name IN VARCHAR2 p retention period IN NUMBER IS BEGIN FOR partition re
  • 如何以合理的方式使用 Oracle 驱动程序的日志记录来记录 UPDATE 语句?

    我想记录我的应用程序发出的所有 SQL 所以我确切地知道它在做什么 我已经根据以下内容为 Oracle 设置了 Java Util Logging这个答案 https stackoverflow com a 40491028 216353
  • Oracle BLOB 提取非常慢

    从我管理的 oracle 10gR2 10 2 05 数据库中提取 BLOBS 时 我遇到性能问题 我有大约 400 个存储为 BLOBS 的文件 我需要将它们写入文件系统 下面是我的代码 当我执行这个过程时 前 8 个左右的文件会在几秒钟
  • PL/SQL 中的 IN、OUT、IN OUT 参数到底是什么

    我在这里查找了问题 也在网上查找和观看视频 但我仍然不清楚 IN OUT 到底是什么 我问的原因是因为我正在编写一个程序 该程序将根据其他程序中的 IN 参数记录错误 Cheers Oracle 文档here https docs orac
  • 函数参数的自定义惰性求值/短路的语法

    Oracle 定义了几种结构 这些结构利用了看似惰性求值但实际上是短路的功能 例如 x case when 1 2 then count all prime numbers below 100000000 else 2 2 end 函数 c

随机推荐

  • 【成功】qlv转MP4,超简单方法

    1 打开 www xxxbbbttt com 上传你的视频 xff08 腾讯qlv xff0c 爱奇艺qsv 优酷kux xff09 都可以 3 点击转换按钮 xff0c 转换好后 xff0c 我们把转换的视频下载到电脑里 xff0c 就可
  • cisco配置交换机管理地址和默认网关

    配置交换机远程管理地址和默认网关 拓扑图如下 xff1a 1 配置PC0 2 配置SW1交换机 Switch config no ip domain lookup 关闭域名解析 Switch config line exec timeout
  • 兄弟们,请求支援,怎么实现互通,全部都互通的

    转载于 https blog 51cto com 14155986 2337267
  • FIFO算法与LRU算法软考试题

    转载于 https www cnblogs com kungfupanda archive 2009 12 25 1632106 html
  • iOS 网络/本地 图片 按自定义比例缩放 不失真 方法

    我尝试了很多种方法 xff0c 终于 xff0c 设计了一个方法 xff0c 能按自己规定的大小压缩 还没失真 如果以后不好用 我再升级 分享给大家 xff1a 43 CGRect scaleImage UIImage image toSi
  • java 输入输出 函数对象构造

    输入输出 输入字符串 不包括最后的换行符 39 n 39 import java io BufferedReader import java io IOException 输入字符一个char import java io InputStr
  • Python 3 加密简介

    Python 3 的标准库中是没多少用来解决加密的 xff0c 不过却有用于处理哈希的库 在这里我们会对其进行一个简单的介绍 xff0c 但重点会放在两个第三方的软件包 xff1a PyCrypto 和 cryptography 上 xff
  • grep 命令的基本使用

    环境变量 xff1a 定义用户的工作环境某个方面的属性 文本文件的查看命令 xff1a cat 连接 能够将后面跟的多个文件的内容 xff0c 依次显示 cat n 在显示时出现行号 E 显示行结束符 v 显示非打印字符不显示制表符tab
  • innodb Cardinality学习笔记

    github 传送门 链接描述 欢迎过来star呀 背景 1 之前对innodb的Cardinality没概念 xff0c 只知道要高选择性的列上建索引 xff0c 比如用户名而不是性别 xff0c 因为性别区分度不高 xff0c 但是这过
  • K8S组件运行原理详解总结

    一 看图说K8S 先从一张大图来观看一下K8S是如何运作的 xff0c 再具体去细化K8S的概念 组件以及网络模型 从上图 xff0c 我们可以看到K8S组件和逻辑及其复杂 xff0c 但是这并不可怕 xff0c 我们从宏观上先了解K8S是
  • ubuntu中apt-get的常用命令。

    使用以下命令清理系统垃圾 sudo apt get autoclean 清理旧版本的软件缓存 sudo apt get clean 清理所有软件缓存 sudo apt get autoremove 删除系统不再使用的孤立软件 xff1d x
  • Qt之设置QWidget背景色

    简述 QWidget是所有用户界面对象的基类 xff0c 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 xff0c 下面介绍三种方法 使用QPalette 使用Style Sheet绘图事件 一般我不用QSS设置
  • 计算机机房英文术语,【数据中心】数据中心常见中英术语及解释

    原标题 xff1a 数据中心 数据中心常见中英术语及解释 一 常见中文术语 1 数据中心 为一个建筑群 建筑物或建筑物中的一个部分 xff0c 主要用于容纳设置计算机房及其支持空间 2 进线间 外部缆线引入和电信业务经营者安装通信设施的空间
  • C#学习之接口

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语
  • neo1973 audio subsystem

    fhttp wiki openmoko org wiki Neo 1973 audio subsystem using Bluetooth headset with GSM NOTE none of this works with GTA0
  • 程序员面试必备书单

    点击关注异步图书 xff0c 置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论 xff0c 即有机会获得异步图书一本 世上最快乐的事 xff0c 莫过于为理想奋斗 一个满意的工作 xff0c 便是为理想奋斗
  • vnc linux 终端打不开,vnc连接后只能看到终端

    我在windows安装了VNC Viewer xff0c 远程链接ubunt12 04服务器 xff0c 发现远程桌面只有一个终端 xff0c 没有桌面 从网上查了一些资料 xff0c 问题得以解决 xff0c 记录如下 xff1a 修改
  • ubuntu11.04下CUDA4.0的安装与配置

    ubuntu11 04下CUDA4 0的安装与配置 1 xff1a 下载CUDA 4 0 安装官网最新的显卡驱动 xff1a 安装方法可以参考 xff1a Ubuntu11 04下安装Nvidia显卡驱动的方法 然后从NVIDIA网站 xf
  • MySQL中如何定位DDL被阻塞的问题

    在生产环境中 xff0c 执行了一个DDL xff0c 发现很久都没有执行完 xff0c 是不是被阻塞了 xff1f 要怎么解决 xff1f 实际上 xff0c 如何解决DDL阻塞的问题 xff0c 是MySQL中一个共性且高频的问题 下面
  • oracle中的index函数,Oracle中的索引详解(整理)

    一 ROWID的概念 存储了row在数据文件中的具体位置 xff1a 64位 编码的数据 xff0c A Z a z 0 9 43 和 xff0c row在数据块中的存储方式 SELECT ROWID last name FROM hr e