转自thomas zhang的杂货铺。
http://tomszrp.itpub.net/post/11835/68822
在使用Oracle的过程,我们就不能考虑性能和SQL优化,而正确的使用
索引是优化SQL中的很关键的因素.
如果发现Oracle在有索引的情况下而没有使用索引,这并不是Oracle的优化器出错。在有些情况下Oracle确实会选择全表
扫描(Full Table Scan),而非索引扫描(Index Scan)。比如:
1、表未做分析或者分析信息太老,导致 Oracle 判断失误.
2、根据表拥有的记录和数据块数,实际上全表扫描要比索引扫描更快.
对第1种情况最常见的例子,是以下这样的count语句:
select count(*) from table_name;
在未作分析之前,它使用全表扫描,需要读取1000[假设的]多个数据块(假如一个数据块是8k),做了分析之后,使用的是INDEX (FAST FULL SCAN),可能只需要读取100个数据块。但是如何分析做得不好,也会导致Oracle不使用索引。
对第2种情况一般大家都认为通过索引访问比通过表访问要快,比较难理解的是在哪种情况下全表扫描要比索引扫描快。这就涉及到这么2个概念:
Oracle在评估使用索引的代价(cost)时有两个重要的数据:CF(Clustering factor) 和 FF(Filtering factor).
CF: 所谓 CF, 可以理解为每读入一个索引块要对应读入多少个数据块。
FF: 所谓 FF, 就是SQL语句所选择的结果集占总的数据量的百分比。
一般的估算公式是:FF * (CF + 索引块个数) [备注:toms 说"the formula used by the CBO to compute the cost is blevel + FF * leaf_blocks + FF * clustering_factor"]由此估计出一个查询如果使用某个索引会需要读入的数据块块数。需要读入的数据块越多,则 cost 越大Oracle 也就越可能不选择使用 index.
(全表扫描需要读入的数据块数等于该表的实际数据块数)
其核心就是,CF可能会比实际的数据块数量大。CF受到索引中数据的排列方式影响,通常在索引刚建立时,索引中的记录与表中的记录有良好的对应关系,CF 都很小;在表经过大量的插入/修改操作后,这种对应关系越来越乱,CF也越来越大。这个时候就需要DBA重建该索引。
如果某个SQL语句以前一直使用某个索引,突然有一天,你发现系统慢的不行了,检查发现该SQL语句的某个索引用不上了:其中一个很大的可能就是 CF 已经变得太大,需要重新整理该索引了.
FF 则是Oracle 根据分析所做的估计。比如某表有50多万行,其主键的最小值是1,最大值是500000,考虑以下sql 语句:
Select * from table_name where keyid>=1; 和
Select * from table_name where keyid>=500000
这两个表面看上去一样的sql语句,对Oracle而言却有巨大的差别。因为前者的FF是100%,而后者的FF可能只有 1%。如果
它的CF大于实际的数据块数,则Oracle可能会选择完全不同的优化方式。
索引有很多种[参考http://tomszrp.itpub.net/post/11835/59943],索引也有的"好坏"之分:
1、索引不是越多越好
特别是大量从来或者几乎不用的索引,对系统只有损害。OLTP系统每表超过5个索引即会降低性能
2、很多时候,单列索引不如复合索引有效率。
3、用于多表连结的字段,加上索引会很有作用。
那么,在什么情况下单列索引不如复合索引有效率呢?有一种情况是显而易见的,那就是,当SQL语句所查询的列,全部都出现在复合索引中时,此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。
相关推荐
### Oracle索引使用样例详解 #### 一、索引并行创建 在Oracle数据库中,并行创建索引可以显著提高创建索引的速度,尤其是在处理大量数据时。下面的SQL语句展示了如何并行创建一个索引: ```sql CREATE INDEX IDX_GD...
Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程
根据“索引使用规则.txt”文件提供的信息,我们可以深入探讨一系列关于索引使用的最佳实践与限制条件,以下是对这些规则的详细解析: ### 1. 索引与逻辑运算符的兼容性 当在WHERE子句中使用`NOT`或`LIKE '%XX%'`这...
本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的概念与类型: - 索引是一种数据结构,用于快速定位表中的特定行,类似于书籍的目录。 - MySQL支持多种类型的索引,包括B-Tree(默认)...
SQL Server 索引使用总结 本文档总结了 SQL Server 中索引的使用方法、分类和注意事项,并提供了实践测试的示例代码。 索引的使用目的 索引的使用目的主要是为了提高查询速度和效率。通过创建索引,可以快速地...
11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...
例如,脚本的输出显示了几个表的索引使用情况,如ACC_POS_CASH_PL_TBL_ARC表的主键索引PK_ACC_POS_CASH_PL_ARCH_TBL,执行了多次RANGE SCAN, UNIQUE SCAN, SAMPLE FAST FULL SCAN和SKIP SCAN操作。通过比较不同操作...
##### 2、索引使用原则 索引的使用并非越多越好,而是在充分理解业务场景的基础上,根据查询需求来设计。例如,在电商系统中: - **用户方**:通常会基于用户ID(user_id)进行查询,也可以通过订单号(order_no)查询...
以下将详细介绍MySQL中的索引使用规则及其相关知识。 1. **创建索引** - **CREATE INDEX** 语句用于在表的列上创建索引,例如:`CREATE INDEX idx_name ON table_name (column_name);` - **唯一性索引**:`UNIQUE...
【索引使用技巧大全宝典】 索引是数据库系统中不可或缺的一部分,它们极大地提升了数据检索的速度,尤其是在处理大规模数据时。然而,不恰当的索引使用可能会适得其反,影响数据库性能。以下是对索引使用技巧的深入...
在本文中,我们将探讨几个最常见和最基本的索引使用规则,特别关注联合索引的使用,这是多列索引的一种,可以帮助进一步优化数据库的查询性能。 首先,我们需要了解等值匹配规则。当我们在WHERE子句中使用等号进行...
### 函数索引使用 #### 一、函数索引(Function-Based Index)概念与作用 函数索引(Function-Based Index, FBI),是Oracle数据库自Oracle 8i版本引入的一种特殊类型的索引。它允许在创建索引时使用任意内置或...
【索引使用简介】 在数据库管理系统中,索引是一种数据结构,它能够加快对表中数据的访问速度。索引的使用是优化SQL查询性能的关键因素,但也需要谨慎处理,因为它们会对数据插入、更新和删除操作(DML操作)产生...
在IT行业中,表排序、索引使用以及使用plist文件存储数据是常见的操作,尤其是在数据库管理和移动应用开发中。下面将详细讲解这三个知识点。 首先,**表排序**是数据处理的基础,无论是在关系型数据库中还是在内存...
标题中提到的“SQL Server索引使用的几个误区.pdf”指明了文档的主题是关于SQL Server数据库中索引的使用,同时强调了一些常见错误和误解。这部分内容通常会涉及索引在数据库中的作用、种类以及如何正确使用索引来...
### SQL索引使用方略(系统而全面) #### 一、引言 索引是数据库管理系统(DBMS)中用于提高数据检索速度的重要工具之一。它能够显著提升查询性能,但同时也可能对插入、更新和删除操作的速度产生负面影响,并且会占用...
【计算机等考三级数据库辅导:谈索引使用的误区】 在数据库设计中,索引是一种重要的优化工具,用于加速数据检索。然而,对于索引的使用,存在一些常见的误区,这可能会导致性能下降而非提升。本文将探讨这些误区,...
本资料“行业-74 再来看看几个最常见和最基本的索引使用规则l.rar”可能包含了一份详细的文档,探讨了数据库索引的基本原则和常见应用。下面,我们将深入讲解一些关于索引的重要知识点。 首先,了解索引的工作原理...
"SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...
本篇文章将深入探讨一些关于索引使用的经验总结,这些经验可能在传统的教材或书籍中较少提及,但对实际数据库操作有显著的影响。 首先,我们要理解索引的基本概念。索引是数据库管理系统为了加速数据检索而创建的一...