首页 > 解决方案 > 这个 Teradata 查询效率低吗?

问题描述

我的经理从 Teradata 的大量视图中使用这样的查询。运行需要 10 分钟。

select c1, c2, sum(c3), sum(c4) etc. 
from (select * from v1 where [some condition]) v1
left join (select * from v2 where [some condition]) v2
on v1.some_id = v2.some_id
group by 1, 2;

视图 v1 和 v2 非常大 - 像十亿行和数千列。但我们只选择了少数几列。那么做一个“select *”是不是效率低下?

如果我只指定我们需要的列而不是“select *”,它是否有助于查询?我知道它不会受到伤害,所以无论如何我都会这样做,我只是想确认 Teradata 的行为和逻辑。

标签: sqlteradatadata-warehouse

解决方案


它可能是有效的。我可以更简洁地写成:

select c1, c2, sum(c3), sum(c4) etc. 
from v1 left join
     v2
     on v1.some_id = v2.some_id and <conditions on v2>
where <conditions on v1>
group by 1, 2;

Teradata 具有智能优化器,因此子查询不应影响查询计划。也就是说,它们让人们感到困惑(“这些子查询在做什么?”)。

有时,此类子查询会在查询的不同增量期间保留。例如,可能已经尝试计算子查询中的某些内容(例如行号)。最后,这不是必需的,但子查询仍然存在。

此外,性能可能取决于视图以及聚合需要多少数据。


推荐阅读