Teradataはselect句が返す列数を減らすと速くなる


Teradataで3本以上のテーブルを結合する場合、必ず中間結果のスプールへの(つまりディスクへの)書き出しが発生する。
例えばa, b, cの3本を結合するなら、aとbの結合結果をスプールに書いて、次にスプールとcを結合する。
b, cが件数の非常に少ないテーブルであっても、スプールを使うのを止めない。
ということは、中間結果のレコード長を減らせばスプールに書き出すバイト数も減少するので、DBMS内の処理時間を大幅に短縮できる。


100万件のトランザクション t に100件と10件のマスタ m1, m2 を結合するSQLを考えてみる。
それぞれのマスタには { コード, 名称, カナ名称, 短縮名, ... } といった列があり、いまマスタから取得したいのは短縮名だけだとする。
PostgreSQLなら、以下の a) b) はほとんど同じ速さで処理されるだろう。

a)
	select *
	from t 
	inner join m1 on m1.x=t.x
	inner join m2 on m2.y=t.y

b)
	select t.*, m1.短縮名, m2.短縮名
	from t 
	inner join m1 on m1.x=t.x
	inner join m2 on m2.y=t.y

PostgreSQLは t と m1 をハッシュ結合してできた1行1行を、さらに m2 とハッシュ結合する。中間結果をスプールに吐くことはない。
a) b) のオーバーヘッドの違いはすべてメモリ上でのことであり、select句で列名を列挙することにより結果表の行長を半分にしたところで、DBサーバ上の処理時間は1割も違わないだろう。


Teradataなら、結果表の行長を半分にするとクエリが本当に2倍速くなることがある。
よって、返す列数に神経質になる意味は十分にある。