2016-10-19 6 views
0

は、テーブル構造トーストテーブルがエクスポンション(分析)に影響しないのはなぜですか?ここ

create table test as 
select 
    lpad('x',100,'x') as a1, 
    (SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)):: int) FROM generate_series(1,1024*1024)), '')) as a2 
from generate_series(1,5*1024); 

テーブル770Kbプラストーストテーブルの合計サイズ5.8Gb

はのは、トーストテーブルがスキャンされていないことを意味どの

explain (analyze, buffers, timing) select a2 from test 

"Seq Scan on t1 (cost=0.00..145.20 rows=5120 width=18) (actual time=0.041..2.959 rows=5120 loops=1)" 
"Buffers: shared hit=2 read=92" 
"Planning time: 1.771 ms" 
"Execution time: 3.375 ms" 

を実行してみましょうです。そのため、説明の結果は実際のクエリと一致しません。

これはプランナーの最適化の問題です。データの消費者でなく、それらを読む必要はありません。しかし、説明の結果、実際のクエリに(少なくともほぼタイミングで)一致しているとします。

キーワードは、の構文の一部を説明、分析、バッファし、それらはpostgresクエリパーサーによって構築されたASTに挿入されますか?あるいは、それらはクエリから切り捨てられ、ポストグルはクエリの残りを実行しますが、実行の統計的詳細を得るために "心"に留まりますか?

誰かがそれが起こっている理由を確認または説明できる場合。

答えて

1

私はそのようにした理由を知ることはできませんが、PostgreSQLが可能な限り値の抹消を延期するという副作用であると思います。

EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT length(a2) FROM test; 
+0

Detoastが可能であるが、出力結果を変更します。

あなたはより現実的なデータを得ることができます、クエリ実行の一部としてそれをdetoastするそのようにPostgreSQLのを強制することができます。このクエリはプリミティブなので、違いが目立つのはなぜでしょうか。しかし、どのようなクエリが複雑で、データがテーブル内で一定ではないのですか? – simar

+0

私はこの問題がクエリの 'SELECT'リストの列に対してのみ発生すると言いたいと思います。とにかく、クエリで使用されるすべての中間値を消去する必要があります。ですから、 'SELECT'リストのすべてのvarlenaカラムに' length() 'をつけてください。 –

関連する問題