0

トースト データなしでテーブルをダンプできるように、テーブルからトースト データを分離しようとしています。それを行う方法があるに違いないことは知っていますが、そこにたどり着くことができません...提案をいただければ幸いです

4

2 に答える 2

1

クエリオプションを指定してCOPY (またはpsqlの\ copy)を試してください。エクスポートする列を選択できます。タブ区切りではなく、CSV形式、ヌルの表現などを選択することもできます。

于 2012-06-21T08:12:49.283 に答える
0

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;
于 2012-06-21T09:04:17.487 に答える