我有一个带有结果ID的临时表。我需要禁用主表中与结果集中的ID值匹配的所有记录。
以下哪项陈述更有效?
UPDATE MyTable
SET Disabled = 1
WHERE ID in (SELECT ID FROM @TempTable)
OR
UPDATE T
SET T.Disabled = 1
FROM MyTable as T
JOIN @TempTable as Temp
ON T.ID = Temp.ID
其他小问题:临时表的行数会影响这个选择吗?
更新 ID在MyTable和@TempTable上都被编入索引。我想我的问题是“在为这两种不同的技术做出同样的结果时,我应该考虑哪些因素?”
答案 0 :(得分:2)
优化程序的现代版本应将这些版本折叠到完全相同的计划中,使其性能等同于足以被视为相同。 (你忘了告诉我们哪个版本。)但我绝不会给你一个全面的回答,这将永远是真的。有太多的变量可以在不检查每个场景中的计划的情况下对此做出假设。 IMHO。
答案 1 :(得分:0)
我在笔记本电脑上玩了一下这一点,IN,JOIN和EXISTS都证明了相同的计划(在我的例子中,试图模仿你的情况)。
然而,这些计划的编译时间(和编译内存)存在很小的差异。 JOIN最快,其次是IN,然后是EXISTS(分别为1,4和7毫秒,反复测试,重新测试和不同的顺序)。
这意味着如果您每次都重新编译此查询,则可以通过将其写为JOIN查询而不是EXISTS来为每次执行节省一些ms。