oracle中where条件后用in这样子查询后变慢
今日开发一个需求,其中由于需求变态,写了一个挺复杂的sql,在本地测试环境看不出问题,但到了生产就变得非常慢(由于表数据量比较大),把sql粘贴出来执行了一下大概要42秒.
我写的sql大概是这个样子的(大概描绘下)TABLE_A表数据量大概200w,其中一些关键字段建了索引
select * from TABLE_A a
where a.lng>={变量} and a.lng<={变量}
and a.lat>={变量} and a.lat<={变量}
and a.ci_code in(
...一个复杂sql,执行条件后大概也就几十条数据
)
就是这样一个sql执行却很慢,如果我单独执行红色或单独执行蓝色部分sql就很快,又或者我把红色部分>=与<=截开查询就很快,但放在一起就相当慢。
然后看了下执行计划,主要原因是由于where条件后><(或者or之类的)并且用到in导致驱动表被错误的选择,驱动表选择了“大表”。
后来看到了一篇博文,改造了一下果然就很快了,大概1~2秒就完事了。
改造后
select * from TABLE_A a
where a.lng>={变量} and a.lng<={变量}
and a.lat>={变量} and a.lat<={变量}
intersect
select * from TABLE_A a
where
a.ci_code in(
...一个复杂sql,执行条件后大概也就几十条数据
)
注:intersect是Oracle函数中交并差的交,即是取出两个集合中相同的部分;union、union all是并,union会过滤重复数据,union all不会;minus: 返回在第一个查询结果中包含第二个查询结果中不包含的数据。
还有一种情况可能会导致查询时间过长:
or 和子查询连用导致oracle无法查询重写了(t.DSTC_ID = 1919 ort.DSTC_ID in(select b.regoinidfrom area_info_center@srcdb bwhere b.parentregoinid = 1919)改成 t.DSTC_ID in(select b.regoinidfrom area_info_center@srcdb bwhere b.parentregoinid = 1919 union select 1919 from dual)
一个朋友新做的公众号,帮忙宣传一下,会不定时推送一些开发中碰到的问题的解决方法,以及会分享一些开发视频。资料等。请大家关注一下谢谢:
以上博客参考:
https://blog.csdn.net/ardo_pass/article/details/78545195
oracle中where条件后用in这样子查询后变慢相关推荐
- oracle查询多张表交集,Oracle中对两个数据表交集的查询-专栏,ORACLE
oracle关系型管理系统是世界上流行的关系,它是一个极其强悍.灵活和复杂的系统,据说,在使用oracle时应有这样的观念,那就是在sql中近乎可以推动任何一种想法. 下面向你们介绍使用sql查两个o ...
- oracle where in优化,【求助】为什么在where过滤条件中使用in这样子查询后速度变的非常慢?!...
本帖最后由 yujian0902 于 2014-5-27 16:33 编辑 有次帮同事优化SQL,发现写的SQL使用in这种过滤方式,查询出来花了将近6分钟:而后我改成连接方式(join),不到一秒钟 ...
- Oracle中不同条件的日期查询
select * from mytable where to_char(install_date,'YYYYMMDD') > '20050101' select ...
- java查询数据比Oracle少,java对ORACLE中的于NCHAR数据的处理,查询
nchar 数据如果指定了长度,如果数据不满指定的位数,将会在后面补空格. 所以当你使用 jdbc 或者其他框架以该字段作为查询条件时,形成的 sql 也会自动补空格 如: SELECT FROM m ...
- java nchar_java对ORACLE中的于NCHAR数据的处理,查询
nchar 数据如果指定了长度,如果数据不满指定的位数,将会在后面补空格. 所以当你使用 jdbc 或者其他框架以该字段作为查询条件时,形成的 sql 也会自动补空格 如: SELECT FROM m ...
- 【数据库】Oracle中的复杂数据处理
在介绍了Oracle中的基本数据类型及相应的处理函数后,本章将介绍Oracle中较为复杂的数据处理. 接下来,本文将介绍: 1.利用聚合函数来统计数据: 2.常用技巧: 3.oracle中的基本运算: ...
- oracle中函数怎么使用方法,Oracle中函数的使用
1.decode () 例子:它的写法如下decode('a','b','c','d'),其中a,b,c,d可以是其他函数也可以是数值,依据我们自己的情况来使用,它的含义是如果a=b,那么结果显示c, ...
- oracle将字符串前移,将字符串转换为oracle中的格式编号
我正在使用Oracle 10g并具有数据库列Q1的数据类型为varchar2的数据库.该列主要保存float和int值.将字符串转换为oracle中的格式编号 我想运行一个查询,将获取值,但具有标准美 ...
- oracle中count用法
Oracle 中count函数用法 Count用来统计查询结果有几条记录 例表 t_test 姓名 性别 年龄 工资 张三 男 23 2000 李四 女 34 王武 男 25 1300 ① 简单应用 ...
最新文章
- JEECG微云快速开发平台
- 禅道项目管理软件介绍
- uglify压缩angular控制器注意
- 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)
- 微信小程序 界面从右边滑出_微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)...
- 倒推后台系统_CRM客户管理系统
- python前端用什么架构_Python web世界观——web架构概览(适合传统软件工程师)...
- 换种思路去理解设计模式(上)
- 苹果Mac 2D/3D数字雕刻软件:Pixologic Zbrush
- CF卡显示位置不可用无法访问介质受写入保护怎么办
- 【原创smarty仿淘宝商品图片轮播+放大镜效果】
- 创建型模式 - 单例模式Singleton
- C++初学必练基础题【第二期】
- 英语单词在原意和计算机意思,计算机英语单词:Backbone的意思
- Django——model基础
- C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)
- 如何使用迅捷CAD编辑器将CAD导出为PDF
- idc机房建设费用_建一个IDC机房要多少资金
- sql修改表属性常见错误之——多个对象访问某一列
- 【手写数字识别】RBM神经网络手写数字识别【含GUI Matlab源码 1109期】