1

Postgres 9.3 を使用して JSON データを JSON 列に挿入/更新する大量の PLPGSQL コードがあります。

時間をかけてコードを変換して JSONB 形式に移行し、より優れたインデックス作成と新しい演算子を利用したいと考えています。

すべてのコードを書き直さずに新しい JSONB 形式を使用する方法はありますか?

たとえば、JSON を受け入れて返す多くの関数があります。粗い例です:-

FUNCTION foo(payload JSON) RETURNS JSON AS
$$
  BEGIN
  ...
  INSERT INTO baa(json, name) VALUES(payload, 'name');
  RETURN '{"message" : "done"}'::JSON

  END 
$$ LANGUAGE PLPGSQL;

私の理想は、関数を書き直すことなくjsonをjsonbにキャストするものです。挿入する前にこれを行うトリガー関数を試しましたが、postgres クエリ構文チェッカーが最初にそこに到達するため、これは機能しません:-

ERROR:  column "json" is of type jsonb but expression is of type json

私にできることは何もないので、すべてのコード (数千行) を書き直す必要があると思いますが、これを公開して、挿入時に CAST を実行できる賢いアイデアがあるかどうかを確認したいと思いました。 /更新して、書き直しのための時間を購入します。

4

1 に答える 1

2

jsonと の間に暗黙のキャストを導入するのは簡単jsonbですが、そうすべきではありません。煩わしいことではありますが、コードを適応させることは正しいことです。

その理由は、間jsonでキャストするとjsonb、パフォーマンスが大幅に低下するためです。PostgreSQL は、json を解析してハッシュ テーブルにするか、jsonb ハッシュ テーブルをフォーマットしてフラットな json テキストに戻す必要があります。大量のメモリ割り当て、大量のプロセッサ作業、大量の CPU キャッシュ チャーン。あなたはいつもそれをしたくありません。

また、セマンティックの違いもあります。特に、jsonbオブジェクト内のキーの順序を保持せず、重複キーを保持しません。jsonします。と同じsome_json_col :: jsonb :: jsonではありませんsome_json_col

適切なテキスト エディターと検索/置換を使用すると、大量のコードであっても作業が非常に簡単になります。編集の時間です。

于 2015-08-13T00:44:29.657 に答える