问题描述
我的经理在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 *”,是否对查询有帮助?我知道它不会造成伤害,所以无论如何我都会这样做,我只想确认teradata的行为和逻辑。
解决方法
这可能是有效的。我可以更简洁地写为:
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具有智能优化器,因此子查询不应影响查询计划。就是说,它们使人们感到困惑(“这些子查询在做什么 ?”)。
有时,在查询的不同增量期间会保留此类子查询。例如,可能已尝试在子查询中计算某些内容(例如,行号)。最后,不需要这样做,但是子查询仍然存在。
此外,性能可能取决于视图以及聚合所需的数据量。