一个简单 select 语句的问题

2022-04-14 08:06:22 +08:00
 sorcerer

无法理解为啥会这样: v_example 为一个复杂的视图

select * from v_example where month = "202203" -- 10 多秒出结果
select * from v_example where month = to_char(add_month(trunc ( sysdate ),-1 ),“yyyyMM”) -- 就一直不会出结果 这两者在执行计划上有什么不同么
1929 次点击
所在节点    Oracle
9 条回复
aptupdate
2022-04-14 08:15:22 +08:00
应该是 add_month 导致的,可以试试把 where 条件拿出来。
sorcerer
2022-04-14 08:27:29 +08:00
@aptupdate 请问 那个 month 字段如果本身就没有 index add_months 函数在这里有啥影响,另外拿出来是指?
wd
2022-04-14 08:29:38 +08:00
这个你为啥不直接看看执行计划?
v2eb
2022-04-14 08:30:25 +08:00
视图是虚拟表,在引用时动态生成数据。
aptupdate
2022-04-14 08:48:58 +08:00
@sorcerer 影响可以对比两种执行计划有什么差异。拿出来是指把`to_char(add_month(trunc ( sysdate ),-1 ),“yyyyMM”)`放到一个参数里,转换成第一个 select 语句这种形式。
panpanpan
2022-04-14 09:47:38 +08:00
建议发 sql 的同时把 explain 执行计划也发出来
leonhao
2022-04-14 10:00:40 +08:00
本人多年数据工程师,楼上说的没啥意义,执行计划肯定是不一样的。这种情况要么改视图定义,要不在包一层 sp ,先把时间算出来再执行动态 SQL ,当然在应用层做也可以。
sun1991
2022-04-14 13:32:42 +08:00
你多加的条件把 Oracle 搞糊涂了.
Oracle 执行引擎在碰到 view 时会将其展开成 sql. 你可以尝试加 hint no_merge override 这个行为试试.
ikesnowy
2022-04-14 13:38:00 +08:00
你右边是个函数调用,不是固定值,数据库在比较每一行的时候都会调用一下它获取最新的时间,So...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX