我发现自己陷入了困境。我的表只有一列(抑制或包含列表),或多或少是 varchar(25) 但问题是在主查询中使用它们之前我没有时间对它们进行索引,并且取决于它的重要性,我不知道每个表中有多少行。所有这一切的核心基表大约有 140 万行和大约 50 列。
我的假设如下:
IN 不应在返回大量值(行)的情况下使用,因为它会按顺序查看值,对吧? (子查询上的 IN 不直接传递值)
连接(INNER 用于包含,LEFT 以及在抑制时检查 Null)最适合大型数据集(超过 1k 行左右)
EXISTS 一直让我担心,因为它似乎对每一行都执行一个子查询(全部 140 万行?哎呀。)
我的直觉是,如果可行的话,获取抑制表的计数并使用 IN(对于 1k 行以下)和 INNER/LEFT Join(对于 1k 行以上的抑制表)注意,我将抑制的字段将是索引中的索引大基表,但抑制表不会。想法?
预先感谢您的任何和所有评论和/或建议。
假设 TSQL 的意思是SQL Server,您是否看过有关 NOT IN、NOT EXISTS 和 LEFT JOIN IS NULL 比较的链接?综上所述,只要被比较的列不能为NULL,NOT IN
and NOT EXISTS
比更有效率LEFT JOIN/IS NULL
...
关于 IN 和 EXISTS 之间的区别需要记住的一点 - EXISTS 是一个布尔运算符,并且在第一次满足条件时返回 true。尽管您在语法中看到了相关子查询,但 EXISTS 的性能比 IN 更好...
另外,IN 和 EXISTS 仅检查值比较是否存在。这意味着不会出现像 JOINing 时那样的重复记录...
这确实取决于,所以如果你真的想找到最好的方法,你就必须测试和比较查询计划正在做什么......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)