广告
返回顶部
首页 > 资讯 > 数据库 >怎么理解oracle复合索引
  • 315
分享到

怎么理解oracle复合索引

2024-04-02 19:04:59 315人浏览 八月长安
摘要

这篇文章主要讲解了“怎么理解oracle复合索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解oracle复合索引”吧!首先,在大多数情况下,复合索

这篇文章主要讲解了“怎么理解oracle复合索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解oracle复合索引”吧!

首先,在大多数情况下,复合索引比单字段索引好.以税务系统的SB_ZSXX(申报类_征收信息表)为例,该表为税务系统最大的交易表.如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中的可选性或约束性都不强,如一个纳税人识别号有很多纳税记录,一个税务机关代码和同一月份记录就更多了,所以3个字段合起来,"某个纳税人识别号+某个税务机关代码+某月"的记录就少多了.因此复合索引比单字段索引的效率高多了.很多系统就是靠新建一些合适的复合索引,使效率大幅度提高.

      但是,复合索引比单字段索引的内容原理复杂,复合索引有两个重要原则需要把握: 前缀性和可选性.如果糊里糊涂的滥用复合索引,效果适得其反.

以例子来说明,例子如下:

      假设在员工表(emp)的(ename,job,mgr)3个字段上建了一个索引,例如索引名叫idx_1.3个字段分别为员工姓名,工作和所属经理号.然后,写如下一个查询语句,并不断进行查询条件和次序的排列组合,例如:

sql代码  

select * from emp where ename = 'a' and job = 'b' and mgr = 3 ;  

select * from emp where job = 'b' and ename = 'a' and mgr = 3 ;  

select * from emp where mgr = 3 and ename = 'a' and job = 'b' ;  

select * from emp where mgr = 3 and job = 'b' and ename = 'a' ;  

select * from emp where job = 'b' and mgr = 3 and ename = 'a' ;  

.....  

回答问题:在各种条件组合情况下,刚才建的索引(idx_1) 是用还是不用?也就是说对emp表的访问是全表扫描还是按索引(idx_1)访问?

答案是 :  上述语句中只要有ename='a'条件,就能用上索引(ind_1),而不是全表扫描(这就是复合索引的前缀性).

复合索引的原理和设计建议

1.复合索引的第一个建议: 前缀性(Prefixing)

     先从例子说起.假设省,市,县分别用3个字段存储数据,并建立了一个复合索引.请记住: oracle索引,包括复合索引都是排序的.例如该复合索引在数据库索引树上是这样排序的,即先按省排序,再按市排序,最后按县排序:

省  市  县

北京  北京  东城

北京  北京  西城

北京  北京  海淀

... ...

黑龙江  哈尔滨  道里区

黑龙江  哈尔滨  道外区

黑龙江  哈尔滨  香坊区

... ...

黑龙江  齐齐哈尔 龙沙区

黑龙江  齐齐哈尔 铁锋区

黑龙江  齐齐哈尔 富拉尔基区

... ...

湖南  长沙  芙蓉区

湖南  长沙  岳路区

湖南  长沙  开福区

... ...

oracle不是智能的,它只会按图索骥,该索引结构是先按省排序的,所以只要给出省名,就能使用索引.如果没有省名,oracle就成了无头苍蝇,乱找一气,变成了全表扫描了.例如,如果你只给一个县条件,如"开福区",oracle肯定不会使用该索引了.

2.关于skip scan index

有时候复合索引第一个字段没有在语句中出现,oralce也会使用该索引.对,这叫oralce的skip scan index功能,oracle 9i才提供的.

skip scan index功能适合于什么情况呢?如果oracle发现第一个字段值很少的情况下,例如假设emp表有gender(性别)字段,并且建立了(gender,ename,job,mgr)复合索引.因为性别只有男和女,所以为了提高索引的利用率,oracle可将这个索引拆成('男',ename,job,mgr),('女',ename,job,mgr)两个复合索引.这样即便没有gender条件,oracle也会分别到男索引树和女索引树进行搜索.

但是,(gender,ename,job,mgr)索引本身设计是不合理的,它违背了复合索引的第二个原理,可选性(Selectivity),见下面描述.

3.复合索引的第二个原理:可选性(Selectivity)

您可能会问:复合索引中如何排序字段顺序?这时就要用到复合索引的第二个原理:可选性(Selectivity)规则.oracle建议按字段可选性高低进行排序,即字段值多的排在前面.例如,(ename,job,mgr,gender),(县,市,省).这是因为,字段值多,可选性越强,定位的记录越少,查询效率越高.例如,全国可能只有一个"开福区",而湖南省的记录则太多了.

4.复合索引设计建议

(1).分析SQL语句中的约束条件字段.

(2).如果约束条件字段比较固定,则优先考虑创建针对多字段的普通B*树复合索引.如果同时涉及到月份,纳税人识别号,税务机关代码3个字段的条件,则可以考虑建立一个复合索引.

(3).如果单字段是主键或唯一字段,或者可选性非常高的字段,尽管约束条件比较固定,也不一定要建成复合索引,可建成单字段索引,降低复合索引开销.

(4).在复合索引设计中,需首先考虑复合索引的第一个设计原理:复合索引的前缀性.即在SQL语句中,只有将复合索引的第一个字段作为约束条件,该复合索引才会启用.

(5).在复合索引设计中,其实应考虑复合索引的可选性.即按可选性高低,进行复合索引字段的排序.例如上述索引的字段排序顺序为:纳税人识别号,税务机关代码,月份.

(6).如果条件涉及的字段不固定,组合比较灵活,则分别为月份,税务机关代码和纳税人识别号3个字段建立索引.

(7).如果是多表连接SQL语句,注意是否可以在被驱动表(drived table)的连接字段与该表的其他约束条件字段上创建复合索引.

(8).通过多种SQL分析工具,分析执行计划以量化形式评估效果.

感谢各位的阅读,以上就是“怎么理解oracle复合索引”的内容了,经过本文的学习后,相信大家对怎么理解oracle复合索引这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解oracle复合索引

本文链接: https://www.lsjlt.com/news/63987.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解oracle复合索引
    这篇文章主要讲解了“怎么理解oracle复合索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解oracle复合索引”吧!首先,在大多数情况下,复合索...
    99+
    2022-10-18
  • Oracle中复合索引与空值的索引怎么用
    这篇文章给大家分享的是有关Oracle中复合索引与空值的索引怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在QQ群里讨论一个SQL优化的问题,语句大致如下:selec...
    99+
    2022-10-18
  • oracle怎么创建组合索引
    要在Oracle中创建组合索引,您需要使用CREATE INDEX语句,并指定要创建的索引的名称、表名称以及要包含在索引中的列。 以...
    99+
    2023-10-27
    oracle
  • Oracle中组合索引怎么用
    这篇文章给大家分享的是有关Oracle中组合索引怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Oracle中组合索引的使用关键词:组合索引 前导列  基于规则的优...
    99+
    2022-10-18
  • 怎么理解oracle索引块分裂
    这篇文章主要介绍“怎么理解oracle索引块分裂”,在日常操作中,相信很多人在怎么理解oracle索引块分裂问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解oracle...
    99+
    2022-10-19
  • Oracle中如何创建复合索引
    这期内容当中小编将会给大家带来有关Oracle中如何创建复合索引,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.对于复合索引,在Wher...
    99+
    2022-10-18
  • MySQL中复合索引和覆盖索引的区别详解
    目录前言准备复合索引覆盖索引总结前言准备 我们先准备一张表和几个字段,方便介绍覆盖索引和复合索引。 创建一个user表,表中有id、name、school、age字段。 字段名字段类型idintnamevarcharsc...
    99+
    2023-11-23
    MySQL 复合索引 MySQL 覆盖索引
  • oracle索引表空间怎么清理
    要清理Oracle索引表空间,可以按照以下步骤进行操作:1. 查询索引表空间的使用情况:使用以下SQL语句查询索引表空间的使用情况:...
    99+
    2023-08-29
    oracle
  • 怎么理解oracle 12c分区表不完全索引
    本篇内容主要讲解“怎么理解oracle 12c分区表不完全索引”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解oracle 12c分区表不完全索引”吧!有...
    99+
    2022-10-18
  • mysql组合索引失效怎么解决
    当MySQL组合索引失效时,可以尝试以下几种解决方法:1. 重新设计索引:检查当前索引是否合适,可能需要重新设计索引来更好地支持查询...
    99+
    2023-10-25
    mysql
  • mysql联合索引失效怎么解决
    当MySQL联合索引失效时,可以考虑以下几个解决办法:1. 重新设计索引:检查当前的联合索引是否满足查询需求,如果不满足,可以重新设...
    99+
    2023-10-25
    mysql
  • 如何理解index merge合并索引
    本篇文章给大家分享的是有关index merge合并索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql> create ind...
    99+
    2022-10-19
  • 怎么理解C#索引器
    本篇内容介绍了“怎么理解C#索引器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概要索引器使你可从语法上方便地创建类、结构或接口,以便客...
    99+
    2023-06-25
  • oracle怎么修改索引为唯一索引
    要将索引修改为唯一索引,可以使用Oracle的ALTER TABLE语句来完成。以下是修改索引为唯一索引的步骤:1. 查询当前的索引...
    99+
    2023-09-14
    oracle
  • MongoDB复合索引引发的灾难是怎样的
    这期内容当中小编将会给大家带来有关MongoDB复合索引引发的灾难是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前情提要11月末我司商品服务的MongoDB主库曾...
    99+
    2022-10-18
  • mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用
    这篇文章主要介绍了mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。聚集索引(Clustered Index)聚集索引就是...
    99+
    2023-06-29
  • oracle索引怎么使用
    Oracle索引的使用方法如下:1. 创建索引:可以在表创建时定义索引,也可以在表创建后使用`CREATE INDEX`语句创建索引...
    99+
    2023-08-28
    oracle
  • MySQL5.6怎么快速定位不合理索引
    这篇文章主要讲解了“MySQL5.6怎么快速定位不合理索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL5.6怎么快速定位不合理索引”吧! ...
    99+
    2022-10-18
  • 如何理解oracle索引组织表
    本篇文章给大家分享的是有关如何理解oracle索引组织表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 今天学习下oracle中索引组织表,...
    99+
    2022-10-19
  • 怎么理解并掌握mysql索引之前缀索引
    本篇内容主要讲解“怎么理解并掌握mysql索引之前缀索引”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握mysql索引之前缀索引”吧!有时候需要很长...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作