问下这个sql为什么很慢
答案:3 悬赏:10 手机版
解决时间 2021-03-31 17:16
- 提问者网友:抽煙菂渘情少年
- 2021-03-31 13:00
问下这个sql为什么很慢
最佳答案
- 五星知识达人网友:上分大魔王
- 2021-03-31 13:38
你最外层的select拿掉,where rownum <= 20 可以直接写在里面(放最前面)
你要把最能排除大量数据的条件写在最后面,从逻辑上面看
(到底哪个条件是最能排除大量数据的条件,要看你的表结构和实际的数据特征)
and (d.ownercode4 <> e.ownercode4 or d.ownercode3 <> e.ownercode3 or
d.ownercode2 <> e.ownercode2 or d.ownercode1 <> e.ownercode1 or
d.extime > cast(e.endtime as date))
这个条件放在最后面
你自己可以试试,希望对你有帮助
追问现在都是cbo吧,这个放在后面好像没啥效果哦。追答那你可以写成
and (not exists (select 'c' from HDCARD_OFFICIAL_CARD_DETAIL f
where d.ownercode4 = f.ownercode4)
or not exists (select 'c' from HDCARD_OFFICIAL_CARD_DETAIL g
where d.ownercode3 = f.ownercode3)
.........)
这样可以充分利用带索引,如果还是慢,就要调整表的结构,或是数据量太大,自然较慢拉。
你要把最能排除大量数据的条件写在最后面,从逻辑上面看
(到底哪个条件是最能排除大量数据的条件,要看你的表结构和实际的数据特征)
and (d.ownercode4 <> e.ownercode4 or d.ownercode3 <> e.ownercode3 or
d.ownercode2 <> e.ownercode2 or d.ownercode1 <> e.ownercode1 or
d.extime > cast(e.endtime as date))
这个条件放在最后面
你自己可以试试,希望对你有帮助
追问现在都是cbo吧,这个放在后面好像没啥效果哦。追答那你可以写成
and (not exists (select 'c' from HDCARD_OFFICIAL_CARD_DETAIL f
where d.ownercode4 = f.ownercode4)
or not exists (select 'c' from HDCARD_OFFICIAL_CARD_DETAIL g
where d.ownercode3 = f.ownercode3)
.........)
这样可以充分利用带索引,如果还是慢,就要调整表的结构,或是数据量太大,自然较慢拉。
全部回答
- 1楼网友:行雁书
- 2021-03-31 15:39
连着查这么多,能不慢吗追问我是想知道怎么可以优化,除了索引。追答既然你想查这么多,还是连着查,其实,优化也不到哪里去,唯一的办法就是分开查,有个查完再一个,你把这些都写在一起,放在外面都是简单的查询,所以,我觉得没有可优化的
- 2楼网友:夜余生
- 2021-03-31 14:47
(d.ownercode4 <> e.ownercode4 or d.ownercode3 <> e.ownercode3 or
d.ownercode2 <> e.ownercode2 or d.ownercode1 <> e.ownercode1 or
d.extime > cast(e.endtime as date))
这一段是导致慢的原因, <>和or这2个操作或令你的所有的索引都失效的
这个一个很不好的sql追问那有优化的方法吗,怎样写比较好。追答你需要的是逻辑上的优化,而SQL上的优化对这个逻辑没什么帮助
d.ownercode2 <> e.ownercode2 or d.ownercode1 <> e.ownercode1 or
d.extime > cast(e.endtime as date))
这一段是导致慢的原因, <>和or这2个操作或令你的所有的索引都失效的
这个一个很不好的sql追问那有优化的方法吗,怎样写比较好。追答你需要的是逻辑上的优化,而SQL上的优化对这个逻辑没什么帮助
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯