sql - 旧的 IN 与 Exists 与 Left Join(其中 ___ 为或不为空);表现

标签 sql sql-server t-sql join exists

我发现自己陷入了困境。我的表只有一列(抑制或包含列表),或多或少是 varchar(25) 但问题是在主查询中使用它们之前我没有时间对它们进行索引,并且取决于它的重要性,我不知道每个表中有多少行。所有这一切的核心基表大约有 140 万行和大约 50 列。

我的假设如下:

IN 不应在返回大量值(行)的情况下使用,因为它会按顺序查看值,对吧? (子查询上的 IN 未直接传递值)

连接(INNER 用于包含,LEFT 以及在抑制时检查 Null)最适合大型数据集(超过 1k 行左右)

EXISTS 一直让我担心,因为它似乎对每一行都进行子查询(全部 140 万行?哎呀。)

我的直觉是,如果可行的话,获取抑制表的计数并使用 IN(对于 1k 以下行)和 INNER/LEFT Join(对于 1k 行以上的抑制表)注意,我将抑制的字段将是大基表中的索引,但抑制表不会。想法?

预先感谢您的任何和所有评论和/或建议。

最佳答案

假设 TSQL 的意思是 SQL Server, have you seen this link regarding a comparison of NOT IN, NOT EXISTS, and LEFT JOIN IS NULL ?综上所述,只要比较的列不能为NULL,NOT INNOT EXISTSLEFT JOIN/IS NULL效率更高...

关于 IN 和 EXISTS 之间的区别需要记住的一点 - EXISTS 是一个 bool 运算符,在第一次满足条件时返回 true。尽管您在语法中看到了相关子查询,但 EXISTS 的性能比 IN 更好...

此外,IN 和 EXISTS 仅检查值比较是否存在。这意味着不会出现像 JOINing 时那样的重复记录...

这确实取决于情况,因此,如果您真的想找到效果最好的方法,则必须测试并比较查询计划正在执行的操作...

关于sql - 旧的 IN 与 Exists 与 Left Join(其中 ___ 为或不为空);表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3604042/

相关文章:

mysql - 在 SQL 中添加包含当前时间的新列

SQL连接查询结果问题

sql-server - 恢复备份时,如何断开所有事件连接?

多个表中的 SQL 不同值

php - 从Mysql表中获取分类和子分类

sql - 如何使用 SQL Order By 语句对结果进行不区分大小写的排序?

javascript - 如何在循环运行函数的 SQL Server 中插入对象? ConnectionError : . 无法在处于 `Connecting` 状态的连接上调用 connect

sql - 从长度中选择最大值

sql-server - 如何在 SQL Server 中编写任意数量的参数函数

sql-server - SQL Server : Pivot Function Error