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)")
.
我有一个比较简单的查询
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)")
.