Oracle-oracle联合查询优化

发布于 2017-01-22 18:46:29 字数 409 浏览 1306 评论 9

现有下面一段sql如何能优化一下速度更快一点呢?

select *  from  A to_char(input_date,'yyyy-mm-dd') > '2012-06-15' and to_char(input_date,'yyyy-mm-dd') < '2012-07-01'and is_verify = '1' 
and dj_id not in (select source_id from B where to_char(input_date,'yyyy-mm-dd') > '2012-06-15'
and to_char(input_date,'yyyy-mm-dd') < '2012-07-01' and source_id like '%DD%');

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

虐人心 2017-10-13 03:33:25

不知道你的业务是什么样子,但是尽量不要用not in,使用in进行索引查询,能快很多,在Oracle中not in是不通过索引的,但是in是通过索引检索数据,按照你的业务逻辑,修改一下使用in查询。

泛泛之交 2017-09-10 15:41:28

问题还是出在Not in 上面,像你说的这个些表是用于审核的话,这段SQL会直接导致系统崩溃,
正确的做法应该是分开执行两段SQL,将问题放入到应用中去处理

昨天看错了楼主的需求,把中间错误代码删掉了,以为楼主要查审核的数据,于是想了一下稍微麻烦点的方式来处理

--查询通过审核的数据
select * from A
where to_char(input_date, 'yyyy-mm-dd') > '2012-06-15'
and to_char(input_date, 'yyyy-mm-dd') < '2012-07-01'
and is_verify = '1'
and dj_id in (select source_id from B
where to_char(input_date,'yyyy-mm-dd') >'2012-06-15'
and to_char(input_date, 'yyyy-mm-dd') < '2012-07-01'
and source_id like '%DD%');)
--查询全部符合时间范围的数据
select * from A
where to_char(input_date, 'yyyy-mm-dd') > '2012-06-15'
and to_char(input_date, 'yyyy-mm-dd') < '2012-07-01'
and is_verify = '1'

最后在应用中从后者集合中移除出通过审核的数据,就得到了未通过审核的数据。

虐人心 2017-07-17 06:23:29

时间字段可以考虑函数索引,会快很多的。
另外,not in 还是用 not exists吧,这个用索引。
like的问题大家已经说了。

如果是PL SQL DEVELOPER,还是用F5看一下你的执行计划吧。

清晨说ぺ晚安 2017-07-06 12:16:30

如果数据很多,把条件的日期格式化,数据库中储存的日期格式都是固定的
像现在这样格式化数据库中的数据,在数据量很大时,oracle会将每一条数据都格式化一遍,效率很低

泛泛之交 2017-06-16 05:52:50

个人觉得 not in 换成 not exists会好一些,另外like能不用就不要用

夜无邪 2017-05-22 14:34:21

单看你上面的sql,不考虑你的业务逻辑,你的where条件里日期转换成数字形式应该比字符型要快很多,所以最好把日期通过to_number转换成数字类型:

select * from A
where to_number(to_char(input_date,'yyyymmdd')) > 20120615 and to_number(to_char(input_date,'yyyymmdd')) < 20120701 and is_verify = '1'
and dj_id not in (select source_id from B where to_number(to_char(input_date,'yyyymmdd')) > 20120615
and to_number(to_char(input_date,'yyyymmdd')) < 20120701 and source_id like '%DD%');

归属感 2017-01-31 14:14:44

把not in 换成left join,另外注意索引问题

想挽留 2017-01-30 18:11:06

select A.* from A left join B on A.dj_id != B.dj_id where to_char(A.input_date,'yyyy-mm-dd') > '2012-06-15' and to_char(A.input_date,'yyyy-mm-dd') < '2012-07-01'and is_verify = '1'
and to_char(B.input_date,'yyyy-mm-dd') > '2012-06-15'
and to_char(B.input_date,'yyyy-mm-dd') < '2012-07-01' and B.source_id like '%DD%';
作左连接,如果A dj_id不等于B dj_id 就把A结果集查询出来

甜柠檬 2017-01-26 00:12:00

用外连接替代not in 减少使用模糊查询 影响效率

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文