知识大全 Oracle数据库强制索引

Posted 索引

篇首语:艺术是生活的镜像,生活给了艺术再创造的灵感和力量。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle数据库强制索引相关的知识,希望对你有一定的参考价值。

Oracle数据库强制索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

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

大小写混合情况

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

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

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

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

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

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

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

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

  ADDRESS cleveland 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 );

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

  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 条件中指明 个或更多的字符 然而 这样做会使得WHERE子句十分笨重 因为需要大小写字符所有可能的组合 joh Joh jOh joH等等 除此之外 指定一个或两个字符已足以加快查询的运行速度了

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

使用REPLACE的情况

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

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

  WHERE replace(replace(phone_number ) ) =

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

  WHERE replace(replace(phone_number ) ) = AND phone_number like %

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

  WHERE replace(replace(replace(replace(phone_number ) ) ( ) ) ) = AND (phone number like % or phone_number like ( % )

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

正确的条件 cha138/Article/program/Oracle/201311/18519

相关参考

知识大全 oracle数据库如何重建索引

  当索引的碎片过多时会影响执行查询的速度从而影响到我们的工作效率这时候采取的最有利的措施莫过于重建索引了本文主要介绍了Oracle数据库中检查索引碎片并重建索引的过程接下来我们就开始介绍这一过程  

知识大全 Oracle数据库中索引的维护

Oracle数据库中索引的维护  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文只讨论Orac

知识大全 Oracle数据库中的索引详解

Oracle数据库中的索引详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一ROWID的概念

知识大全 讲解Oracle数据库的全文索引设置步骤

讲解Oracle数据库的全文索引设置步骤  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Orac

知识大全 在Oracle中合理创建数据库的索引

在Oracle中合理创建数据库的索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Oracl

知识大全 Oracle数据库索引优化技术关联查询性能调优

Oracle数据库索引优化技术关联查询性能调优  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数

知识大全 讲解Oracle数据库B-tree索引

讲解Oracle数据库B-tree索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!假如聚簇因子过

知识大全 Oracle和IBM将XML索引能力加入数据库

Oracle和IBM将XML索引能力加入数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  O

知识大全 在Oracle数据库中按用户名重建索引的方法

在Oracle数据库中按用户名重建索引的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果

知识大全 位图索引的故事

  您如果熟悉Oracle数据库我想您对ThomasKyte的大名一定不会陌生Tomas主持的网站享誉Oracle界数十年绝非幸致最近在图书馆借到这位Oracle绝顶高手编著的《ExpertOracl