Oracle的Index-1(转)

Oracle的Index-1

[@more@]

作者:heyongzhou | 来自:不详 | 点击:387 | 发布:2001-11-8

索引( Index )是常见的数据库对象,它的设置好坏、使用是否得当,极大地影响数据库应用程序和Database 的性能。虽然有许多资料讲索引的用法, DBA 和 Developer 们也经常与它打交道,但笔者发现,还是有不少的人对它存在误解,因此针对使用中的常见问题,讲三个问题。此文所有示例所用的数据库是 Oracle 8.1.7 OPS on HP N series ,示例全部是真实数据,读者不需要注意具体的数据大小,而应注意在使用不同的方法后,数据的比较。本文所讲基本都是陈词滥调,但是笔者试图通过实际的例子,来真正让您明白事情的关键。

一讲,索引并非总是最佳选择

如果发现Oracle 在有索引的情况下,没有使用索引,这并不是Oracle 的优化器出错。在有些情况下,Oracle 确实会选择全表扫描(Full Table Scan),而非索引扫描(Index Scan)。这些情况通常有:
1, 表未做statistics, 或者 statistics 陈旧,导致 Oracle 判断失误。
2, 根据该表拥有的记录数和数据块数,实际上全表扫描要比索引扫描更快。

对第1种情况,最常见的例子,是以下这句sql 语句:
select count(*) from mytable;
在未作statistics 之前,它使用全表扫描,需要读取6000多个数据块(一个数据块是8k), 做了statistics 之后,使用的是 INDEX (FAST FULL SCAN) ,只需要读取450个数据块。但是,statistics 做得不好,也会导致Oracle 不使用索引。

第2种情况就要复杂得多。一般概念上都认为索引比表快,比较难以理解什么情况下全表扫描要比索引扫描快。为了讲清楚这个问题,这里先介绍一下Oracle 在评估使用索引的代价(cost)时两个重要的数据:CF(Clustering factor) 和 FF(Filtering factor).
CF: 所谓 CF, 通俗地讲,就是每读入一个索引块,要对应读入多少个数据块。
FF: 所谓 FF, 就是该sql 语句所选择的结果集,占总的数据量的百分比。
大约的计算公式是:FF * (CF + 索引块个数) ,由此估计出,一个查询, 如果使用某个索引,会需要读入的数据块块数。需要读入的数据块越多,则 cost 越大,Oracle 也就越可能不选择使用 index. (全表扫描需要读入的数据块数等于该表的实际数据块数)
其核心就是, CF 可能会比实际的数据块数量大。CF 受到索引中数据的排列方式影响,通常在索引刚建立时,索引中的记录与表中的记录有良好的对应关系,CF 都很小;在表经过大量的插入、修改后,这种对应关系越来越乱,CF 也越来越大。此时需要 DBA 重新建立或者组织该索引。
如果某个sql 语句以前一直使用某索引,较长时间后不再使用,一种可能就是 CF 已经变得太大,需要重新整理该索引了。
FF 则是Oracle 根据 statistics 所做的估计。比如, mytables 表有32万行,其主键myid的最小值是1,最大值是409654,考虑以下sql 语句:
Select * from mytables where myid>=1; 和
Select * from mytables where myid>=400000
这两句看似差不多的 sql 语句,对Oracle 而言,却有巨大的差别。因为前者的 FF 是100%, 而后者的 FF 可能只有 1%。如果它的CF 大于实际的数据块数,则Oracle 可能会选择完全不同的优化方式。而实际上,在我们的数据库上的测试验证了我们的预测. 以下是在HP 上执行时它们的 explain plan:
第一句:
SQL> select * from mytables where myid>=1;

已选择325917行。
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3132 Card=318474 Byt es=141402456)
1 0 TABLE ACCESS (FULL) OF 'MYTABLES' (Cost=3132 Card=318474 Byt es=141402456)
Statistics
----------------------------------------------------------
7 recursive calls
89 db block gets
41473 consistent gets
19828 physical reads
0 redo size
131489563 bytes sent via SQL*Net to client
1760245 bytes received via SQL*Net from client
21729 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
325917 rows processed

第二句:

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=346 Card=663 Bytes=2 94372)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MYTABLES' (Cost=346 Card=663
Bytes=294372)
2 1 INDEX (RANGE SCAN) OF 'PK_MYTABLES' (UNIQUE) (Cost=5 Card=663)

Statistics
----------------------------------------------------------
1278 recursive calls
0 db block gets
6647 consistent gets
292 physical reads
0 redo size
3544898 bytes sent via SQL*Net to client
42640 bytes received via SQL*Net from client
524 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
7838 rows processed

显而易见,第1句没有使用索引,第2句使用了主键索引pk_mytables. FF的巨大影响由此可见一斑。由此想到,我们在写sql 语句时,如果预先估计一下 FF, 你就几乎可以预见到 Oracle 会否使用索引。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9417382/viewspace-932298/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9417382/viewspace-932298/

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理 项目背景、目标和主要流程。 阅读详情

相关推荐

STM32F407 CubeMX UART DMA高效解析BNO085九轴数据

本文详细介绍了如何在STM32F407平台上使用CubeMX配置UART和DMA高效解析BNO085九轴传感器数据。通过DMA循环接收机制实现低CPU占用的实时数据采集,并分享数据解析技巧、错误处理及实战调试经验,为嵌入式开发者提供完整解决方案。

o4p5q6r7s的博客 235

索引index(1)

索引本身是一个独立的存储单位,在该单位里边有记录着数据表某个字段和字段对应的物理空间。 如下: 有了索引,我们根据索引为条件进行数据查询速度就非常快 索引本身有”算法”支持,可以快速定位我们要找到的关键字(字段) 索引字段与物理地址有直接对应,帮助我们快速定位要找到的信息,一个数据表的全部字段都可以设置索引 索引类型 四种类型: 类型 英文名 ...

技术的搬运工 1773

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 243

html的index属性1是最小的吗,认识CSS中的z-index元素层级属性_html/css_WEB-ITnose

Z-index:指定了元素及其子元素的Z轴顺序,在Z元素发生覆盖的时候,哪个在下面,哪个在上面,一般都由Z-index来决定。Z-index的支持的属性值有:z-index:auto/整数/inherit;基本特性有:支持负值,支持animation动画,在css2.1中,需要和定位元素配合使用;如果不考虑CSS3,z-index只对定位元素起作用;z-index的使用:1、如果定位元素不发生嵌套...

weixin_42348026的博客 367

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 586

NVIDIA Video Codec SDK-解码接口cuvid简介

特性已废弃的 NVCUVID现代的 NVDECODE (底层 API)现代的 NVDECODE (高层 API - NvDecoder)状态已废弃 (Deprecated)官方推荐 (底层控制)官方推荐 (易用性首选)编程模型C 函数C 函数C++ 类复杂度高,需要管理大量细节中高,仍需管理解码会话低,开箱即用灵活性高高中(满足绝大多数场景)推荐对象遗留项目维护需要极致控制的高级用户所有新项目、大多数开发者。

fudexiang的博客 1176

c语言index =1,代码中index=-1是表达什么?

AKAkeepreal2019-02-17 14:43前面#include int getIndex(int arr[5],int value){int i;int index;for(i=0;i<5;i++){/* 请完善数组查询功能 */if(arr[i]==value){index=i;break;}else{index=-1;}}return index;}int main(){in...

weixin_33245447的博客 2938

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7871

【index:1,size:1错误】

index:1,size:1错误

qq_44936245的博客 3747

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

随机优化 (Stochastic Optimization) 算法详解及案例分析

随机优化是一种用于处理包含随机变量的优化问题的方法。其目标是通过考虑随机变量的概率分布,找到一个在期望意义下最优的解。

闲人编程的博客 4179

oracle 索引-1无效,Oracle Index索引无效的原因与解决方法

索引无效原因最近遇到一个Oracle SQL语句的性能问题,修改功能之前的运行时间平均为0.3s,可是添加新功能后,时间达到了4~5s。虽然几张表的数据量都比较大(都在百万级以上),但是也都有正确创建索引,不知道到底慢在了哪里,下面展开调查。经过几次排除,把问题范围缩小在索引上,首先在确定索引本身没有问题的前提下,考虑索引有没有被使用到,那么新的问题来了,怎么知道指定索引是否被启用。判断索引是否被...

weixin_39953244的博客 442

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

Oracle的Index-1(转)

Oracle的Index-1(转)--&gtRounders | 06 八月, 2007 17:31Oracle的Index-1作者:heyongzhou | 来自:不详 | 点击:387 | 发布:2001-11-8 ...

congli3478的博客 129

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Oracle 中的 unique index 和 non unique index的区别

今天做Schema评审的时候发现一个很奇怪的现象,也许是用工具生成的SQL语句,清一色的如下: CREATE TABLE table_name ( id NUMBER NOT NULL, ...... ...... ) ; CREATE INDEX table_name_PK ON table_name(ID) ; ALTER T...

killkill 6226

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN

㈠ Index SKIP SCAN              当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS       Skip scan会探测出索引前导列的唯一值个数,每个唯一值都会作为常规扫描的入口,在此基础上做一次查找,最后合并这些查询       例如:表employees (sex, employee_id,

记录创业路上的一些想法 3万+

oracle index range scan,深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN | 學步園...

㈠ Index SKIP SCAN當表有一個複合索引,而在查詢中有除了索引中第一列的其他列作為條件,並且優化器模式為CBO,這時候查詢計劃就有可能使用到SSSkip scan會探測出索引前導列的唯一值個數,每個唯一值都會作為常規掃描的入口,在此基礎上做一次查找,最後合併這些查詢例如:表employees (sex, employee_id, address) ,有一個組合索引(sex, emplo...

weixin_34961316的博客 897

ORACLE实现MySQL中substring_index函数功能

目录MySQL中substring_index函数ORACLE涉及函数实现函数源码 MySQL中substring_index函数 substring_index(string, delimiter, number) string:原始字符串。 delimiter:查找的分隔符。 number:搜索分隔符次数。若为正数,则从左侧开始查找,若为负数,则从右侧开始查找。 ORACLE涉及函数 instr( string, substring [, start_position [, th_appearanc

weixin_44158741的博客 5470

oracle加索引 oracle,Oracle之索引(Index)实例讲解 - 基础

Oracle索引(Index)是关系数据库中用于存放表中每一条记录位置的一种对象,主要目的是加快数据的读取速度和数据的完整性检查。索引的建立是一项技术性要求非常高的工作。一般在数据库设计阶段就要考虑到如何设计和创建索引。1. 创建索引创建索引的语法:CREATE [UNIQUE] INDEX [schema.] indexON [schema.] table (column [ASC | DESC...

weixin_36362326的博客 2400

ORACLE优化之执行规划(1) - TABLE FULL SCAN/INDEX FULL SCAN

ORACLE优化之执行规划(1) - TABLE FULL SCAN/INDEX FULL SCAN   TABLE FULL SCAN  全表扫描,表示表中所有记录都被访问到。如果表很大,  该操作对查询性能的影响会很大,此时,建议使用索引  或去掉查询中的LIKE操作。    EXPLAIN PLAN   SET statement_id = 'ex_plan1' FOR

东方未明 1万+

深入理解Oracle索引(2):INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCAN

㈠ INDEX UNIQUE SCAN              如果表上有唯一索引, 搜索索引列时会用上INDEX UNIQUE SCAN              原来Index Unique Scan和Index Range Scan在B Tree上的搜索路径是一样的       只是Index Unique Scan在找到应该含有要找的Index Key的block后便停止了搜索,因为该键

记录创业路上的一些想法 1万+

oracle中的index函数,index函数_excel中index函数的方法

Excel中经常需要使用到index函数,index函数具体该如何使用呢?下面是由学习啦小编分享的excel中index函数的方法,以供大家阅读和学习。excel中index函数的方法:index函数使用步骤1:下面用2个例子来说明数组形式和引用形式用法。index函数使用步骤2:首先介绍数组形式的使用方法index函数使用步骤3:举例1:在H2单元格中返回数组(D2:F11)中第3行、第3列的值...

weixin_42312523的博客 1779

oracle中alter index,oracle alter index rebuild online和alter index rebuild的區別

本文用10046事件來解析alter index rebuild與alter index rebuild online的區別alter index rebuild online實質上是掃描表而不是掃描現有的索引塊來實現索引的重建alter index rebuild 只掃描現有的索引塊來實現索引的重建。我們可以用10046事件來發現這個現象。一 先看alter index rebuild:SQL&...

weixin_30411455的博客 998

[Index]Index Scan

Index B-TreeIndex的叶节点指向RowID,然后根据RowID再找对应的Block语法:CREATE INDEX NAME_SALARY_IDX ON PERSON(LAST_NAME ASC,SALARY DESC);Index Unique Scan对于unique index来说,如果where条件后面是=,那么就会执行index unique scan。AskTom:well

田攀的日志 3158

oracle invisible index 的探索

os: centos 7.4 db: oracle 11.2.0.4 oracle 从 11g 开始提供 invisible index 索引,这对线上系统添加索引引起的性能异常提供了可控的方法。 准备表 -- drop table tmp_t0 purge; create table tmp_t0 as select * from dba_objects where 1=1 ; inser...

一名数据库爱好者的专栏 851

oracle的index与unique约束

一. 官网对Unique Constraints说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/datainte.htm#CNCPT1642          uniquekey constraint requires that every value in a column or set of column...

weixin_41492331的博客 2113

oracle hint_no_index

oracle hint系列9no_index1,如果指定了表中一个索引,表中其它索引仍可选用2,如果指定了表中所有的索引,不会使用表中所有的索引3,如果未指定索引,不会使用表中所有的索引,即会走此表的全表扫描...

1471
上一篇: ORACLE使用经验(转)
下一篇: Oracle的Index-3(转)
congwan5321
博客等级 码龄11年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值