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

Oracle数据库字段上建立索引

阅读更多

当where子句对某一列使用函数时,除非利用这个简单的技术强制索引,否则Oracle优化器不能在查询中使用索引。

通常情况下,如果在WHERE子句中不使用诸如UPPER、REPLACE 或SUBSTRD等函数,就不能对指定列建立特定的条件。但如果使用了这些函数,则会出现一个问题:这些函数会阻碍Oracle优化器对列使用索引,因而与采用索引的情况相比较,查询会花费更多的时间。

庆幸的是,如果在使用函数的这些列中包含了字符型数据,可以用这样一种方法修改查询语句,以达到强制性使用索引,更有效地运行查询。这篇文章介绍了涉及的技术,并说明了在两种典型情况下怎样实现。

大小写混合情况

在讨论由于函数修改了列的内容,如何强制使用索引前,让我们首先看看为什么Oracle优化器在这种情况下不能使用索引。假定我们要搜寻包含了大小写混合的数据,如在表1中ADDRESS表的NAME列。因为数据是用户输入的,我们无法使用已经统一改为大写的数据。为了找到每一个名为john的地址,我们使用包含了UPPER子句的查询语句。如下所示:

SQL> seleCT address from address where upper(name) like 'JOHN';

在运行这个查询语句前,如果我们运行了命令"set autotrace on", 将会得到下列结果,其中包含了执行过程:

ADDRESS
    cleveland
    1 row selected.
    Execution Plan
    SELECT STATEMENT
    TABLE ACCESS FULL ADDRESS

可以看到,在这种情况下,Oracle优化器对ADDRESS 表作了一次完整的扫描,而没有使用NAME 列的索引。这是因为索引是根据列中数据的实际值建立的,而UPPER 函数已经将字符转换成大写,即修改了这些值,因此该查询不能使用这列的索引。优化器不能与索引项比较"JOHN",没有索引项对应于"JOHN"-只有"john" 。

值得庆幸的是,如果在这种情况下想要强制使用索引,有一种简便的方法:只要在WHERE 子句中增加一个或多个特定的条件,用于测试索引值,并减少需要扫描的行,但这并没有修改原来SQL 编码中的条件。以下列查询语句为例:

SQL> select address from address where upper(name) like 'JO%' AND (name 
  like 'J%' or name like 'j%');

使用这种查询语句(已设置AUTOTRACE),可得到下列结果:

ADDRESS
    cleveland
    1 row selected.
    Execution Plan
    SELECT STATEMENT
        CONCATENATION
            TABLE ACCESS BY INDEX ROWID ADDRESS
                INDEX RANGE SCAN ADDRESS_I 
            TABLE ACCESS BY INDEX ROWID ADDRESS
                INDEX RANGE SCAN ADDRESS_I
现在,优化器为WHERE 子句中AND 联结的两个语句中每一个语句确定的范围进行扫描----第二个语句没有引用函数,因而使用了索引。在两个范围扫描后,将运行结果合并。

在这个例子中,如果数据库有成百上千行,可以用下列方法扩充WHERE 子句,进一步缩小扫描范围:

select address from address where upper(name) like 'JOHN' AND (name like 'JO%' 
  or name like 'jo%' or name like 'Jo' or name like 'jO' );

得到的结果与以前相同,但是,其执行过程如下所示,表明有4个扫描范围。

Execution Plan
     SELECT STATEMENT
        CONCATENATION
            TABLE ACCESS BY INDEX ROWID ADDRESS
                INDEX RANGE SCAN ADDRESS_I
            TABLE ACCESS BY INDEX ROWID ADDRESS
                INDEX RANGE SCAN ADDRESS_I
            TABLE ACCESS BY INDEX ROWID ADDRESS
                INDEX RANGE SCAN ADDRESS_I
            TABLE ACCESS BY INDEX ROWID ADDRESS 
                INDEX RANGE SCAN ADDRESS_I

如果试图进一步提高查询速度,我们可以在特定的"name like"条件中指明3个或更多的字符。然而,这样做会使得WHERE子句十分笨重。因为需要大小写字符所有可能的组合-joh ,Joh,jOh,joH等等。除此之外,指定一个或两个字符已足以加快查询的运行速度了。

现在让我们看看,当我们引用不同的函数时,怎样运用这个基本技术。

使用REPLACE的情况

正如名字不总是以大写输入一样,电话号码也会以许多格式出现: 如 123-456-7890, 123 456 7890,(123)456-7890 等等。

如果在列名为 PHONE_NUMBER中搜寻上述号码时,可能需要使用函数REPLACE以保证统一的格式。如果在PHONE_NUMBER列中只包含空格、连字符和数字,where 子句可以如下所示:

WHERE replace(replace(phone_number , '-' ) , ' ' ) = '1234567890'

WHERE子句两次使用REPLACE 函数去掉了连字符和空格,保证了电话号码是简单的数字串。然而,该函数阻止了优化器在该列使用索引。因此,我们按如下方法修改WHERE子句,以强制执行索引。

WHERE replace(replace(phone_number, '-' ) , ' ' ) = '1234567890'

AND phone_number like '123% '如果我们知道数据中可能包含圆括号,WHERE 子句会稍微复杂一点。我们可以再增加REPLACE 函数(去掉圆括号、连字符和空格),按如下所示扩充增加的条件:

WHERE replace(replace(replace(replace(phone_number , ' - ' ) ,' '), '( ' ) 
  , ' ) ' ) = '1234567890'
   AND (phone number like ' 123% ' or phone_number like ' (123% ' ) '

该例强调了巧妙地选用WHERE 子句条件的重要性,而且,这些条件不会改变查询结果。你的选择应基于完全了解该列中存在的信息类型。在该例中,我们需要知道 PHONE_NUMBER 数据中存在几种不同的格式,这样,我们能够修改WHERE 子句而不会影响查询结果。

正确的条件

以后当你遇到包含CHARACTER 数据修改函数列的WHERE 子句时,应考虑怎样利用增加一个或两个特定的条件,迫使优化器使用索引。适当地选择一组特定的条件能减少扫描行,并且强制使用索引不会影响查询结果----但却提高了查询的执行速度。

分享到:
评论

相关推荐

    在OracleE数据库的字段上建立索引的方法

    当where子句对某一列使用函数时,除非利用这个简单的技术强制索引,否则Oracle优化器不能在查询中使用索引。 通常情况下,如果在WHERE子句中不使用诸如UPPER、REPLACE 或SUBSTRD等函数,就不能对指定列建立特定的...

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle字段上建立并使用索引 29 用Windows脚本宿主自动化Oracle工具 31 进程结构和内存结构 32 Oracle监控数据库性能的SQL汇总 36 Oracle如何精确计算row的大小 38 PL/SQL编程 39 数据库的分组问题 41 oracle知识 42...

    Oracle数据库设计策略及规范.docx

    而如果以流水号为索引字段建立索引进行相同的查询,所用时间不到1秒。因此在大型数据库设计中,只有进行合理的索引字段选择,才能有效提高整个数据库的操作效率。 有时候为了提高性能。减少表的关联,恰当的数据...

    Oracle数据库课程设计报告(1).doc

    设计环境 1.Windows7旗舰版32位 2.Microsoft Visual Studio 2005 3.Oracle 11g 第2章 概要设计 2.1系统需求分析 图书管理系统主要是用oracle数据库进行逻辑处理,实现对图书信息的增删改查,以 及出库入库的管理。...

    oracle数据库经典题目

    系统权限提供了在Oracle数据库系统范围内执行某种任务的操作能力,而对象权限则是一种赋予用户在指定的数据库对象(如表、视图、过程等) 16. Oralce数据库在进行物理备份有联机备份和脱机备份两种方式可供选择。 ...

    Oracle数据库设计规范建议.doc

    Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生 的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很 好的保证。 ...

    Oracle管理艺术 中文版

    这是一本集10年经验而成的书,使用循序渐进的编写方式,着重于实例,以确保理论内容的准确度。本书作者从事oracle ...*认知索引在性能调试方面所扮演的关键角色,应能在正确的时间,建立正确类型的索引及正确的字段。

    PRM-DUL Oracle(数据库恢复工具) v4.1.zip

    PRM-DUL Oracle数据库恢复工具,一款专为Oracle数据救援而研发的企业级工具。可在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)使用并支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发...

    数据库设计规范-编码规范.docx

    c) 编写数据库建数据库、建数据库对象、初始化数据脚本文件 4.3 设计原则 a) 采用多数据文件 b) 禁止使用过大的数据文件,unix系统不大于2GB,window系统不超过500MB c) oracle数据库中必须将索引建立在索引表空间里...

    最全的oracle常用命令大全.txt

    Oracle数据库有哪几种启动方式 说明: 有以下几种启动方式: 1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动...

    基于索引的SQL语句优化之降龙十八掌

    在这一基础上可以初步判断出哪些表的哪些字段应该建立索引。其次,必须熟悉应用程序。必须了解哪些表是数据操作频繁的表;哪些表经常与其他表进行连接;哪些表中的数据量可能很大;对于数据量大的表,其中各个字段的...

    数据库设计规范(3).doc

    5 3.10 索引(Index) 命名规范 5 3.11 约束(Constraint) 命名规范 5 4 数据模型产出物规范 5 附录A:xml文件使用说明 7 附录B:保留关键字 8 编写目的 本文的目的是提出针对Oracle数据库的设计规范,使利用Oracle...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    ORACLE9i_优化设计与系统调整

    §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §...

    小型数据库

    建立一个类似Oracle\SQL Server的小型数据库系统: 可建立表,表有字段、类型 ... 对主键字段,应自动建立索引; 当进行查询时,在主键上应是基于索引的高效查询,而不能是字符串匹配这样的原始查询。

    5.4空间数据库管理系统.pdf

    速度更慢 特点: 空间数据库引擎 3 SDE(Spatial Database Engine): 建立在现有关系数据库基础上 介于GIS应用程序和空间数据库间的中间件,为用户提供访问空间数 据库的统一接口 SDE引擎本身不具有存储功能,只...

    jf_Oracle_经典笔记.docx

    一、 常见问题记录 3 ... 2. 数据库重启 5 ...6. 查看索引类别以及查看索引字段被引用的字段方法 141 二十、 SQL优化: 141 1. sql查询语句优化 141 2. 提高SQL查询效率 143 3. 百万级数据库优化方案 149

    表结构设计器_小巧的数据库建模工具

    表结构设计:创建表、字段、主键、外键、索引和注释; b. 表描述:可直接编辑文字描述快速生成表结构,爱用键盘的人会喜欢这个功能; c. 模型图:自动生成模型图;可设计和显示物理/逻辑视图,支持自动布局、平移...

Global site tag (gtag.js) - Google Analytics