Teradata:使用别名会影响 EXPLAIN 时间估计

Teradata: use of aliases impacts EXPLAIN estimation of time

我有一个比较简单的查询

SELECT
    , db1.something
    , COALESCE(db2.something_else, 'NA') AS something2
FROM dwh.db_1 AS db1
LEFT JOIN dwh.db_2 AS db2 ON db1.some_id = db2 = some_id

EXPLAIN 给出了超过 15 秒的估计时间。

另一方面,解释一下下面的内容,我们基本上用 table 名称替换了别名:

SELECT
    , db1.something
    , COALESCE(db_2.something_else, 'NA') AS something2
FROM dwh.db_1 AS db1
LEFT JOIN dwh.db_2 AS db2 ON db1.some_id = db2.some_id

给出了超过 4 小时的估计时间,系统似乎正在尝试在某个 spool 上执行产品连接(我无法真正遵循计划步骤的顺序)。

我一直以为别名只是别名,have no impact on perf

估计的时间可能是正确的:-)

A Table-Alias 并不是真正的别名,它取代了该查询中的 tablename。在 Teradata 中使用原始的 tablename 不会导致错误消息(就像在大多数其他 DBMS 中一样),但它会导致 交叉连接。

为什么?嗯,Teradata 是在 Standard SQL 之前实现的,最初的查询语言称为 TEQUEL(TEradata QUEry Language),其语法不需要在 FROM 中列出 table。一个简单的 RETRIEVE TableName.ColumnName 为 Parser/Optimizer 提供了足够的信息来解析 tablename 和 columnname。没有关闭的标志,有些客户端工具拒绝提交,但你仍然可以在 BTEQ 中提交RETRIEVE

在上面的示例中,您混合了旧的 TEQUEL 和 SQL,优化器有 3 个 table,但只有一个连接条件,结果 在交叉连接到第三个 table.

至少在 Explain 中很容易发现。优化器将在最后一步执行这个愚蠢的连接,所以滚动到最后你会看到 joined using a product join, with a join condition of ("(1=1)").