旧的IN与存在与左连接(其中___是否为空); 性能

use*_*754 2 sql t-sql sql-server join exists

我发现自己处于相当不好的状态.我有一个只有一列(抑制或包含列表)的表,它们或多或少是varchar(25)但事情是我在主查询中使用它们之前没有时间对它们进行索引,并且取决于它是多么重要,我不知道每个表中有多少行.所有这些核心的基表是大约140万行和大约50列.

我的假设如下:

不应该在有很多值(行)返回的情况下使用,因为它看起来是连续的值,对吧?(IN子查询未直接传递值)

连接(INNER用于包含和LEFT以及在抑制时检查Null)对于大型数据集是最好的(超过1k行左右到马赫)

EXISTS一直关注我,因为它似乎在为每一行做一个子查询(全部是140万?Yikes.)

我的直觉说,如果可行得到抑制表的计数并且使用IN(对于子1k行)和INNER/LEFT Join(对于1k行以上的抑制表)注意,并且字段I将在supressing on将是索引在大基数表但是抑制表不会.思考?

提前感谢任何和所有评论和/或建议.

OMG*_*ies 6

假设TSQL表示SQL Server,您是否看到过关于NOT IN,NOT EXISTS和LEFT JOIN的比较的这个链接是否为空?总之,只要被比较的列不能为NULL,NOT IN并且NOT EXISTSLEFT JOIN/IS NULL... 更有效.

关于IN和EXISTS之间的区别要记住 - EXISTS是一个布尔运算符,并在第一次满足条件时返回true.虽然您在语法中看到相关子查询,但EXISTS的表现优于IN ...

此外,IN和EXISTS仅检查是否存在值比较.这意味着在加入时没有重复的记录...

这真的取决于,所以如果你真的想要找到最好的,你将需要测试和比较查询计划正在做什么......