Postgresの説明プランには幅があります(これは docs ごとに):
この計画ノードによって出力される行の推定平均幅(バイト単位)。
私の質問:幅はいつ0になりますか?ドキュメントの例では、以下のようになることがあります:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.07..229.20 rows=101 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0)
Index Cond: (unique1 < 100)
回答はあなたが参照している記事にあります:
ここで、プランナーは2段階のプランを使用することを決定しました。子プランノードはインデックスにアクセスして、インデックス条件に一致する行の場所を見つけ、次に上位プランノードが実際にそれらの行をテーブル自体からフェッチします。
ここでの単語Output
はvaluesの物理的な読み取りを意味します。子プランは値を読み取らず、行の場所(アドレス)のみを読み取り、親プランは実際に値を読み取ります。次の文は、2つのステップのプロセスが選択された理由を説明しています。
行を個別にフェッチすることは、それらを順番に読み取るよりもはるかにコストがかかりますが、テーブルのすべてのページにアクセスする必要がないため、これは順次スキャンよりも安価です。 (2つのプランレベルを使用する理由は、上位のプランノードが、インデックスによって識別される行の場所を読み取る前に物理的な順序にソートして、個別のフェッチのコストを最小限に抑えるためです。ノード名で言及されている「ビットマップ」は、ソートを行います。)
テキストの後半には、2つの子プロセスの例があります。1つのプロセスにはwidth=244
があり、もう1つのプロセスにはwidth=0
があります。通常、子プロセスは出力が0の行の場所をフェッチし、親プロセスは実際に行を出力します。常に使用されるわけではありませんが、すぐに行を読み取るよりも高速な場合があります。