SQL查询'not in'子句执行需要太长时间

时间:2011-03-16 07:23:12

标签: sql

以下查询需要花费太多时间,很可能是因为“未使用”。

你能否提出任何改进建议?

SELECT vcode, 
       vname, 
       1014 AS fid 
FROM   testcodes co 
WHERE  co.vcode NOT IN (SELECT dict.vcode 
                        FROM   datadictionary dict 
                        WHERE  dict.fid = 1014) 
关于结构的一件事是。 vCode,vName是varchar 和testCodes和DataDictionary具有相同的结构。

我搜索了这个问题,发现左连接可以解决这个问题? (为什么它做得更好,怎么做?)

有人可以指导它是否可以改进???

3 个答案:

答案 0 :(得分:7)

SELECT vcode, 
       vname, 
       1014 AS fid 
FROM   testcodes co 
       LEFT JOIN datadictionary dict 
         ON co.vcode = dict.vcode 
            AND dict.fid = 1014 
WHERE  dict.vcode IS NULL 

您需要创建索引:

  • (testcodes.vcode)
  • (datadictionary.vcode,datadictionary.fid)

两者都在每个表上进行单个索引扫描,但是IN有一个Merge Join,而INNER JOIN有一个Hash Match。

答案 1 :(得分:1)

如果dict.fid是唯一键(听起来如此),那么您的查询应该等同于

WHERE  co.vcode != (SELECT dict.vcode -- ...

co.vcode和dict.vcode可能需要一个索引来加快速度。

这个答案并不是试图提供比Pentium10更好的暗示,更多的是旁注。

答案 2 :(得分:0)

查询看起来不错。 尝试添加以下索引

datadictionary Index(fid,vcode)
testCodes Index(vcode)