假设您要从一个表中选择在另一个表中具有相应行的所有行(另一个表中的数据不重要,只有相应行的存在很重要)。根据我对DB2的了解,当使用EXISTS子句而不是INNER JOIN作为相关查询编写时,这种查询的性能会更好。这对SQL Server来说是一样的吗?或者它没有任何区别?
答案 0 :(得分:2)
我刚刚运行了一个测试查询,这两个语句最终得到了完全相同的执行计划。当然,对于任何性能问题,我建议在您自己的环境中运行测试;使用SQL Server Management Studio这很容易(如果运行2000,则为SQL查询分析器)。只需在查询窗口中键入两个语句,选择“查询”|“包括实际查询计划”。然后运行查询。转到结果选项卡,您可以轻松查看计划是什么以及哪个计划成本更高。
答案 1 :(得分:1)
奇怪:我通常更自然地将这些作为相关查询首先编写,此时我必须返回并重新考虑使用连接因为根据我的经验,sql server优化器更有可能获得那是对的。
但是不要太认真对待我。对于所有我在这里有26K代表和仅有2个当前sql主题特定的徽章之一,我实际上在sql知识方面相当年轻(这是关于音量!;));当然我不是DBA。在实践中,您当然需要分析每种方法以衡量它的实际性能。我希望期望优化器能够识别您要求的内容,并以最佳方式处理任一查询,但在检查之前您永远不会知道。
答案 2 :(得分:1)
使用联接。如果你有小表,它可能没有太大的性能差异,但如果“外”表非常大,那么它将需要为每一行执行EXISTS子查询。如果您的表在公共列上编入索引,那么执行INNER JOIN的速度应该快得多。顺便说一句,如果你想找到第二个表中不存在的所有行,请使用LEFT JOIN并在第二个表中测试NULL - 当你有非常大的表和索引时,它比使用EXISTS要快得多。
答案 3 :(得分:0)
正如大家所说,这一切都归结为优化器。我建议以任何对你感觉更自然的方式编写它,然后确保优化器能够找出最有效的查询计划(收集统计信息,创建索引,等等)。 SQL Server优化器总体上非常好,只要您提供它需要使用的信息。
答案 4 :(得分:0)
最好的表现可能是连接到派生表。存在可能是下一个(并且可能更快)。性能最差的是select中的子查询,因为它往往会逐行而不是作为一组运行。
但是,所有条件都相同,数据库性能非常依赖于数据库设计。我会尝试所有可能的方法,看看哪种方法更快。