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

EXPLAIN15 秒以上の推定時間が得られます。

一方、基本的にエイリアスをテーブル名に置き換えた以下について説明します。

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 ではエラー メッセージが表示されます)、CROSS 結合が発生します。

なんで?Teradata は標準 SQL が登場する前に実装されました。最初のクエリ言語は TEQUEL (TEradata QUEry Language) と呼ばれ、その構文では FROM 内にテーブルをリストする必要はありませんでした。RETRIEVE TableName.ColumnNameパーサー/オプティマイザーが tablename と columnname を解決するのに十分な情報をシンプルに運びました。オフにするフラグはありません。一部のクライアント ツールは送信を拒否しますがRETRIEVE、BTEQ で送信することはできます。

上記の例では、古い TEQUEL と SQL を混在させています。オプティマイザーには 3 つのテーブルがありますが、結合条件は 1 つだけです。これにより、3 番目のテーブルへの CROSS 結合が発生します。

少なくとも、Explain で簡単に見つけることができます。オプティマイザーは最後のステップとしてこのばかげた結合を行うので、最後までスクロールすると が表示されますjoined using a product join, with a join condition of ("(1=1)")

于 2015-05-20T15:40:01.327 に答える