20

jsonbPostgres 9.4 の Postgres フィールドに次のような値を保持して実験しています。

[{"event_slug":"test_1","start_time":"2014-10-08","end_time":"2014-10-12"},
 {"event_slug":"test_2","start_time":"2013-06-24","end_time":"2013-07-02"},
 {"event_slug":"test_3","start_time":"2014-03-26","end_time":"2014-03-30"}]

次のようなクエリを実行しています。

SELECT * FROM locations
WHERE EXISTS (
  SELECT 1 FROM jsonb_array_elements(events) AS e
  WHERE (
    e->>'event_slug' = 'test_1' AND
    (
      e->>'start_time' >= '2014-10-30 14:04:06 -0400' OR
      e->>'end_time' >= '2014-10-30 14:04:06 -0400'
    )
  )
)

上記のようなクエリで使用するために、そのデータにインデックスを作成するにはどうすればよいですか? これは、それぞれがその列に最大 10 個のイベントを含む数百万行の妥当な設計に思えますか?

私がまだシーケンシャルスキャンを取得しているように見えることに注意してください。

CREATE INDEX events_gin_idx ON some_table USING GIN (events);

私が推測しているのは、クエリで最初に行っていることは、データを json 配列要素に変換しているためです。

4

2 に答える 2

-1
CREATE INDEX json_array_elements_index ON
    json_array_elements ((events_arr->>'event_slug'));

あなたを正しい方向に向かわせるべきです。

于 2014-10-22T02:34:14.917 に答える