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 ‘%... ...
随机推荐
- Oracle忽略hint的几种情形
1.hint有语法错误.拼写错误 2.hint无效.比如索引不存在.非等值查询使用hash hint等 3.多个hint之间自相矛盾 4.hint受到了查询转换的影响 5.hint受到了数据库保留字的 ...
- UIButton详解
// ----------------------------------UIButton------------------------------ // UIButtonTypeSystem 点击 ...
- .NET Framework 4 中的并行编程9---线程安全集合类
原文转载自:http://www.cnblogs.com/xray2005/archive/2011/10/11/2206745.html 在.Net 4中,新增System.Collections. ...
- Shell cmd set note
查看启动信息 dmesg [ 0.000000] Initializing cgroup subsys cpuset[ 0.000000] Initializing cgroup subsys cpu ...
- Swift游戏实战-跑酷熊猫 02 创建熊猫类
要点: 如何继承SKSpriteNode :子类必须调用SKSpriteNode的一个指定构造器 init(){ super.init(texture:texture,color:UIColor.wh ...
- Lintcode: Rehashing
The size of the hash table is not determinate at the very beginning. If the total size of keys is to ...
- 2-sat按照最小字典序输出可行解(hdu1814)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- [转]解析json:与array,list,map,bean,xml相互转化
一.解析json之net.sf.json 下载地址 使用netsfjson需要导入的包 JSONObject JSONArray JavaBean与json字符串互转 List与json字符串互转 M ...
- haskell笔记2
模式匹配 # haskell_test.hs length' :: [a] -> a length' [] = 0 length' (_:x) = 1 + length' x as模式 xs@x ...
- CSSの神小结-简单备忘一下(亲测可用)
css 选择器优先级,标签>id>class 权重 id>class>标签 只记录能想到的以免遗忘: 1.字体css可继承 2.表格:表格细线的合并,表格单元格合并,单元格内容 ...