【问题标题】:When are extra columns removed in Teradata SQL?何时删除 Teradata SQL 中的额外列?
【发布时间】:2019-12-05 05:06:54
【问题描述】:

我了解Teradata中SQL的操作顺序如下:

  • FROM 子句
  • WHERE 子句
  • GROUP BY 子句
  • HAVING 子句
  • SELECT 子句
  • ORDER BY 子句

这是来自this link

这是否意味着我要加入的表中的任何额外的、不需要的列在最后(执行 SELECT 时)总是被删除?那些额外未选择的列是否会占用假脱机空间,直到它们最终被删除?

因此,如果我将表 A(5 列)与表 B(10 列)连接起来,则连接后的中间结果是 14 列(带有 1 个公共键)。但假设我最终只选择了 3 列。

查询优化器是否总是在中间结果中包含所有 14 列(从而占用假脱机空间),或者它是否足够聪明以仅在中间结果中包含所需的 3 列?

如果这样做足够聪明,那么我可以通过将要加入的每个表重写为仅该表中我需要的列的子查询来节省假脱机空间。

感谢您的帮助。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您混淆了查询的编译和执行。

    这些不是“操作顺序”。您所描述的是“解释查询”的顺序。这发生在编译阶段,当标识符(列名和表名和别名)被解释时。

    SQL 是一种描述性 语言。 SQL 查询描述结果集。它没有描述如何处理数据(过程语言会这样做)。

    至于不读专栏。 Teradata 可能足够聪明,可以从数据页读取它需要的列,并且不会在整个处理过程中带来未引用的列。

    【讨论】:

    • 谢谢戈登。难道我们不能说改变 SQL 查询的编写方式可以改变它的处理方式吗?例如,在 WHERE 子句中进行过滤与在 JOIN 上进行过滤的处理方式不同。最终,我试图避免假脱机空间错误,并想看看是否值得在每个连接中替换较小的子查询。
    • 对于内部连接,ON 或 WHERE 子句中的过滤谓词是等效的。对于外连接,它们是不同的。简单地从单个表中投影行和列子集的子查询通常会被优化器消除,并且谓词合并到外部查询中。
    • 是的,优化器足够聪明,只在答案集或后续查询步骤需要时将列复制到假脱机。
    • 好的,谢谢 Fred,所以听起来我不会通过执行这些子查询来节省任何假脱机空间。将寻找其他方法。欣赏它。
    猜你喜欢
    • 2014-01-13
    • 2015-07-06
    • 2014-05-20
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2013-07-30
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多