2017-02-15 3 views
0

t1(これは約10億行、ファクトテーブル)とt2(空のテーブル、0行)の3つのテーブルを持っています。およびt0(ディメンション表)では、すべてが統計を適切に収集しています。Teradataオプティマイザは行番号を間違って推定してから、ユニオンでテーブルにアクセスします

REPLACE VIEW v0 
AS SELECT * from t1 
    union 
    SELECT * from t2; 

はのこれら3つのクエリに見てみましょう::

1) Select * from t1 inner t0 join on t1.id = t0.id; -- Optimizer correctly estimates 1 bln rows 

2) Select * from t2 inner t0 join on t1.id = t0.id; -- Optimizer correctly estimates 0 row 

3) Select * from v0 inner t0 join on v0.id = t0.id; -- Optimizer locks t1 and t2 for read, the correctly estimated, that it will get 1 bln rows from t1, but for no clear reasons estimated same number 1 bln from table t2. 

はここで何が起こっているほかビューv0ありますか?それはバグか機能ですか?

PS。ここに表示するにはかなり大きいオリジナルクエリは35分で終了しませんでした。ちょうどt1を残した後 - 15分で正常に終了しました。

  • TDリリース:15.10.03.07

  • TDバージョン:15.10.03.09

+0

あなたはオプティマイザが0行 –

+0

に@DuduMarkovitz 0または1 JOIN構文をすることを意識しない - そのない大きな違い –

+0

を見積もることはありません完全に間違っ – Rocketq

答えて

3

それは、スプール内の行の全体的な数だ、第二選択のための同じ番号ではありませんの2番目の選択、10億プラス0の後。

UNIONがデフォルトでDISTINCTに設定されていますが、これを10億行で実行するのは本当に高価です。

代わりにUNION ALLに切り替えます。

+0

あなたは正しく、スプールの合計サイズを見積もります。別のことを思い出させてくれてありがとう、 – Rocketq

関連する問題