2013-12-16 43 views
1

如何优化此查询?我曾尝试使用LEFT JOIN条款,但仍至少需要3秒。优化查询仍需要多长时间

SELECT DISTINCT MBLNR 
FROM MKPF 
WHERE MANDT='368' 
    AND XBLNR = '0150525913' 
    AND MBLNR NOT IN (SELECT DISTINCT SMBLN FROM MSEG WHERE XBLNR_MKPF = '0150525913') 

使用LEFT JOIN后,仍需要3秒,得到的结果:

SELECT DISTINCT A.MBLNR 
FROM MKPF AS A 
LEFT JOIN MSEG AS B ON B.XBLNR_MKPF=A.XBLNR AND A.MBLNR <> B.SMBLN 
WHERE A.XBLNR = '0150525913' 

使用LEFT OUTER JOIN真的要花很多时间来返回行。

谢谢。

+0

试着在第二张桌子上做一个外部连接。另外,你这些索引? – BRogers

+0

@BRogers:'left outer join'需要更多时间来返回行。是的,它已经索引.. –

+0

i)希望你的查询是正确的。我的意思是你知道你想要什么输出。 ii)你确定使用左连接而不是内连接,你也确定不同。 iii)索引是在MANDT,XBLNR,XBLNR_MKPF上定义的 – KumarHarsh

回答

1

正确的左外连接第一个查询的提法是:

SELECT DISTINCT A.MBLNR 
FROM MKPF A LEFT JOIN 
    MSEG B 
    ON B.SMBLN = A.MBLNR AND AND B.XBLNR_MKPF = '0150525913' 
WHERE A.XBLNR = '0150525913' and A.MANDT='368' and B.SMBLN is null; 

根据表的大小,3秒后可能是合理的。但是,您可以使用索引加速查询。该查询建议一些索引:MKPF(XBLNR, MANDT, MBLNR)MSEG(XBLNR_MKPF, SMBLN)

+0

它更好,但仍然只有一点点截断。顺便说一句,谢谢,;) –

0

虽然直观,“不在”是缓慢的。你为什么要使用不同的和left.If他们真的需要那么其确定。或者你可以使用内部连接无明显.Specially子查询不

AND MBLNR NOT IN 
(SELECT DISTINCT SMBLN FROM MSEG WHERE XBLNR_MKPF = '0150525913') 

AND MBLNR IN 
(SELECT DISTINCT MBLNR 
FROM MKPF 
WHERE MANDT='368' 
AND XBLNR = '0150525913' 
except 
SELECT DISTINCT SMBLN 
FROM MSEG 
WHERE XBLNR_MKPF = '0150525913' 
) 
+0

需要很长时间才能得到结果..> O < –

0

:所以,改变这种需要明确。

you can try not exists 
SELECT MBLNR 
FROM MKPF 
WHERE MANDT='368' 
    AND XBLNR = '0150525913' 
    AND NOT exists (SELECT SMBLN FROM MSEG WHERE XBLNR_MKPF = '0150525913') 
+0

需要很长时间才能得到结果.. –