2013-12-16 41 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

需要很長時間才能得到結果.. –