以下查询需要花费太多时间,很可能是因为“未使用”。
你能否提出任何改进建议?
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具有相同的结构。
我搜索了这个问题,发现左连接可以解决这个问题? (为什么它做得更好,怎么做?)
有人可以指导它是否可以改进???
答案 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
您需要创建索引:
两者都在每个表上进行单个索引扫描,但是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)