2014-12-05 91 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);