`
zzhonghe
  • 浏览: 250105 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

小表是否就真的没有必要加索引

    博客分类:
  • DB
阅读更多
之前总结了部分使用索引的规则,其中有一条: 小表不必要加索引

今个,在读Oracle性能诊断艺术的时候,作者对这条规则提出了异议,说是曾经在一次调优中,对一个小表添加索引,使得整个查询的性能得以提高30倍。


我觉得非常诧异,再细读下去才得知,小表做一次全表扫描,和做一次索引定位,时间的相差也许只有0.01秒,一般情况下是可以忽略不计的, 但小表如果在查询中处于核心路径的话,对小表的访问次数可能会放大很多倍,如果放大10000倍,那就相差100秒,这样的消耗还是相当严重的。


为此,特意准备了一组数据进行测试,目前开发的项目中正好有这样的大小表,可以测:

placement   20w行左右,   schverfile 100行


select p.trafficId  from placement p where exists (select null from schverfile s where p.schedFileName = s.schedFileName)



采用子关联查询,分别在schverfile.schedFileName有索引和无索引的条件下跑, 前者是0.91秒,后者确有27.37秒。 对于每一行p的记录,都会调用一次s的查询,相当于放大了20W倍


所以,得出结论是,小表是否加索引,还得看其运行的查询,处于核心路径的小表,如果不会频繁修改,最好是加上索引,以防万一。    如果是频繁修改的,那就还得在权衡维护索引的消耗和全表扫描消耗之间做一个权衡了。
分享到:
评论

相关推荐

    oracle在线创建索引和重组索引

    在重组索引前,需要确认重组以后的索引所在的表空间是否有足够的空间,以及是否有足够的临时表空间用于排序。 重组索引的 SQL 语句为: ```sql alter index index_name rebuild [tablespace tbs_index2] online ...

    词索引表的建立——查找操作在字符串处理中的应用

    Locate 函数可以在索引表中查找是否存在与 wd 相同的关键字,InsertNewKey 函数可以在索引表的第 i 项上插入关键字 wd,并初始化书号索引为空链表,Append 函数可以存放书号索引链表 bnolist 中插入新的结点,Insert...

    SQL Server 索引中include的魅力(具有包含性列的索引)

    * 索引覆盖:如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生 Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。 * 复合索引:...

    sql优化、索引的建立和运用以及多表连接建索引的拙劣见解

    ### SQL优化、索引的建立和运用以及多表连接建索引的相关知识点 ...此外,在多表连接的情况下,合理构建索引也是十分必要的。这些实践不仅能够帮助开发者写出更高效的SQL语句,还能够为最终用户带来更好的使用体验。

    mysql多条件索引

    如果新索引是现有多列索引的最左前缀,那么就没有必要单独为前面的列创建索引,因为这不会提供额外的性能提升。 举例来说,如果我们有一个名为`people`的表,包含`lname`、`fname`和`age`三列,若要查询姓`Liu`、名...

    Oralce如何选择合适的索引类型

    - **记录较少的表**:对于记录数量不多的表,例如员工登录密码表或企业部门信息表,通常没有必要建立索引。这类表的记录量不足以使索引带来的查询优化效果明显,而且额外的索引维护成本可能得不偿失。 - **内容较大...

    mysql的索引优化

    1. **提高查询速度**:当执行查询时,如果没有索引,MySQL需要从头到尾遍历整个表的所有记录来寻找符合条件的结果。随着表中记录数量的增加,这种操作的时间成本会显著增加。相反,如果有适当的索引,MySQL可以直接...

    为什么oracle有时不用索引来查找数据

    4. **连接顺序**:例如,在表`emp`的`deptno`列上有索引,而表`dept`的`deptno`列没有索引的情况下,如果`WHERE`子句包含`emp.deptno = dept.deptno`,并且`emp`作为外表被首先访问,那么由于连接机制的原因,`emp....

    Dalvik指令格式索引表及位描述索引表

    **Android Dalvik虚拟机指令格式与位描述索引表** 在Android系统中,Dalvik虚拟机(Dalvik Virtual Machine,DVM)是运行应用程序的核心组件。它采用了优化的字节码格式,使得在资源受限的移动设备上高效执行代码...

    oracle索引机制分析

    - **索引的必要性**:当访问大型表中的少量数据时,索引可以帮助减少磁盘I/O次数。例如,如果仅需访问大型表中的5%数据,使用索引可以显著减少I/O操作数量,从而提高查询效率。 - **索引与ROWID**:ROWID是指Oracle...

    sql优化加索引[参考].pdf

    SQL优化是一个复杂的过程,其中加索引是提升数据库性能的有效手段之一。本文旨在探讨基于索引的SQL优化策略,通过一系列实践建议,即所谓的“降龙十八掌”,帮助开发者理解和应用索引优化,以解决系统性能问题。 ...

    MySQL 索引最佳实践

    在没有索引的情况下,数据库必须遍历整个表来查找特定的数据,这在数据量庞大的情况下将非常耗时。此外,索引还能帮助执行某些数据库约束,如确保字段值的唯一性或维护表之间的关系。值得注意的是,尽管可以不使用...

    Sybase 数据库查询索引优化

    首先,了解索引的基本概念是必要的。在Sybase中,索引分为聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)。聚集索引决定了数据在磁盘上的物理顺序,一个表只能有一个聚集索引,而数据行本身即包含...

    Oracle索引机制分析

    索引的基本概念在于,它们提供了一种快速定位表中特定数据的方法,类似于书的目录,使得数据库系统不必遍历整个表就能找到所需的信息。 在Oracle中,索引主要有以下几种类型: 1. **B树索引**:这是最常见的索引...

    MySQL分区字段列有必要再单独建索引吗?

    如果发现没有充分利用现有的索引,或者全表扫描的代价过高,那么添加索引可能是有益的。 总结来说,是否需要为MySQL的分区字段创建单独的索引,并无绝对的答案,而是取决于具体的应用场景、数据量、查询模式以及...

    合理使用索引技巧

    - 定期分析和优化索引是必要的,因为随着数据的变化,某些索引可能变得不再高效,或者新的查询模式可能需要添加新的索引。 总结起来,合理使用索引技巧包括选择合适的列创建索引、优化查询语句结构、理解索引的...

    浅谈oracle中重建索引

    2. **索引信息的收集与验证**:为了判断索引是否需要重建,可以收集并分析索引的状态信息。这可以通过`ANALYZE INDEX`命令来完成。例如,`ANALYZE INDEX SYS_C0015671 VALIDATE STRUCTURE;`这条语句用于验证索引的...

    SuperMap Objects .NET 创建字段索引

    在GIS(地理信息系统)开发中,SuperMap Objects .NET 是一款强大的组件库,它提供了丰富的功能,用于构建基于.NET Framework的GIS应用。...因此,在实际应用中,应根据数据特性和应用需求谨慎决定是否创建索引。

    mysql索引的设计和使用

    若没有主键但有唯一索引,则按唯一索引存储;若两者皆无,InnoDB会自动生成一个内部列作为排序依据。为了提高查询效率,应当优先定义主键,并且主键应选择较短的数据类型,以减少磁盘占用和提升索引缓存效果。 ####...

    Oracle数据库中索引的维护

    要检查SYSTEM表中是否存在其他用户的索引,可以通过以下SQL查询实现: ```sql select count(*) from dba_indexes where tablespace_name = 'SYSTEM' and owner not in ('SYS', 'SYSTEM') ``` 接下来,我们讨论...

Global site tag (gtag.js) - Google Analytics