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

Ume*_*mer 3 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) 
Run Code Online (Sandbox Code Playgroud)

关于结构的一件事是.vCode,vName是varchar,testCodes和DataDictionary具有相同的结构.

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

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

Pen*_*m10 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 
Run Code Online (Sandbox Code Playgroud)

您需要创建索引:

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

两者都在每个表上执行单个索引扫描,但IN具有合并连接,INNER JOIN具有哈希匹配.

  • 至于为什么它更快:`LEFT JOIN`语法是一种更直接的方式告诉查询优化器如何连接表,而`NOT IN(SELECT ...)`更灵活但需要更多来自数据库引擎的工作. (4认同)