簡體   English   中英

使用 gin 索引的 postgresql jsonb 數組查詢

[英]postgresql jsonb array query using gin index

使用 postgresql 10.6。 我有一個名為place的表,其中包含一個 jsonb城市字段,其中包含一個 json 數組。 我創建了一個關於城市的杜松子酒指數。 城市 json 數組將有數萬條記錄。 我需要在 where 子句中查詢這個數組以獲取 5000 個城市名稱。 該查詢絕對應該使用 gin 索引來提高性能。 就我在執行計划中看到的而言,我在下面的小提琴示例查詢沒有使用索引。 應如何編寫此查詢以使用索引以使其快速運行。

表定義:

CREATE TABLE place (       
    cities jsonb NULL   
);

CREATE INDEX "IX_place_cities" ON place USING gin (cities);

INSERT INTO place
(cities)
VALUES('[{"name": "paris", "continent": "europe"},
{"name": "london", "continent": "europe"},
{"name": "berlin", "continent": "europe"},
{"name": "istanbul", "continent": "europe"},
{"name": "prag", "continent": "europe"},
{"name": "rome", "continent": "europe"},
{"name": "wien", "continent": "europe"},
{"name": "tokyo", "continent": "asia"},
{"name": "beijing", "continent": "asia"},
{"name": "dakar", "continent": "africa"},
{"name": "daresselam", "continent": "africa"},
{"name": "kuala lumpur", "continent": "asia"},
{"name": "barcelona", "continent": "europe"}]');

我的查詢:

select elems.arrayitem
FROM (
  select jsonb_array_elements(place.cities) as arrayitem 
  from place
) as elems
where elems.arrayitem @> '{"name": "paris"}' 
   or elems.arrayitem @> '{"name": "dakar"}'

SQLFiddle

一旦取消嵌套 JSON,就不能再使用索引。 我認為您正在尋找:

select jsonb_array_elements(p.cities) item
from place p
where p.cities @> '[{"name": "paris"}]'
   or p.cities @> '[{"name": "dakar"}]' 

或更明確地說:

select e.item
from place p
   cross join jsonb_array_elements(p.cities) as e(item)
where p.cities @> '[{"name": "paris"}]'
   or p.cities @> '[{"name": "dakar"}]' 

只有在表中有很多行(不是數組中的元素!)並且 WHERE 條件將許多行減少到一些時,才會使用 GIN 索引。

如果您將所有內容都存儲在一個巨大的 JSON 值中,那么沒有索引會改善您的查詢。 您應該規范化您的數據模型 - 這似乎很容易做到,因為您似乎沒有任何動態結構並且所有元素共享相同的鍵(=列)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM