下面的select语句需要很长时间才能运行

时间:2018-12-30 13:48:12

标签: sql oracle performance oracle11g query-optimization

select语句需要很长时间才能运行,经过调查,我发现问题un子查询,存储过程,请多谢您的帮助。

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)

2 个答案:

答案 0 :(得分:0)

您的SELECT语句有一些问题要解决:

首先让我们看一下这种情况:

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')

首先,您选择DISTINCT支票号码(未交付状态),然后说您不希望这样做。与其说我不想交货,倒不如说我想交货。但是,这并不是真正的问题,而是使您的SELECT更易于阅读和理解。

第二个让我们看看您的第二个检查条件:

COKE_CHQ_NUMBER NOT IN (SELECT COKE_CHQ_NUMBER_DELIVER
                         FROM apps.Q_COKE_AP_CHECKS_DELIVERY_ST_V)

您要在此处排除Q_COKE_AP_CHECKS_DELIVERY_ST_V中具有条目的所有支票。这使您的第一个DISTINCT条件变得多余,因为您的第二个条件将拒绝带回的任何支票号码。我不知道Oracle SQL引擎是否足够聪明来解决这种冗余问题,但这可能会导致您运行缓慢,因为SELECT unique可能需要更长的时间才能运行

此外,如果您还没有它们,我建议添加以下索引:

CREATE INDEX index_1 ON q_coke_ap_checks_sign_status_v(coke_chq_number, coke_pay_supplier);
CREATE INDEX index_2 ON q_coke_ap_checks_sign_status_v(plan_id, coke_signature__a, coke_signature__b, coke_audit);
CREATE INDEX index_3 ON q_coke_ap_checks_delivery_st_v(coke_chq_number_deliver);

我称index_1,2,3为易于阅读,显然不是一个好的命名约定。

使用此选项后,应该优化您的选择,以可接受的性能检索数据。但是当然,这完全取决于数据的大小和分布,如果不执行特定的数据分析,则很难控制。

答案 1 :(得分:0)

向您寻找代码..似乎您有多余的地方,条件是第二个NOT IN意味着解雇,因此您可以避免

您还可以将MINUS子句中的NOT IN子句转换为..将您不在子查询中的INNER联接与同一查询联接

最后要注意,您在表上有适当的组合索引

from pydub import AudioSegment
from pydub.utils import make_chunks

myaudio = AudioSegment.from_file("file1.wav" , "wav") 
chunk_length_ms = 10000 # pydub calculates in millisec
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec

#Export all of the individual chunks as wav files

for i, chunk in enumerate(chunks):
    chunk_name = "chunk{0}.wav".format(i)
    print "exporting", chunk_name
    chunk.export(chunk_name, format="wav")