之前总结了部分使用索引的规则,其中有一条: 小表不必要加索引
今个,在读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倍
所以,得出结论是,小表是否加索引,还得看其运行的查询,处于核心路径的小表,如果不会频繁修改,最好是加上索引,以防万一。 如果是频繁修改的,那就还得在权衡维护索引的消耗和全表扫描消耗之间做一个权衡了。
分享到:
相关推荐
在重组索引前,需要确认重组以后的索引所在的表空间是否有足够的空间,以及是否有足够的临时表空间用于排序。 重组索引的 SQL 语句为: ```sql alter index index_name rebuild [tablespace tbs_index2] online ...
Locate 函数可以在索引表中查找是否存在与 wd 相同的关键字,InsertNewKey 函数可以在索引表的第 i 项上插入关键字 wd,并初始化书号索引为空链表,Append 函数可以存放书号索引链表 bnolist 中插入新的结点,Insert...
* 索引覆盖:如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生 Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。 * 复合索引:...
### SQL优化、索引的建立和运用以及多表连接建索引的相关知识点 ...此外,在多表连接的情况下,合理构建索引也是十分必要的。这些实践不仅能够帮助开发者写出更高效的SQL语句,还能够为最终用户带来更好的使用体验。
如果新索引是现有多列索引的最左前缀,那么就没有必要单独为前面的列创建索引,因为这不会提供额外的性能提升。 举例来说,如果我们有一个名为`people`的表,包含`lname`、`fname`和`age`三列,若要查询姓`Liu`、名...
- **记录较少的表**:对于记录数量不多的表,例如员工登录密码表或企业部门信息表,通常没有必要建立索引。这类表的记录量不足以使索引带来的查询优化效果明显,而且额外的索引维护成本可能得不偿失。 - **内容较大...
1. **提高查询速度**:当执行查询时,如果没有索引,MySQL需要从头到尾遍历整个表的所有记录来寻找符合条件的结果。随着表中记录数量的增加,这种操作的时间成本会显著增加。相反,如果有适当的索引,MySQL可以直接...
4. **连接顺序**:例如,在表`emp`的`deptno`列上有索引,而表`dept`的`deptno`列没有索引的情况下,如果`WHERE`子句包含`emp.deptno = dept.deptno`,并且`emp`作为外表被首先访问,那么由于连接机制的原因,`emp....
**Android Dalvik虚拟机指令格式与位描述索引表** 在Android系统中,Dalvik虚拟机(Dalvik Virtual Machine,DVM)是运行应用程序的核心组件。它采用了优化的字节码格式,使得在资源受限的移动设备上高效执行代码...
- **索引的必要性**:当访问大型表中的少量数据时,索引可以帮助减少磁盘I/O次数。例如,如果仅需访问大型表中的5%数据,使用索引可以显著减少I/O操作数量,从而提高查询效率。 - **索引与ROWID**:ROWID是指Oracle...
SQL优化是一个复杂的过程,其中加索引是提升数据库性能的有效手段之一。本文旨在探讨基于索引的SQL优化策略,通过一系列实践建议,即所谓的“降龙十八掌”,帮助开发者理解和应用索引优化,以解决系统性能问题。 ...
在没有索引的情况下,数据库必须遍历整个表来查找特定的数据,这在数据量庞大的情况下将非常耗时。此外,索引还能帮助执行某些数据库约束,如确保字段值的唯一性或维护表之间的关系。值得注意的是,尽管可以不使用...
首先,了解索引的基本概念是必要的。在Sybase中,索引分为聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)。聚集索引决定了数据在磁盘上的物理顺序,一个表只能有一个聚集索引,而数据行本身即包含...
索引的基本概念在于,它们提供了一种快速定位表中特定数据的方法,类似于书的目录,使得数据库系统不必遍历整个表就能找到所需的信息。 在Oracle中,索引主要有以下几种类型: 1. **B树索引**:这是最常见的索引...
如果发现没有充分利用现有的索引,或者全表扫描的代价过高,那么添加索引可能是有益的。 总结来说,是否需要为MySQL的分区字段创建单独的索引,并无绝对的答案,而是取决于具体的应用场景、数据量、查询模式以及...
- 定期分析和优化索引是必要的,因为随着数据的变化,某些索引可能变得不再高效,或者新的查询模式可能需要添加新的索引。 总结起来,合理使用索引技巧包括选择合适的列创建索引、优化查询语句结构、理解索引的...
2. **索引信息的收集与验证**:为了判断索引是否需要重建,可以收集并分析索引的状态信息。这可以通过`ANALYZE INDEX`命令来完成。例如,`ANALYZE INDEX SYS_C0015671 VALIDATE STRUCTURE;`这条语句用于验证索引的...
在GIS(地理信息系统)开发中,SuperMap Objects .NET 是一款强大的组件库,它提供了丰富的功能,用于构建基于.NET Framework的GIS应用。...因此,在实际应用中,应根据数据特性和应用需求谨慎决定是否创建索引。
若没有主键但有唯一索引,则按唯一索引存储;若两者皆无,InnoDB会自动生成一个内部列作为排序依据。为了提高查询效率,应当优先定义主键,并且主键应选择较短的数据类型,以减少磁盘占用和提升索引缓存效果。 ####...
要检查SYSTEM表中是否存在其他用户的索引,可以通过以下SQL查询实现: ```sql select count(*) from dba_indexes where tablespace_name = 'SYSTEM' and owner not in ('SYS', 'SYSTEM') ``` 接下来,我们讨论...