我发现自己处于相当困难的状态。我有一个只有一列(抑制或包含列表)的表,它们或多或少是varchar(25)但事情是我在主查询中使用它们之前没有时间对它们进行索引,并且取决于它是多么重要,我不知道每个表中有多少行。所有这些核心的基表是大约140万行和大约50列。
我的假设如下:
不应该在有很多值(行)返回的情况下使用,因为它看起来是连续的值,对吧? (IN子查询未直接传递值)
连接(INNER包含和LEFT以及在抑制时检查Null)对于大型数据集来说是最好的(超过1k行左右到马赫)
EXISTS一直关注我,因为它似乎在为每一行做一个子查询(全部是140万?Yikes。)
我的直觉说,如果可行得到抑制表的计数并且使用IN(对于子1k行)和INNER / LEFT Join(对于1k行以上的抑制表)注意,并且字段我将在supressing上将是大基表中的索引但是抑制表不会。想法?
提前感谢任何和所有评论和/或建议。
答案 0 :(得分:6)
假设TSQL意味着SQL Server, have you seen this link regarding a comparison of NOT IN, NOT EXISTS, and LEFT JOIN IS NULL?总之,只要被比较的列不能为NULL,NOT IN
和NOT EXISTS
比LEFT JOIN/IS NULL
更有效...
要记住IN和EXISTS之间的区别 - EXISTS是一个布尔运算符,并在第一次满足条件时返回true。虽然您在语法中看到了相关的子查询,但EXISTS的表现优于IN ...
此外,IN和EXISTS仅检查是否存在值比较。这意味着在加入时没有重复的记录...
这真的取决于,所以如果你真的想找到最好的,你必须测试&比较查询计划正在做什么...
答案 1 :(得分:0)
使用什么技术无关紧要,如果应用过滤器或连接的表上没有索引,系统将进行表扫描。
RE:存在
系统不一定会为所有140万行执行子查询。 SQL Server足够聪明,可以执行内部Exists查询,然后针对主查询进行评估。在某些情况下,Exists可以执行等于或优于Join。