Oracle列操作引起的全表扫描
首先是一种比较明显的情况:
select * from table where column + 1 = 2
这里对column进行了列操作,加1以后,与column索引里的内容对不上,导致column不走索引,走了全表扫描。
修改方式也很简单,把+1移到右边,即:
select * from table where column = 2-1
接下来是一种不可避免的列操作:
select * from table where upper(column) = 'ORACLE'
这里的upper不可避免,也无法用别的写法替代,怎么办?
这种情况只能建函数索引,即对upper(column)也建一个索引。
建函数索引是实在没办法的情况下,比如以上的例子。
然后是一些隐式转换引起的列操作,比如:
select * from table where column = 123 --这里的column是varchar2类型
执行的时候,会有个隐式的类型转换,也就是 to_number(column) = 123,这样column函数就不走索引,走了全表扫描。
所以应该避免这种隐式转换。
另外有一种隐式转换是这样的:
select * from table where column = '123' --这里的column是number类型
执行的时候,oracle会对‘123’做转换,即column = to_number('123')
这种情况没有什么坏处,column还是走了索引。
以上两个例子说明oracle是优先把字符串转成数字,虽然第二种情况无坏处,但实际情况下还是尽量避免隐式转换比较好。
实际情况中,单表的这种列操作容易发现,往往出问题的在多表连接,比如:
select a.id, b.id from table1 a, table2 b where a.column = b.column --这里a是大表,column类型为varchar2,b是小表,column类型为number
执行的时候,也会有个隐式转换,即 to_number(a.column) = b.column,导致a.column无法走索引。
修改方式为: select a.id, b.id from table1 a, table2 b where a.column = to_char(b.column)
将b.column做类型转换,虽然b.column无法走索引,但保证a.column可以走索引,因为a是大表,这样效率更高。
总之大表和小表连接时,如果有这种隐式转换,尽量让大表能够走索引。
以上这些问题,最好在写sql的时候就能注意到,否则后期去查会比较麻烦。
Oracle列操作引起的全表扫描的更多相关文章
- (转) Oracle SQL优化必要的全表扫描思路分析
大多数情况下,我们需要避免SQL在查询时进行全表扫描(FTS),但是对于必须需要进行全表扫描的情况,也可以进行一些优化处理. 即使全表扫描是检索所需数据的唯一可行方法,仍然有多种方法来提升查询性能.优 ...
- Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表
1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...
- Oracle全表扫描
优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...
- Oracle 高水位线和全表扫描
--Oracle 高水位线和全表扫描--------------------------2013/11/22 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至 ...
- Oracle的大表,小表与全表扫描
大小表区分按照数据量的大小区分: 通常对于小表,Oracle建议通过全表扫描进行数据访问,对于大表则应该通过索引以加快数据查询,当然如果查询要求返回表中大部分或者全部数据,那么全表扫描可能仍然是最好的 ...
- Oracle收集对表收集统计信息导致全表扫描直接路径读?
direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...
- Oracle 11g全表扫描以Direct Path Read方式执行
在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...
- oracle优化:避免全表扫描(高水位线)
如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...
- [转载]会引起全表扫描的几种SQL
查询语句的时候尽量避免全表扫描,使用全扫描,索引扫描!会引起全表扫描的几种SQL如下 1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like ‘%... ...
随机推荐
- Leetcode: Longest Substring with At Least K Repeating Characters
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- C# 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候 ...
- Java基础(60):Java打包生成Jar和Javadoc说明文档,以及在另外的工程中导入和使用自己的Jar
一.Jar包的导出 1.在Package Explorer中选中项目,右键,点击“Export” 2.在弹出框一次选择Java-->JAR file,点击Next 3.在新弹出的窗口选择 ...
- oracle 分页(rownum的理解) 以及 树节点的查询
1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...
- mac工具-解析json visualJSON和JSON Accelerator这两款工具
- sql 存储过程 分页
ALTER PROCEDURE [dbo].[BrokerToLenderDataShow2]@Where VARCHAR(200), --查询条件 不含'where'字符,如id>10 and ...
- sql 去除列中内容的单引号
update [dbo].[历史数据补全$] set bankCardNo=replace(bankCardNo,'''','') 总共4个单引号,外边2个是字符串固有的2个,里边两个就表示是一 ...
- JSP-08-第三方控件的使用
添加图片 下载 commons-fileupload-1.2.2.jar和commons-io-2.4.jar 导入项目 在添加涂抹的页面设置表单属性 enctype=”multipart/form ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON CheckDifference
zw版[转发·台湾nvp系列Delphi例程]HALCON CheckDifference unit Unit1;interfaceuses Windows, Messages, SysUtils, ...
- CentOS:安装桌面GNOME图形化界面
u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...