トースト データなしでテーブルをダンプできるように、テーブルからトースト データを分離しようとしています。それを行う方法があるに違いないことは知っていますが、そこにたどり着くことができません...提案をいただければ幸いです
2 に答える
クエリオプションを指定してCOPY (またはpsqlの\ copy)を試してください。エクスポートする列を選択できます。タブ区切りではなく、CSV形式、ヌルの表現などを選択することもできます。
TOASTは、PostgreSQL がデータを内部的に保存する方法です。ユーザーとしては、データベースに委任して保持する値のみがあります。
TOAST は、タプルの属性のいずれかによってタプルのサイズが 8k を超える場合 (PostgreSQL がデフォルトのページ サイズでコンパイルされている場合)、主にテキスト データに対して使用されます。これは、ユーザーに対して透過的に DB エンジン内で発生します。たとえば、10k の記号を含むテキストを含む行を挿入すると、対応する属性が TOAST されます。
TOAST がどのように機能するかを考えると、あなたの質問は次のように見えます:データの大きなチャンクを含む属性なしでテーブルをダンプするにはどうすればよいですか? ダンプが不完全になるため、これの目的が何であるかは不明です。
編集:タプルの属性に TOASTed 値があるかどうかを確認する方法がわかりません。代わりに、TOAST 値を持つことができるすべての属性を削除します。
PLAIN
次のクエリは、常にストレージ モードであるテーブルのすべての列を提供します。
SELECT a.attname
FROM pg_class t
JOIN pg_attribute a ON t.oid = a.attrelid
JOIN pg_type typ ON typ.oid = a.atttypid
WHERE t.relkind='r' AND t.relname = 'element'
AND a.attnum > 0 AND NOT a.attisdropped
AND typ.typstorage='p'
ORDER BY a.attnum;
そして、このクエリは目的SQL
の を生成します。スクリプトまたは PL/pgSQL のEXECUTE
ステートメントにラップできます。
SELECT 'COPY '||quote_ident(t.relname)||
'('||string_agg(a.attname, ',' ORDER BY a.attnum)||') TO stdout;'
FROM pg_class t
JOIN pg_attribute a ON t.oid = a.attrelid
JOIN pg_type typ ON typ.oid = a.atttypid
WHERE t.relkind='r' AND t.relname = '<YOUR_TABLE>'
AND a.attnum > 0 AND NOT a.attisdropped
AND typ.typstorage='p'
GROUP BY t.relname;