[我想知道更快,假设我有以下查询,并且它们检索相同的数据
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的数据集是有道理的,但是我没有发现任何东西可以用来支持我的看法。
在诸如Teradata之类的数据库中,两者应该具有完全相同的性能特征。
SQL不是程序语言。 SQL查询describes结果集。它没有指定操作顺序。
SQL引擎通过三个步骤处理查询:
第二步为引擎提供了很大的灵活性。而且大多数查询引擎将非常聪明地忽略子查询,使用基于where
子句的索引和分区,等等。
大多数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)来解决问题。这样可以带来更好的查询,可以长期测试和维护
[每当您遇到这样的情况时,即您认为哪个查询可以更快地在teradata中生成结果,请在teradata中使用EXPLAIN计划-这将正确地指示PE如何检索记录。如果使用的是Teradata sql助手,则可以选择查询并按F6。