2014-12-05 50 views
0
INSERT INTO TableA 
    SELECT 
     x, 
     y, 
     z  
      FROM TableB 
      WHERE x IN 
        (select DISTINCT x 
          FROM TableC 
           WHERE x NOT IN 
              (SELECT DISTINCT x from TableD) 
        ) 

這個查詢需要永久,並且不會完成。爲什麼INSERT在使用子查詢時需要時間

當我運行每個選擇查詢它的工作正常,但是當我運行它所有它需要永遠?你能看到原因嗎?

+0

當您運行整個選擇時,是否查看過執行計劃? – Paddy 2014-12-05 10:30:37

+0

「不在」通常會很慢。 – 2014-12-05 10:30:46

+0

對不起,但沒有聽說過執行計劃嗎?你能指導我嗎? @Paddy – akd 2014-12-05 10:32:45

回答

0

嘗試此查詢:

insert into TableA 
select b.* 
from TableB b    --with(nolock) 
left outer join TableC c --with(nolock) 
on b.x = c.x 
left outer join TableD d --with(nolock) 
on c.x = d.x 
where c.x is not null and d.x is null 

如果同時運行無限爲非註釋with(nolock),然後再試一次。如果不起作用,則檢查預計的執行計劃。

0

首先,您需要查看查詢的執行計劃 - 它可能會告訴您瓶頸在哪裏,或者是否存在會顯着加快查詢的缺少索引 - 我認爲這很可能是因爲您的查詢很簡單我不明白爲什麼需要這麼長時間;

enter image description here

我想你也可以重新調整你查詢,以便它使用聯接,而不是沒有 - 這將有助於如果我知道的數據,看是否能產生同樣的結果,但我認爲它應該;

SELECT B.x, 
     B.y, 
     B.Z 
FROM TableB B 
INNER JOIN --where in 
    (
     SELECT DISTINCT x 
     FROM TableC c 
     LEFT JOIN TableD d 
      ON c.x = d.x 
     WHERE d.x IS NULL -- c x not in d x 
    ) sub 
on B.x = sub.x 
0

當不需要時子查詢和DISTINCT對性能而言非常糟糕。你可以使用JOIN完成你需要的東西。

SELECT b.x, b.y, b.z 
FROM TableB b 
INNER JOIN TableC c ON c.x=b.x 
LEFT JOIN TableD d ON d.x=b.x 
WHERE d.x IS NULL 
GROUP BY b.x, b.y, b.z -- only if you have duplicates and need unique records 

內的表C JOIN修復您的首屆 「IN」,那麼LEFT JOIN和d.x IS NULL修復你的 「NOT IN」 的條款。

最後,請確保您在每個表格的「x」列中都有索引。

CREATE INDEX IX_TableB_X ON TableB (X); 
CREATE INDEX IX_TableC_X ON TableC (X); 
CREATE INDEX IX_TableD_X ON TableD (X); 
相關問題