SQL减少联接中或其中的数据

问题描述 投票:0回答:3

[我想知道更快,假设我有以下查询,并且它们检索相同的数据

select * from tableA a inner join tableB b on a.id = b.id where b.columnX = value

select * from tableA inner join (select * from tableB where b.columnX = value) b on a.id = b.id

我认为在高级情况下减少来自tableB的数据集是有道理的,但是我没有发现任何东西可以用来支持我的看法。

sql performance join teradata
3个回答
2
投票

在诸如Teradata之类的数据库中,两者应该具有完全相同的性能特征。

SQL不是程序语言。 SQL查询describes结果集。它没有指定操作顺序。

SQL引擎通过三个步骤处理查询:

  1. 解析查询。
  2. 优化解析的查询。
  3. 执行优化的查询。

第二步为引擎提供了很大的灵活性。而且大多数查询引擎将非常聪明地忽略子查询,使用基于where子句的索引和分区,等等。


0
投票

大多数SQL方言会将您的查询编译为执行计划。 Teradata和大多数SQL系统使用“ explain”命令显示预期的执行计划。 Teradata也有一个直观的解释,易于学习]

取决于每个表中的数据量和键类型,如果有任何方法将是有利的

大多数SQL编译器将使用当前表统计信息(数据大小和传播)正确解决此问题

在某些SQL系统中,您的第二条命令会更糟,因为它可能会强制由tableB上的所有字段构建完整的临时表

应该(不是我完全不建议使用这种查询样式)

select * from tableA inner join (select id from tableB where columnX = value) b on a.id = b.id

在大多数情况下,请不要担心,除非您遇到特定的性能问题,然后使用说明命令找出原因

通常,更好的方法是使用公用表表达式(CTE)来解决问题。这样可以带来更好的查询,可以长期测试和维护


0
投票

[每当您遇到这样的情况时,即您认为哪个查询可以更快地在teradata中生成结果,请在teradata中使用EXPLAIN计划-这将正确地指示PE如何检索记录。如果使用的是Teradata sql助手,则可以选择查询并按F6。

© www.soinside.com 2019 - 2024. All rights reserved.