V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
sorcerer
V2EX  ›  Oracle

一个简单 select 语句的问题

  •  
  •   sorcerer · Apr 14, 2022 via Android · 2651 views
    This topic created in 1478 days ago, the information mentioned may be changed or developed.

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

    select * from v_example where month = "202203" -- 10 多秒出结果
    select * from v_example where month = to_char(add_month(trunc ( sysdate ),-1 ),“yyyyMM”) -- 就一直不会出结果 这两者在执行计划上有什么不同么
    
    9 replies    2022-04-14 13:38:00 +08:00
    aptupdate
        1
    aptupdate  
       Apr 14, 2022 via iPhone
    应该是 add_month 导致的,可以试试把 where 条件拿出来。
    sorcerer
        2
    sorcerer  
    OP
       Apr 14, 2022 via iPhone
    @aptupdate 请问 那个 month 字段如果本身就没有 index add_months 函数在这里有啥影响,另外拿出来是指?
    wd
        3
    wd  
       Apr 14, 2022 via iPhone
    这个你为啥不直接看看执行计划?
    v2eb
        4
    v2eb  
       Apr 14, 2022 via Android   ❤️ 1
    视图是虚拟表,在引用时动态生成数据。
    aptupdate
        5
    aptupdate  
       Apr 14, 2022   ❤️ 1
    @sorcerer 影响可以对比两种执行计划有什么差异。拿出来是指把`to_char(add_month(trunc ( sysdate ),-1 ),“yyyyMM”)`放到一个参数里,转换成第一个 select 语句这种形式。
    panpanpan
        6
    panpanpan  
       Apr 14, 2022   ❤️ 1
    建议发 sql 的同时把 explain 执行计划也发出来
    leonhao
        7
    leonhao  
       Apr 14, 2022   ❤️ 1
    本人多年数据工程师,楼上说的没啥意义,执行计划肯定是不一样的。这种情况要么改视图定义,要不在包一层 sp ,先把时间算出来再执行动态 SQL ,当然在应用层做也可以。
    sun1991
        8
    sun1991  
       Apr 14, 2022   ❤️ 1
    你多加的条件把 Oracle 搞糊涂了.
    Oracle 执行引擎在碰到 view 时会将其展开成 sql. 你可以尝试加 hint no_merge override 这个行为试试.
    ikesnowy
        9
    ikesnowy  
       Apr 14, 2022   ❤️ 1
    你右边是个函数调用,不是固定值,数据库在比较每一行的时候都会调用一下它获取最新的时间,So...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   925 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 23:22 · PVG 07:22 · LAX 16:22 · JFK 19:22
    ♥ Do have faith in what you're doing.