2015-12-05 71 views
0

我有這樣的SQL查詢:SQL查詢與存在太慢

SELECT sb, 
     suchbegriff_artnr, 
     suchbegriff_lfdnrkal 
FROM 
    (SELECT kvks.artnr & '/' & kvks.[lfdnr-kal] AS sb, 
      VAL(LEFT(kvks.suchbegriff, 6)) AS suchbegriff_artnr, 
      VAL(RIGHT(kvks.suchbegriff, 4)) AS suchbegriff_lfdnrkal 
    FROM kvks 
    WHERE kvks.suchbegriff LIKE '*/*') 
WHERE NOT EXISTS 
    (SELECT 1 
    FROM stammdat 
    WHERE stammdat.artnr=suchbegriff_artnr 
     AND stammdat.[lfdnr-kal]=suchbegriff_lfdnrkal) 

它執行,但實在是太慢了。它需要5秒鐘。 kvks表中包含約70k記錄,stammdat表約4,5k。 查看本次查詢,我想從kvks表中得到記錄,這不在stammdat表中,基於兩個條件。

stammdat.artnrstammdat.[lfdnr-kal]是整數。

我怎麼能加快這個查詢?

編輯

我寫了一個查詢,以至極我存儲查詢的一半:

INSERT INTO teszt 
SELECT kvks.artnr AS sb_artnr, 
     kvks.[lfdnr-kal] AS sb_lfdnrkal, 
     LEFT(kvks.suchbegriff,6) AS suchbegriff_artnr, 
     RIGHT(kvks.suchbegriff,4) AS suchbegriff_lfdnrkal 
FROM kvks 
WHERE kvks.suchbegriff LIKE '*/*' 

然後我不需要這個功能:

SELECT teszt.sb_artnr, 
     teszt.sb_lfdnrkal, 
     teszt.suchbegriff_artnr, 
     teszt.suchbegriff_lfdnrkal 
FROM teszt 
WHERE NOT exists 
    (SELECT 1 
    FROM stammdat 
    WHERE stammdat.artnr=teszt.suchbegriff_artnr 
     AND stammdat.[lfdnr-kal]=teszt.suchbegriff_lfdnrkal) 

但現在速度還是很慢。

EDIT2

我有:

SELECT teszt.sb_artnr, 
     teszt.sb_lfdnrkal, 
     teszt.suchbegriff_artnr, 
     teszt.suchbegriff_lfdnrkal 
FROM teszt 
LEFT JOIN stammdat ON stammdat.artnr=teszt.suchbegriff_artnr 
AND stammdat.[lfdnr-kal]=teszt.suchbegriff_lfdnrkal 
WHERE stammdat.artnr IS NULL 
+0

你可以嘗試左連接而不是不存在,但它可能不會很好。問題是你的所有標準都是基於功能的。這意味着每一行都必須進行處理/評估,因此不能使用索引。如果您將用於where&join子句條件的數據分解爲單獨的字段並將其編入索引,您將看到顯着的改進。 – AVG

+0

「如果您將用於where&join子句條件的數據分解爲單獨的字段」 - 我可以通過修改sql查詢來完成嗎?如果是,如何? – derstauner

回答

1

看起來像WHERE子句是罪魁禍首。這是對所有元組的模式匹配。首先徹底解決這個問題,然後重新計算創建teszt的第一個查詢。如果速度明顯更快,那麼您將需要一個不同的策略。