【发布时间】:2019-05-27 10:28:52
【问题描述】:
这个select的语句运行了很长时间,经过我的调查我发现问题是子查询,存储过程,谢谢你的帮助。
SELECT DISTINCT
COKE_CHQ_NUMBER,
COKE_PAY_SUPPLIER
FROM
apps.Q_COKE_AP_CHECKS_SIGN_STATUS_V
WHERE
plan_id = 40192
AND COKE_SIGNATURE__A = 'YES'
AND COKE_SIGNATURE__B = 'YES'
AND COKE_AUDIT = 'YES'
AND COKE_CHQ_NUMBER NOT IN (SELECT DISTINCT COKE_CHQ_NUMBER_DELIVER
FROM apps.Q_COKE_AP_CHECKS_DELIVERY_ST_V
WHERE UPPER(COKE_CHQ_NUMBER_DELIVER_STATUS) <> 'DELIVERED')
AND COKE_CHQ_NUMBER NOT IN (SELECT COKE_CHQ_NUMBER_DELIVER
FROM apps.Q_COKE_AP_CHECKS_DELIVERY_ST_V)
【问题讨论】:
-
这是一个相当大胆的问题,没有双关语的意思。您能否为您的问题添加一个执行计划,或者一些数据?
-
@mohamedbarakat。 . .据推测,
_v意味着引用的“表”实际上是视图。在不知道视图定义的情况下,外部无法帮助查询。我要补充一点,我强烈建议避免使用带有子查询的not in,而是使用not exists。 -
请参阅here 启发您应该提供哪些信息
-
@MarmiteBomber 关于应该提供的额外信息是正确的。
-
q_coke_ap_checks_delivery_st_v.coke_chq_number_deliver是否定义为NOT NULL?可空列不倾向于与not in子查询混合。这是一个疯狂的猜测。此外,第一个子查询似乎被第二个子查询变得多余。
标签: sql oracle performance oracle11g query-optimization