- 浏览: 725401 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (442)
- 中间件 (20)
- hibernate (13)
- spring (20)
- 数据库 (78)
- struts (8)
- ibatis (4)
- 前端 (61)
- linux,windows (21)
- it大环境 (32)
- IDE工具 (36)
- 感悟 (6)
- java基础 (40)
- 经典面试题 (10)
- exception总结 (14)
- 软件设计 (8)
- 工具类应用及新技术 (48)
- php (2)
- 微信 (1)
- 设计模式 (2)
- 重构 (3)
- 管理 (2)
- 工作笔记 (1)
- jmx (1)
- 算法 (4)
- 多线程同步 (2)
- 代码管理工具 (5)
- 代码检测及测试 (2)
- 缓存服务 (1)
- SOA及ROA (5)
- groovy (1)
- 网络编程 (2)
- 大数据 (6)
最新评论
-
love398146779:
我当然不能全写上面了,这只是其中一部分https连接。
java 建立 https连接 -
yuenkin:
大哥,这是双向认证吗?
java 建立 https连接 -
issu:
例如以下代码能遍历字符串"Tom:M ...
<c:forTokens>标签delims截取字符 -
love398146779:
2*3*5=30,是30个以上的请求才拒绝呀。
tomcat的maxThreads、acceptCount(最大线程数、最大排队数) -
love398146779:
2台跟1台一样的效果。
zookeeper与activemq最新存储replicatedLevelDB整合
当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 子句时,应考虑怎样利用增加一个或两个特定的条件,迫使优化器使用索引。适当地选择一组特定的条件能减少扫描行,并且强制使用索引不会影响查询结果----但却提高了查询的执行速度。
发表评论
-
sqlserver identity总结
2016-05-09 15:26 885想要将值插入到自动编 ... -
mysql 转sqlserver中遇到的坑
2016-05-06 18:09 1300mysql 转sqlserver中遇到的 ... -
sqlserver 函数cast与拼接
2016-05-04 12:01 936今天项目用到sqlserver,已经有8年不用这个sqlser ... -
mysql更新
2016-01-26 17:25 370UPDATE souyue02.sy_category_inf ... -
SELECT INTO 和 INSERT INTO SELECT
2015-10-09 16:51 445http://www.cnblogs.com/freshman ... -
mysql --------for routine错
2015-09-09 19:19 684调用存储过程时报了下面的错误 ERROR 1370 (4200 ... -
mysql存储--游标
2015-09-09 18:21 443游标的使用 要声明, 1.接收游标数据的变量 2.遍历数据结 ... -
You can't specify target table 't' for update in FROM clause
2015-09-08 16:41 391You can't specify target table ... -
mysql中如何判断字段是否包含中文
2015-09-08 16:31 2568SELECT * FROM a WHERE length( ... -
MSSQL和MySQL中,数据表两列字段值互换的问题,记录下
2015-09-08 16:29 1649MSSQL的处理方法 update table1 set fi ... -
Mongodb的update操作
2015-04-04 11:56 5511).update()命令 db.collection.up ... -
从Mongo的一些总结
2015-03-26 17:40 323var timestamp = _id.toString(). ... -
mysql加密解密函数AES_ENCRYPT与AES_DECRYPT
2014-12-02 15:05 2674mysql下的加密函数有如下几个 PASSWORD():创建 ... -
mysql加密解密函数AES_ENCRYPT与AES_DECRYPT
2014-12-02 15:04 1174mysql下的加密函数有如下几个 PASSWORD():创建 ... -
Mysql 查看连接数,状态
2014-11-27 17:24 1120http://blog.csdn.net/starnight_ ... -
sqlserver2008 jar驱动
2014-11-10 13:31 745JAVA要连接SQL SERVER2008,必须要用JDBC驱 ... -
mysql语句学习
2014-11-06 17:34 532select sysdate(),now(), sleep(3 ... -
win8不允许从远程连接MySql解决办法
2014-11-06 11:22 664在安装mysql的机器上运 ... -
plsql写表中字段及注释时为乱码
2014-09-01 11:55 2192修改pl/sql developer 的编码格式: 在win ... -
在Oracle中调用java程序
2014-07-16 13:46 617注意:java方法必须是static类型的,如果想在JAVA中 ...
相关推荐
### Oracle索引优化相关知识点详解 #### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果...
Oracle索引优化是数据库性能调优的关键环节,它关乎到数据检索速度和整体系统的效率。在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型...
本篇将详细探讨Oracle优化器模式以及Oracle索引优化规则。 首先,Oracle优化器主要有两种模式:基于规则的优化(RBO)和基于代价的优化(CBO)。RBO在早期版本中较为常见,它根据预设的规则来决定查询路径,例如,...
Oracle 数据库索引优化方法探析 Oracle 数据库索引优化方法探析是指通过对 Oracle 数据库索引的分析和优化,以提高数据库的查询效率和性能。 Oracle 数据库索引是一种数据结构,用于快速访问数据库表的特定信息。...
本文主要探讨如何通过优化Oracle索引来提升查询效率。 首先,我们需要理解索引对查询效率的影响。创建索引的主要目的是加速数据检索,但并非所有索引都能提高查询速度。Oracle可能会选择全表扫描而非索引扫描,这...
总结,Oracle索引优化是一个涉及多方面因素的过程,包括索引类型选择、设计策略、维护以及特定于Oracle的技术。理解并熟练运用这些知识,能有效提升数据库的性能,降低系统响应时间,从而提高用户满意度。在实践中,...
此外,了解并运用Oracle的索引优化特性也很重要,如索引组织表(Index-Organized Table, IOT)、覆盖索引(Covering Index)以及物化视图(Materialized View)等。 总的来说,Oracle索引详解及SQL优化是一个深度...
Oracle数据库的优化是数据库管理员和开发人员关注的重要领域,其中索引的概念和使用是关键的一环。本篇文章将深入探讨Oracle中的索引...在实践中,需要结合业务需求和查询模式,灵活运用这些知识,进行有效的索引优化。
Oracle 索引分析与查询优化 Oracle 是一种关系型数据库,广泛应用于国内交通、电力、通信和金融等重要领域。 Oracle 在处理数据效率和数据安全上有非常大的提高,磁盘阵列技术(RAID)和集群技术(RAC)的运用也...
Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...
* 用索引优化向导创建索引:索引优化向导是 SQL Server 2000 提供的新的创建索引工具,使用查询优化器分析工作负荷中的查询任务,向有大量工作负荷的数据库推荐最佳的索引混合方式,以加快数据库的查询。 索引的...
### Oracle DBA实战索引优化 #### 一、索引概述与原理 索引是数据库管理系统(DBMS)中一种可选的数据结构,它的主要目的是为了加快数据查询的速度。Oracle数据库中的索引通常由一系列行标识符(ROWID)及其对应的...
### Oracle索引类型详解 #### 一、B\*Tree索引:数据检索的基石 在Oracle数据库中,B\*Tree索引是最常见的索引结构,也是默认创建的索引类型。它基于二叉树原理,由分支块(branch block)和叶块(leaf block)构成,...
总的来说,Oracle索引优化是一个综合性的过程,涉及到对查询语句的理解、索引类型的选取、NULL值的处理以及数据类型的一致性。通过深入了解这些原理,我们可以更好地设计和管理索引,以提升数据库的性能和响应速度。...
总的来说,理解Oracle的各种索引类型及其工作原理对于优化数据库性能、提高查询效率至关重要。在实际应用中,数据库管理员需要根据业务需求和数据特性,合理设计和使用索引,以实现最佳的数据库性能。
Oracle索引被限制的一些情况 Oracle索引是关系数据库管理系统中用于提高查询效率的一种机制,但是索引的使用也存在一些限制。本文将详细介绍一些常见的限制情况,帮助开发人员更好地使用索引,提高查询效率。 限制...