0

我有一个相对简单的查询

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 秒。

另一方面,解释以下内容,我们基本上将别名替换为表名:

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 小时,似乎系统正在尝试在某个线轴上执行产品连接(我无法真正遵循计划步骤的顺序)。

我一直认为别名只是别名,对 perf 没有影响

4

1 回答 1

2

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

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

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

在上面的示例中,您混合了旧的 TEQUEL 和 SQL,优化器有 3 个表,但只有一个连接条件,这导致与第三个表的交叉连接。

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

于 2015-05-20T15:40:01.327 回答