sql - 这个 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 的行为和逻辑。
解决方案
它可能是有效的。我可以更简洁地写成:
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 具有智能优化器,因此子查询不应影响查询计划。也就是说,它们让人们感到困惑(“这些子查询在做什么?”)。
有时,此类子查询会在查询的不同增量期间保留。例如,可能已经尝试计算子查询中的某些内容(例如行号)。最后,这不是必需的,但子查询仍然存在。
此外,性能可能取决于视图以及聚合需要多少数据。
推荐阅读
- c++ - 别名模板不是类模板吗?
- netlogo - NetLogo 数据库结果列表加载问题
- java - 使用可比较接口的 compareTo() 比较元素时如何返回 null?
- javascript - 缺失:在简单 var $props 上的属性 id 之后
- javascript - 添加不属于 TinyMCE 内容的 HTML 元素
- typescript - 提供系列类型的 Highcharts 类型接口叫什么名字?
- android - Kotlin Android 只允许在文本中使用表情符号和字母
- node.js - openapi-generator codegen:Ajv 无法解析对来自 openapi 3.0.0 的 requestBodies 的引用
- three.js - 有没有办法将剪切模板应用于threejs中相机的“近”剪辑?
- c# - C#/WPF/Unity 名称管道通信仅向一个方向发送消息