博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle查询语句中指定索引时优化器及指定索引不好使的处理方法
阅读量:4355 次
发布时间:2019-06-07

本文共 965 字,大约阅读时间需要 3 分钟。

Oralce多表联合查询时,Oracle优化器会选择相应的索引以提高性能。一些情况下,Oracle优化器不能选择正确的索引,此时可以通过查询语句指定特定的索引以提高性能。

例:有两个表A和B 要进行联合查询 A表有索引 IDX_A1_A2  ,A表和B表的关联条件是A.ID=B.ID

通常的SQL查询是 select A.c1,A,c2,B.c3,B.c4 from A,B where A.ID=B.ID  但是数据量在的时候感觉很慢,建立的索引起作用,需要手动指定一下.

加指定索引的语法是: /*+ index(表名,索引名) */

例如:

 select  /*+ index(A,IDX_A1_A2 ) */ A.c1,A,c2,B.c3,B.c4 from A,B where A.ID=B.ID 如果表有重命名,表名要输入重命名的表名.

例如:

 select  /*+ index( t ,IDX_A1_A2 ) */ t.c1,t,c2,B.c3,B.c4 from A t,B where t.ID=B.ID

但某些特殊情况下,即便使用上述方式在SQL查询语句中指定要使用使用的索引,Oracle仍可能固执的使用它认为正确的索引,

如何让Oracle放弃它自认为正确的索引而改用指定的索引呢:

仍以前面例子为例,查询条件中“ A.ID=B.ID”,若ID为A表的主键、B表的外键,Oracle很有可能优先使用些唯一性索引,而放弃A表上的其他索引,

若想让Oracle放弃使用此唯一性索引,可以将查询条件改为“A.ID||'a'= B.ID||'a',A.ID后加了“ || 'a'”后A表上的唯一性索引即会失效,

Oracle近尔会使用A1表上的其他索引:

例:select  /*+ index( t ,IDX_A1_A2 ) */ t.c1,t,c2,B.c3,B.c4 from A t,B where t.ID||'a'=B.ID||'a'

在A.ID后加“ || 'a'”只是让Oracle放弃索引的一种方法,导致Oracle不使用索引的情况有很多,都可以拿来达到这个目的。

 

转载于:https://www.cnblogs.com/BetterWF/archive/2012/12/02/2798742.html

你可能感兴趣的文章
sublime text3最新版本注册码(build 3143)
查看>>
linux使用技巧
查看>>
必背公式及常数
查看>>
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
查看>>
js时间戳转时间格式
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Linux的用户态和内核态
查看>>
JavaScript原生错误及检测
查看>>
(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()
查看>>
为什么写作
查看>>
整数子数组求最大和添加验证
查看>>
使用kubeadm安装Kubernetes
查看>>
Principal Component Analysis 主元分析
查看>>
linux分割字符串操作
查看>>
PHP学习2
查看>>
多实例Mysql配置
查看>>
linux下安装Mongodb
查看>>
Page.RegisterStartupScript和Response.Write的区别。
查看>>
hdu4348区间更新的主席树+标记永久化
查看>>
ZOJ 2532 Internship
查看>>