繁体   English   中英

SQL 服务器中的相关查询与内部连接性能

[英]Correlated query vs inner join performance in SQL Server

假设您要 select 一个表中在另一个表中有相应行的所有行(另一个表中的数据不重要,只有相应行的存在很重要)。 根据我对 DB2 的了解,这种查询在编写为带有 EXISTS 子句而不是 INNER JOIN 的相关查询时性能更好。 SQL 服务器也一样吗? 或者它没有任何区别?

我刚刚运行了一个测试查询,两条语句最终得到了完全相同的执行计划。 当然,对于任何性能问题,我建议在您自己的环境中运行测试; 使用 SQL 服务器管理工作室,这很容易(或者 SQL 查询分析器,如果您正在运行 2000)。 只需在查询 window、select 查询|包括实际查询计划中键入两个语句。 然后运行查询。 Go 到结果选项卡,您可以轻松查看计划是什么以及哪个计划的成本更高。

奇怪:我通常更自然地将这些写为相关查询,此时我必须返回 go 并重新考虑使用连接,因为根据我的经验,sql 服务器优化器更有可能做到这一点。

但是不要把我看得太认真。 对于所有我在这里有 26K 代表和仅有的 2 个当前 sql 主题特定徽章之一,我实际上在 sql 知识方面相当初级(这都是关于音量的;;))。 当然我不是 DBA,实际上。 您当然需要分析每种方法以衡量其实际性能。 希望优化器能够识别您的要求并以最佳方式处理任一查询,但在您检查之前您永远不会知道。

使用连接。 如果您有小表,它可能不会对性能产生太大影响,但如果“外部”表非常大,则需要对每一行执行 EXISTS 子查询。 如果您的表在公共列上建立索引,那么执行 INNER JOIN 应该快得多。 顺便说一句,如果您想查找不在第二个表中的所有行,请使用 LEFT JOIN 并在第二个表中测试 NULL - 当您有非常大的表和索引时,它比使用 EXISTS 快得多。

正如每个人所指出的,这一切都归结为优化器。 我建议以您觉得更自然的方式编写它,然后确保优化器能够找出最有效的查询计划(收集统计信息、创建索引等)。 SQL 服务器优化器总体上相当不错,只要你给它提供它需要使用的信息。

可能最好的性能是连接到派生表。 存在可能会是下一个(并且可能更快)。 最差的性能是使用 select 中的子查询,因为它倾向于逐行而不是作为一组运行。

然而,一切都是平等的,数据库性能非常依赖于数据库设计。 我会尝试所有可能的方法,看看在你的情况下哪种方法更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM