oracle索引的创建

2023-10-27

author:skate
time  :2009/08/21


 

为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能,他都有哪些优点:
 

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

 

第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。

 

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

 

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

 

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能


索引虽然优点非常多,但也不是越多越好,增加索引的同时也会带来一些负面的影响

 

第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。

 

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

 

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

 

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不适合创建索引。一般来说,应该在如下列上创建索引,例如

 

1. 在经常需要搜索的列上,可以加快搜索的速度;

 

2。在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

 

3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

 

4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

 

5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

 

6. 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

 

 

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:

 

1,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因 为,既然这些列很少使用到,
  
   因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护
  
   速度和增大了空间需求。

 

2,对于那 些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事
  
   表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的
  
   数据行的比例很大。增加索引,并不能明显加快检索速度。

 

3,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相
  
   当大,要么取值很少。
  
4,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。
  
   当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索
  
   性能。因 此,当修改性能远远大于检索性能时,不应该创建索引。

 

创建索引,要在适当的表,适当的列创建适当数量的适当索引

1. 根据表的大小创建索引

 

  索引可以提高查询性能,但同时也会降低更新的性能,所以在创建索引的之前,要先仔细考察下表的大小

 

  表太小,就不是建立索引,如果表只有百十条记录的字典表(数据量没什么变化),创建索引几乎不能没有
 
  任何改善,相反索引的维护成本,要比这个大的多,也就是说,你花了很多钱买了很少的东西(你是个冤大头)。

 
  有的人会问,小表不用创建索引,那大表就一定要创建索引了吧,其实那也不是绝对的,只要大家理解了索引的

 

  访问数据的原理就会明白的(通过索引找到记录对应的rowid,再通过rowid找到真实的数据),如果在一个很少查询


  ,但更新很频繁的表上创建索引,就不是合适,因为在大表上创建索引的维护成本要远高于小的表的索引,是不是有点


  迷糊了, 那到底在大表上是否创建索引呢?我觉得这要评估下对这个表的访问数据量,如果查询量大于10%的话,就不要


  创建索引了,因为那会反而影响执行的性能,这个值只是经验值,如果你非要确定这个值,那你就要测试分析,看添加索引


  和全表扫描那个速度更快

 

2.根据列的特征创建索引

 

上面已经说了,那些列上该创建索引:

 

1. 在经常需要搜索的列上,可以加快搜索的速度;

 
2。在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;


3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

 
4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;


5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;


6. 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。


2. 一个表上创建多少索引

 

表的索引可以提高查询速度,但也降低更新速度,我们在考虑创建多少索引的时候,要考虑在查询和更新之间找


一个平衡点,例如像分析系统,主要用于查询,很少更新,就可以多创建些索引,及时更新也是很少或着是导数据


,在导数据的时候可是disable索引,导完数据库之后在enable索引

 


sql优化是一个动态的过程,因为他是根据数据量的不同,而在不断的变化。需要定期监控以便于对其进一步的优

 

对于DB设计者、SQL制作者、DBA在优化SQL时,存在以下效率的高低:

 

追加约束条件 > 调整SQL逻辑 > 设计INDEX > 加入Hint

 

开发者优化SQL的主要精力应该放在对SQL本身的编写组织上。而且越后面的风险也越大。


因为开发环境、测试环境、最终客户环境的数据量、数据库版本、硬件等等总会有不同;


而Hint是强制执行的(自动忽略错误Hint语句),


就会产生在某处高效的Hint,在另一处却非常耗费资源。

 

如果不是可以在最终客户环境上操作的人员,最好不要写Hint,


最多只要做好INDEX,


Oracle的自动优化不会轻易放过它的。

 

 

 

 

 

---end---


 

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

oracle索引的创建 的相关文章

  • SQL 错误:ORA-14006:无效的分区名称

    我正在尝试使用以下 SQL 语句对 Oracle 12C R1 中的现有表进行分区 ALTER TABLE TABLE NAME MODIFY PARTITION BY RANGE DATE COLUMN NAME INTERVAL NUM
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • 将数据从 oracle 移动到 HDFS,处理并从 HDFS 移动到 Teradata

    我的要求是 将数据从 Oracle 移至 HDFS 处理HDFS上的数据 将处理后的数据移至 Teradata 还需要每 15 分钟执行一次整个处理 源数据量可能接近50GB 处理后的数据也可能相同 在网上搜索了很多之后 我发现 PRARO
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • Oracle 上“描述”命令不起作用的原因是什么?

    我正在尝试在 oracle 上运行 describe table name 命令 我正在使用 dbeaver 来访问 oracle 但是 当我运行该命令时 它显示 SQLException 和错误消息 无效的 sql 语句 我该如何进行手术
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • oracle ExecuteNonQuery 在 ASP.Net 上冻结

    我正在尝试使用 ASP C 和 CLR 4 5 中的 Oracle 连接来运行非查询 这是我的代码 string connectionString ConfigurationManager ConnectionStrings OracleC
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • SQL查询查找具有特定数量关联的行

    使用 Postgres 我有一个架构conversations and conversationUsers Each conversation有很多conversationUsers 我希望能够找到具有确切指定数量的对话conversati
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22

随机推荐

  • 揭秘-只有13台DNS根域名服务器原因

    引言 什么是DNS DNS服务 将主机名映射成IP地址 一个主机可以有一个规范主机名 多个别名 www sina com就是个别名 邮件服务器也有别名 目的 负载平衡 通过IP分流 DNS的架构 前面我们说DNS是将主机名对应到IP 那么这
  • ConstraintLayout使用总结

    0dp的使用 app layout constrainedWidth true android layout width wrap content android layout width 0dp 效果是一样的 可以自动充满剩余空间 例子一
  • 【ZT】怎么查PC的CPU序列号?(wmic CPU get ProcessorID。WIN7可用)

    https zhidao baidu com question 38740362 html 怎么查CPU序列号 怎么查CPU序列号 我的是AMD Athlon4000 2的处理器 处理器上面写的是 AD04000IA5DD CAARG 07
  • CSS3新增了哪些新特性?

    一 是什么 css 即层叠样式表 Cascading Style Sheets 的简称 是一种标记语言 由浏览器解释执行用来使页面变得更美观 css3是css的最新标准 是向后兼容的 CSS1 2的特性在CSS3 里都是可以使用的 而CSS
  • C语言进阶,第4节-自定义类型详解(结构体+枚举+联合)

    一 结构体 1 结构的声明 描述一个学生 struct Stu 结构体标签 成员变量 char name 20 int age char sex 5 char id 20 x x 为 struct Stu 类型的变量 匿名结构体类型 str
  • LLama 2部署教程+私有模型分发

    近日 Meta发布了LLama的最新版本 LLama2 尽管其对中文的处理能力尚有待提升 但其整体表现无疑是令人瞩目的 在发布当天 我便迫切地将其下载下来进行试用 发现相比之前的版本 LLama2在多个方面都实现了显著的进步 特别是在编程能
  • stable diffusion实践操作-文生图

    本文专门开一节写文生图相关的内容 在看之前 可以同步关注 stable diffusion实践操作 正文 1 liblib SD1 5底模 lora baihuaniang 1 0 详细信息 底模 SD 1 5 Lora baihuania
  • 【翻译】进程间通信是什么?

    从单体架构到微服务的转变需要构成应用程序的不同服务之间的通信 服务实例通常是需要以某种方式相互通信的进程 这就是进程间通信 IPC 有时称为服务间通信 ISC 的作用 人们 往往想到的IPC机制是RESTful APIs 因为这仍然是使用最
  • 在java里怎样将 List按指定长度分割

    需求背景 在实现业务功能时 难免会遇到大数据量处理的情况 比如 业务需要处理100000个订单的信息 需要调用外部接口 但接口请求入参限制了参数IDS个数不能超1000 那么就需要将 100000个订单拆分成 100组数据 分组处理 找了很
  • U-Boot 移植

    目录 NXP官方开发板uboot编译测试 查找NXP官方的开发板默认配置文件 defconfig 配置编译NXP官方开发板对应的uboot 烧写验证与驱动测试 定位缺少的驱动 在NXP官方U Boot 中添加自己的开发板 添加开发板默认配置
  • 数据库连接 ORA-12170 TNS connect timeout occurred

    数据库连接出现 ORA 12170 TNS connect timeout occurred这个错误 解决思路 首先连接内网数据库 要排除是不是网络的问题 如果不是网络的问题 再去检查监听是否出现配置错误或其他错误 跟踪路由会有连接超时的现
  • Java中new data()插入数据库---时间相差13h(系统时间是对的,数据库时间也是对的)

    参考了该篇博客 https blog csdn net wo18237095579 article details 90288735 方法 数据库JDBC链接配置加上 serverTimezone GMT 2B8 亲测有效 排查逻辑 1 先
  • java.lang.NumberFormatException 错误及解决办法

    总结几个java lang NumberFormatException 错误及解决办法方法 转载https blog csdn net xiaodongvtion article details 8835668 转载https blog c
  • 【瑞吉外卖day01】

    1 软件开发流程 需求分析 设计 编码 测试 上线运维 软件开发角色分工 软件环境 开发环境 测试环境 生产环境 2 项目技术选型与功能架构 3 数据库环境搭建 Navicat中新建数据库 运行sql 一共建好11张表 4 maven环境搭
  • 解决 vue-cli index.js dev 配置中 assetsPublicPath 的值不能填 "./" 的问题

    问题篇 最近使用frp代理开发微信vue应用 frp代理不直接暴露根目录 因为我的根目录已经被我的博客占用了 所以就使用nginx又代理了一层 访问方式从越来的 wechat youngboy vip 变成 wechat youngboy
  • 【Linux】操作系统&&进程概念

    文章目录 1 冯诺依曼体系结构 2 操作系统 3 进程 进程的基本概念 查看进程和杀死进程 父进程和子进程 通过系统调用创建子进程 1 冯诺依曼体系结构 冯 诺依曼结构也称普林斯顿结构 是一种将程序指令存储器和数据存储器合并在一起的存储器结
  • Java 加解密技术系列之 MD5

    序 上一篇文章中 介绍了最基础的编码方式 BASE64 也简单的提了一下编码的原理 这篇文章继续加解密的系列 当然也是介绍比较基础的加密方式 MD5 MD5 属于单向加密算法 是不可逆的加密方式 也就是说 采用了 MD5 加密方式加密之后
  • 微信内打开链接,跳转到公众号关注页面

    制作一个链接 点击该链接跳转到公众号关注页面 1 从公众平台登进入公众号 2 点击开发 gt gt 开发者工具 3 F12 gt gt Elements 4 ctrl f 搜索 uin base64 5 将下面链接的 biz值更换成uin
  • 全屋WIFI组网方案

    一 AC AP AC 接入控制器 Wireless Accesspoint Controller 可以理解为带POE的路由器 AP 无线接入点 Wireless Access Point 可以理解为信号发射器 光猫接入到AC后 再通过网线接
  • oracle索引的创建

    author skatetime 2009 08 21 为什么要创建索引呢 这是因为 创建索引可以大大提高系统的性能 他都有哪些优点 第一 通过创建唯一性索引 可以保证数据库表中每一行数据的唯一性 第二 可以大大加快 数据的检索速度 这也是