首先是一种比较明显的情况:

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列操作引起的全表扫描的更多相关文章

  1. (转) Oracle SQL优化必要的全表扫描思路分析

    大多数情况下,我们需要避免SQL在查询时进行全表扫描(FTS),但是对于必须需要进行全表扫描的情况,也可以进行一些优化处理. 即使全表扫描是检索所需数据的唯一可行方法,仍然有多种方法来提升查询性能.优 ...

  2. Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

    1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...

  3. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...

  4. Oracle 高水位线和全表扫描

    --Oracle 高水位线和全表扫描--------------------------2013/11/22 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至 ...

  5. Oracle的大表,小表与全表扫描

    大小表区分按照数据量的大小区分: 通常对于小表,Oracle建议通过全表扫描进行数据访问,对于大表则应该通过索引以加快数据查询,当然如果查询要求返回表中大部分或者全部数据,那么全表扫描可能仍然是最好的 ...

  6. Oracle收集对表收集统计信息导致全表扫描直接路径读?

    direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...

  7. Oracle 11g全表扫描以Direct Path Read方式执行

    在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...

  8. oracle优化:避免全表扫描(高水位线)

    如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...

  9. [转载]会引起全表扫描的几种SQL

    查询语句的时候尽量避免全表扫描,使用全扫描,索引扫描!会引起全表扫描的几种SQL如下 1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like ‘%... ...

随机推荐

  1. 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 ...

  2. C# 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付            今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候 ...

  3. Java基础(60):Java打包生成Jar和Javadoc说明文档,以及在另外的工程中导入和使用自己的Jar

    一.Jar包的导出 1.在Package Explorer中选中项目,右键,点击“Export”   2.在弹出框一次选择Java-->JAR file,点击Next   3.在新弹出的窗口选择 ...

  4. oracle 分页(rownum的理解) 以及 树节点的查询

    1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...

  5. mac工具-解析json visualJSON和JSON Accelerator这两款工具

  6. sql 存储过程 分页

    ALTER PROCEDURE [dbo].[BrokerToLenderDataShow2]@Where VARCHAR(200), --查询条件 不含'where'字符,如id>10 and ...

  7. sql 去除列中内容的单引号

    update  [dbo].[历史数据补全$]  set  bankCardNo=replace(bankCardNo,'''','') 总共4个单引号,外边2个是字符串固有的2个,里边两个就表示是一 ...

  8. JSP-08-第三方控件的使用

    添加图片 下载 commons-fileupload-1.2.2.jar和commons-io-2.4.jar 导入项目 在添加涂抹的页面设置表单属性  enctype=”multipart/form ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON CheckDifference

    zw版[转发·台湾nvp系列Delphi例程]HALCON CheckDifference unit Unit1;interfaceuses Windows, Messages, SysUtils, ...

  10. CentOS:安装桌面GNOME图形化界面

    u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...